Электронная почта не отправляет приложение Excel - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь разослать электронные письма с вложениями различным получателям, хранящимся в CSV-файле. Моя цель - отправить получателям соответствующее вложение, которое хранится в указанном c месте.

CSV выглядит так

Name,Emails,Firm
Tom,tom@fakedomian.com,Firm1
Dick,dick@fakedomain.com,Firm2
Harry,harry@fakedomain.com,Firm3

Внутри папки вложения будут выглядеть так

path='C:\\Documents\\Firms'

В этом месте файлы будут выглядеть следующим образом

Firm1.xlsx
Firm2.xlsx
Firm3.xlsx

В следующем коде имя и адрес электронной почты в csv используются для отправки персонализированного электронного письма при просмотре папки в прикрепите соответствующий файл Excel.

import email, csv, smtplib, ssl, fnmatch, os, codecs

from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import fnmatch

path = 'C:\\Documents\\Firms'
email_html = open('email.html')
body = email_html.read()


from_address = "youremail@domain.com"
password = input("Type your password and press enter: ")

#context = ssl.create_default_context()
with smtplib.SMTP("smtp.office365.com", 587) as server:
    server.ehlo()
    server.starttls()
    server.login(from_address, password)
    with open("Firms.csv") as file:
        reader = csv.reader(file)
        next(reader)
        for Name, Email, Firm in reader:
            # Create a multipart message and set headers
            message = MIMEMultipart()
            message["From"] = from_address
            message["To"] = Email
            message["Subject"] = 'Test ' +  Name

            #Add body to email and excel attachment

            message.attach(MIMEText(body, "html"))

            for i in os.listdir(path):
                if os.path.isfile(os.path.join(path,i)) and Firm in i:
                    with open(os.path.join(path, i), 'rt', encoding='ISO-8859-1') as attachment:
                        part = MIMEBase("application", "octet-stream")
                        part.set_payload(attachment.read())

                        encoders.encode_base64(part)

                        part.add_header(
                        "Content-Disposition",f"attachment; filename= {Firm}",)

                    message.attach(part)
                    text = message.as_string()

                    # Use server to send email
                    server.sendmail(from_address, Email, text.format(name=Name))

Хотя при этом отправляются электронные письма, вложения не в формате Excel. Когда я использовал кодировку = 'utf8', я получал бы следующую ошибку

UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 18: character maps to <undefined>

Любая помощь здесь будет высоко ценится.

1 Ответ

0 голосов
/ 13 марта 2020

Сначала убедитесь, что import base64. Затем попробуйте прочитать файл в двоичном режиме. В частности,

with open(os.path.join(path, i), 'rb') as attachment:

Затем вы можете прочитать содержимое файла, закодировать его в base64, а затем установить его как полезную нагрузку части, например:

part.set_payload(base64.b64encode(attachment.read()))

Конечно, удалите следующую строку (encoders.encode_base64(part)), я думаю, encoders все равно не рекомендуется.

Я считаю, что это должно сработать.

...