Как отправить файл .html по электронной почте с помощью smtplib в Python

Я использую Jupyter для создания отчетов в формате html, и я хотел бы иметь возможность отправлять эти отчеты по электронной почте с помощью smtplib. Мне удалось успешно отправить электронные письма, но я не смог получить отчет в формате html, чтобы прикрепить его или встроить в электронное письмо.

Код, который я использовал, выглядит так...

fromaddr = "[email protected]"
toaddr = "[email protected]"

msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "Automatic Weekly Report"

html = open("WeeklyReport.html")
part2 = MIMEText(html.read(), 'text/html')
msg.attach(part2)

server = smtplib.SMTP('smtp.gmail.com',587)
server.starttls()
server.login("[email protected]", "password")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()

Я думаю, что проблема в основном связана со средним битом, который я взял и изменил с https://docs.python.org/3.4/library/email-examples.html

html = open("WeeklyPnlReport.html")
part2 = MIMEText(html.read(), 'text/html')
msg.attach(part2)

Когда я запускаю этот код, я получаю электронное письмо, которое я открываю в Gmail, оно пустое и имеет вложение под названием «noname». Предварительный просмотр не работает, а загрузка приводит к тому, что мой компьютер не знает, каким файлом его открыть.

Если я изменю средний бит на:

part2 = MIMEText(html.read(), 'html')

Я получаю электронное письмо с надписью «сообщение вырезано», затем, когда я нажимаю «просмотреть все сообщение», открывается новая вкладка, содержащая html-текст отчета.

Если я бегу с:

part2 = MIMEText(html, 'html')

Я получаю сообщение об ошибке "Объект '_io.TextIOWrapper' не имеет атрибута 'encode'".

Я в настоящее время совсем потерял о том, что делать. По сути, я просто хочу, чтобы отчет в формате html был либо прикреплен к моему электронному письму, либо находился внутри электронного письма. Я просмотрел документацию MIMEText, но она довольно скудная и довольно сложная для меня. Я хотел бы узнать больше о том, как это работает, а точнее о том, как получить html-файл для встраивания в электронное письмо или прикрепления к нему.

Заранее спасибо.


person Stuart Robertson    schedule 13.04.2018    source источник


Ответы (1)


Не указывайте основной тип контента, указывайте только второстепенный: не text/html, а html:

part2 = MIMEText(html.read(), 'html')  # Note: no "text/"

Вам не нужно сообщение multipart, если вы не отправляете несколько частей.

Если вы используете multipart, укажите второстепенный тип контента. Составной тип по умолчанию — multipart/mixed. Вам может понадобиться multipart/alternative:

msg = MIMEMultipart('alternative')

Это может сработать для вас:

from email.mime.text import MIMEText
import smtplib


fromaddr = "[email protected]"
toaddr = "[email protected]"


html = open("WeeklyReport.html")
msg = MIMEText(html.read(), 'html')
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "Automatic Weekly Report"

debug = False
if debug:
    print(msg.as_string())
else:
    server = smtplib.SMTP('smtp.gmail.com',587)
    server.starttls()
    server.login("[email protected]", "password")
    text = msg.as_string()
    server.sendmail(fromaddr, toaddr, text)
    server.quit()
person Robᵩ    schedule 13.04.2018
comment
Привет Роб, спасибо за ваш ответ и извините за поздний ответ. Это действительно прояснило, как работает весь smtplib. Кажется, это проблема либо с моим компьютером, либо с тем, как настроен мой gmail, потому что я мог заставить его работать на компьютере друга. Я все еще пытаюсь найти решение, как заставить его работать на моем компьютере, и опубликую, как только разберусь! - person Stuart Robertson; 23.05.2018