2016-06-22 4 views
0

Dies ist ein seltsames Problem, das mich seit den letzten 2 Tagen nervt. Ich schrieb eine einfache Mail-Funktion, die smtplib verwendet, um E-Mails mit Bild als Anhang zu senden.Der Versuch, eine Mail mit Hilfe von smtplib in Python zu senden. Mail Körper kommt mit Betreff Zeile

Das Problem ist der Körperteil wird mit der Betreffzeile verkettet. Wenn ich keine MIME-Nachricht und nur eine Zeichenfolge verwende, werden sie korrekt getrennt. Aber normale Zeichenketten erlauben keine Bildanhänge.

Irgendwelche Bibliothek, die ich hier vermisse?

Bitte den Code unten:

# -*- 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) 

Antwort

0

Ich hatte gehofft, dass eine Zeichenfolge in das Thema zu schaffen für Newline analysieren sollte und wählen automatisch die zweite Linie ab als Körper

keine solchen Garantien sind überall in der Dokumentation gemacht. Sie verbinden das Subjekt und den Körper und stellen sie als das Subjekt ein, also erhalten Sie das.

Wenn ich keine MIME-Nachricht und nur eine Zeichenfolge verwende, werden sie korrekt getrennt. Aber normale Zeichenketten erlauben keine Bildanhänge.

Ich meine dies bedeutet, eine Nachricht als String manuell zu erstellen. Das heißt, Sie haben es richtig gebaut, aber das hat nichts damit zu tun, wie die funktioniert.

, um den Körper in die mehrteilige Nachricht umfassen die examples folgen:

from email.mime.text import MIMEText 

... 

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

I yagmail erstellt es sehr einfach zu machen Anlagen zu senden.

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") 

Für einen Einführungs lesen, haben Sie bitte einen Blick here.

Verwandte Themen