Отправка электронной почты через электронную библиотеку Python вызывает ошибку "ожидаемая строка или байтовый объект",
Я пытаюсь отправить файл csv в виде вложения с помощью простой функции в python 3.6.
from email.message import Message
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
def email():
msg = MIMEMultipart()
msg['Subject'] = 'test'
msg['From'] = '[email protected]'
msg['To'] = '[email protected]'
msg.preamble = 'preamble'
with open("test.csv") as fp:
record = MIMEText(fp.read())
msg.attach(record)
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.login("[email protected]", "password")
server.sendmail("[email protected]", "[email protected]", msg)
server.quit()
Вызов email()
вызывает ошибку expected string or bytes-like object
. Переопределение server.sendmail("[email protected]", "[email protected]", msg)
как server.sendmail("[email protected]", "[email protected]", msg.as_string())
вызывает отправку электронного письма, но отправляет файл csv в тело письма, а не как вложение. может ли кто-нибудь дать мне несколько указателей на то, как отправить файл csv в виде вложения?
Ответы
Ответ 1
1) Вы должны использовать msg.as_string()
, если вы вызываете smtplib.SMTP.sendmail()
. Альтернативно, если у вас есть Python 3.2 или новее, вы можете использовать server.send_message(msg)
.
2) Вы должны добавить тело к своему сообщению. По дизайну никто никогда не видит преамбулу.
3) Вы должны использовать content-disposition: attachment
, чтобы указать, какие части являются вложениями и которые являются встроенными.
Попробуйте следующее:
def email():
msg = MIMEMultipart()
msg['Subject'] = 'test'
msg['From'] = 'XXX'
msg['To'] = 'XXX'
msg.preamble = 'preamble'
body = MIMEText("This is the body of the message")
msg.attach(body)
with open("test.csv") as fp:
record = MIMEText(fp.read())
record['Content-Disposition'] = 'attachment; filename="test.csv"'
msg.attach(record)
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.login("XXX", "XXX")
server.sendmail("XXX", "XXX", msg.as_string())
server.quit()