Hướng dẫn how do i download outlook attachments from python? - làm cách nào để tải xuống tệp đính kèm triển vọng từ python?

import email
import imaplib
import os

class FetchEmail():

connection = None
error = None
mail_server="host_name"
username="outlook_username"
password="password"
self.save_attachment(self,msg,download_folder)
def __init__(self, mail_server, username, password):
    self.connection = imaplib.IMAP4_SSL(mail_server)
    self.connection.login(username, password)
    self.connection.select(readonly=False) # so we can mark mails as read

def close_connection(self):
    """
    Close the connection to the IMAP server
    """
    self.connection.close()

def save_attachment(self, msg, download_folder="/tmp"):
    """
    Given a message, save its attachments to the specified
    download folder (default is /tmp)

    return: file path to attachment
    """
    att_path = "No attachment found."
    for part in msg.walk():
        if part.get_content_maintype() == 'multipart':
            continue
        if part.get('Content-Disposition') is None:
            continue

        filename = part.get_filename()
        att_path = os.path.join(download_folder, filename)

        if not os.path.isfile(att_path):
            fp = open(att_path, 'wb')
            fp.write(part.get_payload(decode=True))
            fp.close()
    return att_path

def fetch_unread_messages(self):
    """
    Retrieve unread messages
    """
    emails = []
    (result, messages) = self.connection.search(None, 'UnSeen')
    if result == "OK":
        for message in messages[0].split(' '):
            try: 
                ret, data = self.connection.fetch(message,'(RFC822)')
            except:
                print "No new emails to read."
                self.close_connection()
                exit()

            msg = email.message_from_string(data[0][1])
            if isinstance(msg, str) == False:
                emails.append(msg)
            response, data = self.connection.store(message, '+FLAGS','\\Seen')

        return emails

    self.error = "Failed to retrieve emails."
    return emails

Mã trên hoạt động cho tôi để tải xuống tệp đính kèm. Hy vọng điều này thực sự hữu ích cho bất kỳ ai.

Tự động hóa với pywin32

Đơn giản hóa những thứ tẻ nhạt để giải phóng tâm trí của chúng ta.

Ảnh của Davide Baraldi trên unplash

Bạn đã ở vị trí mà bạn tìm kiếm qua hộp thư của mình để tải xuống tất cả các tệp đính kèm cần thiết chưa? Sau đó, có thể bạn rời đi và quay lại quên nơi bạn đã dừng lại? Có lẽ bạn vẫn phải lưu chúng vào các thư mục hoặc thư mục khác nhau sau đó?

Tôi đã ở vị trí đó trước đây. Đó là lý do tại sao tôi muốn tự động hóa quá trình tải xuống tệp đính kèm vào thư mục chính xác. Sau đó, thực hiện chuyển đổi sang tệp đính kèm email.

Trong bài viết này, tôi sẽ so sánh các thư viện Python có thể cho giải pháp và chia sẻ cách tôi tự động hóa quá trình với Python.

So sánh các thư viện Python để truy cập hộp thư

Hình ảnh được tạo bởi tác giả

Smtplib không phải là một trong những lựa chọn trong trường hợp của tôi, vì chỉ có khả năng gửi email, trong khi Imaplib yêu cầu tên người dùng và mật khẩu không thuận lợi. Do đó, tôi đã chọn pywin32.

Sử dụng pywin32 để tải xuống các thư cụ thể từ Outlook

Không có tài liệu chính thức cho PYWIN32 có sẵn. Hiện tại, chúng tôi chỉ có thể tham khảo tham chiếu của Outlook Mailitem trong Visual Basic cho ứng dụng (VBA) để tìm hiểu về các chức năng có sẵn để thao tác hộp thư và thư. Sau đó, ví dụ không thể được sử dụng trực tiếp khi bạn đang viết kịch bản trong Python. Ngoài ra còn có một số ví dụ ứng dụng tốt của PyWin32 trên các trang web viết kỹ thuật khác nhau, nhưng chúng không hoàn thành.

Bài viết này bao gồm tất cả các nội dung cơ bản bạn cần biết để sử dụng pywin32 để truy cập hộp thư Outlook của bạn.

  1. Nhập các mô -đun

Bước đầu tiên.

# pip install pywin32  #if you not installed yet
import win32com.client

2. Thiết lập kết nối với Outlook

# set up connection to outlook
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

3. Một số phương pháp / thuộc tính cơ bản về thao tác qua mailitem

(1) Truy cập vào hộp thư đến.

inbox = outlook.GetDefaultFolder(6)# for sub folder, add <.folder("your folder name")>
inbox = outlook.GetDefaultFolder(6).folders("Testing")

6 là chỉ số của hộp thư đến. Chỉ số của các mục phổ biến khác như dưới đây.

3 Deleted Items
4 Outbox
5 Sent Items
6 Inbox
16 Drafts

Bạn có thể kiểm tra chỉ mục của các thư mục khác bằng cách sử dụng mã nguồn bên dưới. (Tham khảo C2)

import win32com.client
outlook=win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
for i in range(50):
try:
box = outlook.GetDefaultFolder(i)
name = box.Name
print(i, name)
except:
pass

(2) Đọc email

# Access to the email in the inbox
messages = inbox.Items
# get the first email
message = messages.GetFirst()
# get the last email
#message = messages.GetLast()
# to loop thru the email in the inbox
while True:
try:
print(message.subject) # get the subject of the email
# if you use messages.GetFirst() earlier
message = messages.GetNext()
# if you use messages.GetPrevious() earlier
#message = messages.GetPrevious()
except:
# if you use messages.GetFirst() earlier
message = messages.GetNext()
# if you use messages.GetPrevious() earlier
#message = messages.GetPrevious()

Ví dụ trên cho thấy cách in chủ đề của tất cả các email trong hộp thư đến. Khác với chủ đề, có các thuộc tính khác mà chúng ta có thể in hoặc sử dụng làm tiêu chí để xác định một tuyên bố có điều kiện. Dưới đây cho thấy một số thuộc tính chung.

message.subject
message.senton # return the date & time email sent
message.senton.date()
message.senton.time()
message.sender
message.SenderEmailAddress
message.Attachments # return all attachments in the email

Lưu ý rằng

# pip install pywin32  #if you not installed yet
import win32com.client
0 hoặc
# pip install pywin32  #if you not installed yet
import win32com.client
1 kết thúc bằng một cặp dấu ngoặc đơn đang đề cập đến một phương pháp chúng ta có thể sử dụng để thao tác hộp thư, trong khi
# pip install pywin32  #if you not installed yet
import win32com.client
2 hoặc
# pip install pywin32  #if you not installed yet
import win32com.client
3 đang đề cập đến các thuộc tính của email và nó không nhạy cảm với trường hợp khi bạn sử dụng Python . Do đó, bạn có thể tham khảo tài liệu của mailitem trong VB có thể được tìm thấy trong tham chiếu C1 ở phía dưới, cho danh sách thuộc tính hoàn chỉnh của MailItem. (Tôi đã thử tất cả, nhưng hầu hết trong số đó có thể được áp dụng.)

(3) Tải xuống một tệp đính kèm email.

attachments = message.Attachments# return the first item in attachments
attachment = attachments.Item(1)
# the name of attachment file
attachment_name = str(attachment).lower()
attachment.SaveASFile(path+ '\\' + attachment_name)

4. Hoàn thành ví dụ

# import libraries
import win32com.client
import re
# set up connection to outlook
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items
message = messages.GetFirst()
today_date = str(datetime.date.today())
while True:
try:
current_sender = str(message.Sender).lower()
current_subject = str(message.Subject).lower()
# find the email from a specific sender with a specific subject
# condition
if re.search('Subject Title',current_subject) != None and re.search(sender_name,current_sender) != None:
print(current_subject) # verify the subject
print(current_sender) # verify the sender
attachments = message.Attachments
attachment = attachments.Item(1)
attachment_name = str(attachment).lower()
attachment.SaveASFile(path + '\\' + attachment_name)
else:
pass
message = messages.GetNext() except:
message = messages.GetNext()
exit

Trên đây là ví dụ hoàn chỉnh để tải xuống một email từ một người gửi cụ thể với một tiêu đề cụ thể vào một đường dẫn cụ thể. Bạn có thể thay đổi điều kiện theo tình huống của bạn, ví dụ, bạn có thể sử dụng

# pip install pywin32  #if you not installed yet
import win32com.client
4 để có được email nhận được vào ngày được xác định. Ngoài ra, bạn có thể sử dụng câu lệnh IF-Else để lưu các tệp đính kèm trong các thư mục khác nhau, điều này khá tiện dụng khi bạn sẽ tải xuống rất nhiều tệp đính kèm.

Một số ghi chú bên

Nếu bạn quan tâm đến cách sử dụng

# pip install pywin32  #if you not installed yet
import win32com.client
5 để tự động hóa Báo cáo Microsoft Excel, bạn có thể tham khảo bài viết này, Tự động hóa Excel với Python.

Nếu bạn quan tâm để tạo biểu đồ hoặc pivotchart với Python và tự động chia sẻ nó dưới dạng tệp đính kèm email, hãy tự động hóa biểu đồ Excel với Python.

Xin chúc mừng và cảm ơn vì đã đọc đến cuối cùng. Hy vọng bạn thích bài viết này. ☺

Ảnh của Kevin Butz trên unplash