Попытка отправить письмо с помощью smtplib в python. Тело письма сопровождается строкой темы

Это странная проблема, которая беспокоит меня последние 2 дня. Я написал простую функцию отправки почты, которая использует smtplib для отправки писем с изображением в качестве вложения.

Проблема в том, что часть тела присоединяется к строке 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)

person ForeverLearner    schedule 22.06.2016    source источник


Ответы (2)


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

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

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

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

Чтобы включить тело в составное сообщение, следуйте примерам:

from email.mime.text import MIMEText

...

msg.attach(MIMEText(body, 'plain'))
person Ilja Everilä    schedule 22.06.2016

Я создал 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")

Для вводного ознакомления, пожалуйста, загляните здесь.

person PascalVKooten    schedule 22.06.2016