Gửi email Outlook với tệp đính kèm tới danh sách người dùng trong Excel bằng python

Aug 16 2020

Tôi có thể gửi email bằng cách sử dụng outlook với tập lệnh bên dưới, nhưng nếu tôi cố gắng gửi tệp đính kèm, nó sẽ báo lỗi.

Tên tệp_Email.xlsx

NAME    EMAIL
Roy     [email protected]
Jack    [email protected]

Tập lệnh Python

import win32com.client as win32
import pandas as pd

email_list = pd.read_excel(r'C:\Users\roy\Name_Email.xlsx')

names = email_list['NAME']
emails = email_list['EMAIL']

for i in range(len(emails)):
   name = names[i]
   email = emails[i]

   outlook = win32.Dispatch('outlook.application')
   mail = outlook.CreateItem(0)
   mail.To = email
   mail.Subject = 'Message subject'
   mail.Body = 'Hello ' + name
   attachment = "hosts.txt"
   mail.Attachments.Add(attachment)
   mail.Send()

lỗi tôi đang nhận được:

pywintypes.com_error: (-2147352567, 'Exception occurred.', (4096, 'Microsoft Outlook', 'Cannot find this file. Verify the path and file name are correct.', None, 0, -2147024894), None)

Tên tệp chính xác và nó nằm trong cùng thư mục với tập lệnh.

Ngoài ra, tôi đã cố gắng thay đổi tệp đính kèm = 'hosts.txt', nhưng cùng một lỗi. Không chắc chắn những gì còn thiếu.

Trả lời

1 SrinathNeela Aug 16 2020 at 21:00

thử cái này

from win32com.client import Dispatch
import win32com
import pandas as pd

def mailprepare():
    num = range(0, 5)
    for kk in num:
        outlook = win32com.client.Dispatch("Outlook.Application")
        for accoun in outlook.Session.Accounts:
            if accoun.SmtpAddress == '[email protected]':
                newaccount = accoun
                break
        mail = outlook.CreateItem(0)
        mail._oleobj_.Invoke(*(64209, 0, 8, 0, newaccount))
        data = pd.ExcelFile('D:\\path.xlsx')
        sheet = data.parse('Sheet1')
        name = sheet['Names'][kk]
        mailto = sheet['Mails'][kk]

        att = 'D:\\yourattchment.txt'
        with open(att, 'r') as my_attch:
            myfile=my_attch.read()

        mail.To = mailto
        mail.Subject = 'Subject'
        mail.Body = 'mail body'+ name
        mail.Attachments.Add(att)

        mail.Display(True)
        mail.send

mailprepare()
0m3r Aug 17 2020 at 08:25

Bạn chỉ cần gán hosts.txtcho một biến nhưng Attachments.Add đang tìm kiếm đường dẫn hệ thống tệp đầy đủ với tên tệp

Để sử dụng thư mục hiện tại

Thí dụ

import os
print(os.getcwd() + "\hosts.txt")

Hoặc là

import os

attachment = "hosts.txt"
print(os.path.realpath(attachment))

FYI - Tôi đang ở trên 3.8 python