2016-06-22 1 views
0

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

Проблема заключается в том, что часть тела конкатенируется с линией Subject. Если я не использую MIME-сообщение и просто строку, они будут правильно выделены. Но, тогда обычные строки не позволяют вложения изображений.

Любая библиотека, которую мне не хватает здесь?

Пожалуйста код ниже:

# -*- coding: utf-8 -*- 
""" 
Created on Tue Jun 14 20:08:00 2016 

@author: HOME 
""" 

import smtplib 
from email.mime.image import MIMEImage 
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 
import base64 
import time 
import datetime 

print str(datetime.datetime.now()) 


def send_mail(pwd): 

    password = base64.b64decode(pwd) 

    # in the prod system, ask the mail exchange server and port 

    server = smtplib.SMTP('smtp.gmail.com:587') 
    server.ehlo() 
    server.starttls() 

    server.login('[email protected]', password) 

    msg = MIMEMultipart() 

    body = "\nThe message body is this one. Thanks \n\n" 
    subject = "Your daily digest " + str(datetime.datetime.now()) 

    msg['From'] = "[email protected]" 
    msg['To'] = "[email protected]" 

    # I was hoping that creating a string in the subject should parse for newline and automatically pick the 2nd line onwards as body 
    # If I send mail using the commented code (line 46 t0 line 52), the subject and body are different. But I am unable to attach images 
    # but if i use the MIMEMultipart message , then i can attach images, but the body comes in the subject line 
    msg['Subject'] = "\r\n".join([subject,"",body]) 

    #msg.attach(MIMEText(body,'text')) 
    msg.preamble = 'Daily Updates' 
    """ 
    msg = "\r\n".join([ 
    "From: [email protected]", 
    "To: [email protected]", 
    "Subject: Daily digest " + str(datetime.datetime.now()), 
    "", 
    "Good Morning, How are you ? " 
    ]) 

    """ 
    # Image attachment code 
    fp = open("D://sample.png",'rb') 
    img = MIMEImage(fp.read()) 
    msg.attach(img) 

    print msg 
    #try: 
    server.sendmail('[email protected]','[email protected]',msg.as_string()) 
    print "Mail send successfully to [email protected]" 
    server.close() 
    #except: 
    # print "Mail not sent" 

if __name__ == '__main__': 
    pwd = base64.b64encode('howdy') 
    send_mail(pwd) 

ответ

0

Я надеялся, что создание строки в теме следует разобрать для перевода строки и автоматически выбрать 2-ую строку вперед, как тело

Нет таких гарантий сделаны в любом месте документации. Вы присоединяетесь к теме и телу и устанавливаете их как предмет, так что это то, что вы получаете.

Если я не использую сообщение MIME и только строку, они будут правильно отделяться. Но, тогда обычные строки не позволяют вложения изображений.

Я считаю, что это означает создание сообщения в виде строки вручную. Это означает, что вы построили его правильно, но это не имеет никакого отношения к тому, как работает Message object.

Чтобы включить тело в многочастном сообщении следовать examples:

from email.mime.text import MIMEText 

... 

msg.attach(MIMEText(body, 'plain')) 
0

Я создал yagmail, чтобы сделать это очень легко отправлять вложения.

import yagmail 
yag = yagmail.SMTP(username, password) 
yag.send(to="[email protected]", 
     subject="Daily digest " + str(datetime.datetime.now()), 
     contents="Good Morning, How are you ?", 
     attachments="D://sample.png") 

Для вводного чтения, пожалуйста, посмотрите here.

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