2017-01-04 2 views
0

Я пытаюсь отправить файл csv в виде вложения с помощью простой функции в python 3.6.Отправка сообщения электронной почты через электронную библиотеку Python вызывает ошибку «ожидаемая строка или байтоподобный объект»

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 в виде вложения?

+0

Вы пытались добавить 'заголовок Content-Disposition' для вашей привязанности? 'msg.add_header ('Content-Disposition', 'attachment', filename = 'test.csv')' – Birne94

+0

Является ли это ошибкой копирования/вставки или вы на самом деле не имеете '' 'на' msg ['From'] = «тест @ gmail.com'? –

+0

Возможно [это] (http://stackoverflow.com/a/3363254/3220135) - это то, что вам нужно? – Aaron

ответ

0

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() 
+0

Это сработало отлично! Огромное спасибо. Я пробовал файл заголовка, но я приложил его неправильно. – MeesterTeem

Смежные вопросы