Tài khoản phiên Outlook python

Bài viết này được chia thành 2 phần, phần đầu tiên đề cập đến việc tạo hình ảnh/PDF từ excel và phần tiếp theo đính kèm phần tương tự trong email triển vọng và gửi nó đi. Nó cũng có một phần thưởng bổ sung về macro và xử lý các hộp thư khác nhau

Trong các hoạt động hàng ngày của chúng tôi, chúng tôi thường bắt gặp các nhiệm vụ liên quan đến việc gửi một lượng lớn thư từ, dự án này là kết quả của một yêu cầu như vậy.

Để bắt đầu, chúng tôi sẽ lưu ý các bước cần thiết cho quy trình tự động hóa này và sau đó cố gắng tự động hóa từng bước đó. Các bước cần thiết cho quá trình tự động hóa này như sau

1. Generate image/pdf from an excel.
2. Create an email with the image/pdf as an attachment.
3. Send out the emails from outlook.

Chà, điều này có vẻ đủ đơn giản, vì vậy hãy bắt đầu. Hiện tại, hãy cố gắng tập trung vào mã ở đây, tôi sẽ đính kèm ý chính GitHub ở cuối

Bước 1 — tạo hình ảnh/PDF

Chúng tôi có một excel chứa dữ liệu của tất cả các trận chiến của GOT và một biểu đồ đơn giản hiển thị số trận chiến theo khu vực. Trong bước này, mục tiêu của chúng tôi là tạo một tệp PDF/hình ảnh của biểu đồ bên dưới từ excel. Bạn có thể tải xuống excel từ đây

Biểu đồ mà chúng tôi sẽ sao chép dưới dạng hình ảnh

Trước tiên, chúng tôi sẽ kết nối với ứng dụng Excel và tải trang tính của mình, Python có nhiều tùy chọn để tạo các loại tệp Microsoft Office phổ biến bao gồm Excel, Word và PowerPoint. Tuy nhiên, trong một số trường hợp, có thể quá khó để sử dụng phương pháp python thuần túy để giải quyết vấn đề. May mắn thay, python có gói “Tiện ích mở rộng Python cho Windows” được gọi là pywin32 cho phép chúng tôi dễ dàng truy cập Mô hình đối tượng thành phần (COM) của Window và kiểm soát các ứng dụng của Microsoft thông qua python

xlApp = win32.DispatchEx('Excel.Application')
wb = xlApp.Workbooks.Open(file_location + filename)
ws = wb.Worksheets('Graph') # name of the sheet in which graph is present.

Khi đã xong, chúng tôi sẽ cung cấp tham chiếu ô của phần của trang tính mà chúng tôi muốn chuyển đổi thành hình ảnh. Các khả năng hình ảnh được cung cấp bởi gói PIL. Đoạn mã dưới đây sao chép tham chiếu ô dưới dạng hình ảnh vào khay nhớ tạm và lưu nó. Bạn có thể điều chỉnh chất lượng hình ảnh bằng cách sử dụng thông số ‘chất lượng’ và lưu ý rằng chất lượng hình ảnh chỉ áp dụng cho các tệp có định dạng JPEG. Chất lượng hình ảnh mặc định được đặt ở mức 75 và khi bạn tăng hoặc giảm giá trị này thì kích thước của hình ảnh sẽ thay đổi. Bạn có thể tham khảo tài liệu chính thức của thư viện PIL để biết chi tiết

win32c = win32.constants
ws.Range("B2:I16").CopyPicture(Format=win32c.xlBitmap) # give the cells for which you need the image
img = ImageGrab.grabclipboard()
img.save(file_location + 'Graph.jpeg',quality=55) # image quality and file size is directly linked

Cho đến nay chúng tôi đã lưu hình ảnh của chúng tôi. Bây giờ nếu bạn muốn chuyển hình ảnh sang pdf bạn có thể sử dụng thư viện img2pdf. Đoạn mã dưới đây đọc hình ảnh mà chúng tôi đã lưu ở trên và lưu nó dưới dạng PDF. Bạn có thể bỏ qua phần này nếu tất cả những gì bạn cần là một hình ảnh

#storing pdf path
pdf_path = file_location + "Graph.pdf"
#opening image
image = Image.open(image_path)
#converting into chunks using img2pdf
pdf_bytes = img2pdf.convert(image.filename)
#opening or creating pdf file
file = open(pdf_path, "wb")
#writing pdf files with chunks
file.write(pdf_bytes)
#closing image file
image.close()
#closing pdf file
file.close()

Sau khi hoàn thành bước này, chúng tôi có một hình ảnh và PDF

Đã tạo hình ảnh & PDF

Chúng tôi đã hoàn thành bước đầu tiên một cách lý tưởng, nhưng tôi muốn thêm một phần thưởng nhỏ. Thông thường, thay vì một excel thông thường, chúng tôi có một macro dựa trên macro và nhu cầu là chạy macro để làm mới dữ liệu trước khi chụp ảnh, điều đó cũng có thể. Tất cả những gì bạn cần biết là tên của macro để chạy. Đoạn mã dưới đây sẽ mở excel chạy macro đã chỉ định và lưu excel

xlApp = win32.DispatchEx('Excel.Application')
wb = xlApp.Workbooks.Open(file_location + filename)
# Give the proper macro name
xlApp.Application.Run("Module.Macroname")
wb.Save()
wb.Close()
xlApp.Application.Quit()

Bước 2— Tạo email

Chúng tôi sẽ sử dụng gói pywin32 giống như excel để kết nối với Outlook

outlook = win32.Dispatch('outlook.application')

Đây là một phần thưởng khác. Thường có nhu cầu gửi thư từ một hộp thư triển vọng cụ thể khi có nhiều id email được định cấu hình, chúng tôi sẽ giải quyết vấn đề đó tiếp theo. Nếu bạn muốn gửi thư từ hộp thư mặc định, bạn có thể bỏ qua bước này. Đoạn mã dưới đây sẽ lặp qua tất cả các tài khoản được định cấu hình của bạn và khi nó tìm thấy 'abc@mail. com’ nó sẽ gửi thư từ đó. Tuy nhiên, lưu ý rằng nếu nó không nhận được id thư được chỉ định, nó sẽ chỉ gửi thư từ id mặc định

sendfromAC = None
for oacc in outlook.Session.Accounts:
#give the mail id from which you want to send
if oacc.SmtpAddress == "[email protected]":
sendfromAC = oacc
break
##----------------------------------------------------------------

mail = outlook.CreateItem(0)

if sendfromAC:
mail._oleobj_.Invoke(*(64209, 0, 8, 0, sendfromAC))
##----------------------------------------------------------------

Đối tượng triển vọng của chúng tôi được tạo bây giờ, chúng tôi sẽ thêm To/CC/Subject và các tệp đính kèm. Đối với phần đính kèm, tôi sẽ chỉ ra 2 điều, đính kèm tệp PDF trong thư dưới dạng tệp và nhúng hình ảnh vào nội dung thư. Điều này sẽ bao gồm 2 trường hợp sử dụng

mail.To = '[email protected]'
mail.Cc = '[email protected];[email protected]'
mail.Subject = 'Demo Outlook Automation mail'

Đính kèm PDF

________số 8

Nhúng vào nội dung thư

Để nhúng hình ảnh vào nội dung email, trước tiên chúng tôi cần đính kèm hình ảnh đó dưới dạng tệp đính kèm thông thường và sau đó nhúng hình ảnh đó như một phần của nội dung thư HTML. Phần bên dưới đề cập đến việc đính kèm hình ảnh và đặt thuộc tính để triển vọng có thể xử lý hình ảnh đúng cách. Chúng ta sẽ đến ngay với phần nhúng

attachment1 = mail.Attachments.Add(file_location + 'Graph.jpeg')
attachment1.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001F", "Graph")

mail.HTMLBody = "<HTML lang='en' xmlns='http://www.w3.org/1999/xhtml' xmlns:o='urn:schemas-microsoft-com:office:office'> " \
+ "<head>" \
+ "<!--[if gte mso 9]><xml> \
<o:OfficeDocumentSettings> \
<o:Allowjpeg/> \
<o:PixelsPerInch>96</o:PixelsPerInch> \
</o:OfficeDocumentSettings> \
</xml> \
<![endif]-->" \
+ "</head>" \
+ "<BODY>"

Tiếp theo chúng ta phải tạo nội dung email. Bạn có thể đặt nội dung email ở định dạng văn bản bình thường hoặc ở định dạng HTML. Cá nhân tôi thích định dạng nội dung HTML hơn vì nó cho tôi nhiều quyền kiểm soát về cách hiển thị email thay vì để Outlook làm trọng tài. Đoạn mã dưới đây khá rõ ràng, nó sẽ đặt phần thân thư và 'cid' cuối cùng. Phần đồ thị sẽ nhúng hình ảnh đính kèm vào nội dung thư

xlApp = win32.DispatchEx('Excel.Application')
wb = xlApp.Workbooks.Open(file_location + filename)
ws = wb.Worksheets('Graph') # name of the sheet in which graph is present.
0

Bước 3 — Gửi thư

Bây giờ chúng ta đã có đối tượng thư sẵn sàng, tất cả những gì còn lại thực sự là gửi thư đi. Điều này sẽ được thực hiện bằng cách sử dụng lệnh đơn giản

xlApp = win32.DispatchEx('Excel.Application')
wb = xlApp.Workbooks.Open(file_location + filename)
ws = wb.Worksheets('Graph') # name of the sheet in which graph is present.
1

và hoan hô

Gửi mail

Toàn bộ ý chính GitHub được thêm vào bên dưới

Vấn đề đã biết

vấn đề 1

Rất hiếm khi xảy ra sự cố trong đó tập lệnh sẽ không thể kết nối với excel. Lỗi xảy ra giống như

xlApp = win32.DispatchEx('Excel.Application')
wb = xlApp.Workbooks.Open(file_location + filename)
ws = wb.Worksheets('Graph') # name of the sheet in which graph is present.
2

Giải pháp bắt nguồn từ URL StackOverflow này

các bước là

xlApp = win32.DispatchEx('Excel.Application')
wb = xlApp.Workbooks.Open(file_location + filename)
ws = wb.Worksheets('Graph') # name of the sheet in which graph is present.
3

Vấn đề 2

Sự cố này phổ biến hơn Sự cố 1, sau khi chạy được vài ngày, mã sẽ báo lỗi

xlApp = win32.DispatchEx('Excel.Application')
wb = xlApp.Workbooks.Open(file_location + filename)
ws = wb.Worksheets('Graph') # name of the sheet in which graph is present.
4

Giải pháp đã được đưa ra theo cách đánh và thử. các bước là

xlApp = win32.DispatchEx('Excel.Application')
wb = xlApp.Workbooks.Open(file_location + filename)
ws = wb.Worksheets('Graph') # name of the sheet in which graph is present.
5

Tôi thực sự không biết nguyên nhân gây ra những vấn đề này, Google rộng rãi đã không mang lại giá trị gì. Có vẻ như một số loại hỏng bộ đệm