ошибка при отправке электронной почты в python: объект 'bytes' не имеет атрибута 'encode' - PullRequest
0 голосов
/ 27 февраля 2019

Мне нужно отправить электронное письмо на python3, ниже приведен скрипт, и он завершился ошибкой:

У объекта 'bytes' нет атрибута 'encode'

import smtplib
from email.mime.text import MIMEText
from email.message import EmailMessage

att1 = [u'201902260920AM.log']
msg = MIMEText("EmailOperator testing email.")
msg['Subject'] = "EmailOperator testing email."
msg['From'] = "Airflow_Notification_No_Reply@company.Com"
msg['To'] = "pasle@company.com"

msg['files'] = str(att1).encode("UTF-8")

s = smtplib.SMTP('localhost')
s.send_message(msg)
s.quit()

Как правильно отправить электронное письмо с вложением?

Буду очень признателен, если кто-нибудь сможет меня здесь просветить, заранее спасибо.

ОБНОВЛЕНИЕ1: вы можете запустить приведенный выше код на python3 и получите сообщение об ошибке

ОБНОВЛЕНИЕ2:Действительно, файлы журналов, которые я хочу прикрепить, будут выглядеть примерно так: '/home/pasle/airflow/logs/pipeline_client1/send_email/2019-02-27T01:40:38.451894+00:00/1.log'

, и мне нужно отправлять электронные письма с несколькими вложениями, спасибо за вашу помощь.

1 Ответ

0 голосов
/ 27 февраля 2019
att1 = [u'201902260920AM.log']
msg = MIMEText("EmailOperator testing email.")
msg['Subject'] = "EmailOperator testing email."
msg['From'] = "Airflow_Notification_No_Reply@novantas.Com"
msg['To'] = "rxie@novantas.com"

msg['files'] = att1[0].encode("utf-8")

s = smtplib.SMTP('localhost')
s.send_message(msg)
s.quit()

Вероятно, это должно сработать.

Факт, что вы используете [u'ABC'], будет одноэлементным списком строк Unicode.

Таким образом, вам необходимо преобразовать список в одну строку Unicode, а затем преобразовать его в utf-8.

ОБНОВЛЕНИЕ:

import smtplib
from os.path import basename
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

files = ['/home/pasle/airflow/logs/pipeline_client1/send_email/2019-02-27T01:40:38.451894+00:00/1.log',
        '/home/pasle/airflow/logs/pipeline_client1/send_email/2019-02-27T01:40:38.451894+00:00/2.log']

msg = MIMEMultipart()
msg['From'] = 'Airflow_Notification_No_Reply@novantas.com'
msg['To'] = 'rxie@novantas.com'
msg['Subject'] = 'Email operator testing email.'
message = MIMEText('Email operator testing email body text.')
msg.attach(message)

for f in files:
    with open(f, "rb") as file:
        part = MIMEApplication(
            file.read(),
            Name=basename(f)
        )
    # After the file is closed
    part['Content-Disposition'] = 'attachment; filename="%s"' % basename(f)
    msg.attach(part)

gmail_sender = 'sender@gmail.com'
gmail_passwd = 'password'

server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.login(gmail_sender, gmail_passwd)

server.send_message(msg)
server.quit()

Когда я изучил вашу проблему, Attribute Error происходил из-за того, что msg не был объявлен как MIMEMultipart() метод.

...