如何使用python在电子邮件中添加多个嵌入图像

时间:2017-12-29 09:27:10

标签: python image email

from email.MIMEMultipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.mime.text import MIMEText
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage
from datetime import datetime
import socket
import email
import smtplib
import uuid

class EmailSender:
def __init__(self):
    self.msgRoot = MIMEMultipart('related')
    self.msgAlternative = MIMEMultipart('alternative')
    self.msgRoot.attach(self.msgAlternative)

def AddImage(self, fileName, title):
    internalFileName = '%s-%s-%s' %(fileName, datetime.now().strftime('%Y%m%d%H%M%S'), uuid.uuid4())
    mimetext ='<p style="background-color:lightgrey;font-size:20px;font-weight:bold;font-family:Comic Sans MS">%s</p><br><img src="cid:%s"><br>' %(title, internalFileName)
    msgText = MIMEText(mimetext, 'html')
    self.msgAlternative.attach(msgText)
    fp = open(fileName, 'rb')
    msgImage = MIMEImage(fp.read())
    fp.close()
    msgImage.add_header('Content-ID', '<%s>' %(internalFileName))
    self.msgRoot.attach(msgImage)

def AddFile(self, fileName):
    fg = open(fileName, 'rb')
    fA = MIMEApplication(fg.read(), Name=fileName)
    fA['Content-Disposition'] = 'attachment; filename="%s"' %fileName
    self.msgRoot.attach(fA)

这是我将图像添加到结果电子邮件AddImage()的代码。但是当我多次调用AddImage()时,结果电子邮件中只显示第一个图像?

你能帮忙找到问题吗?

3 个答案:

答案 0 :(得分:2)

解决方案原来是:

def AddImage(self, fileName, title):
    internalFileName = '%s-%s-%s' %(fileName, datetime.now().strftime('%Y%m%d%H%M%S'), uuid.uuid4())
    self.imgHtml +='<p style="font-size:15px;font-weight:bold;font-family:Comic Sans MS">%s</p><br><img src="cid:%s"><br>' %(title, internalFileName)
    fp = open(fileName, 'rb')
    msgImage = MIMEImage(fp.read())
    fp.close()
    msgImage.add_header('Content-ID', '<%s>' %(internalFileName))
    self.msgRoot.attach(msgImage)
def Send(self, toList):
    msgText = MIMEText(self.imgHtml, 'html')
    self.msgAlternative.attach(msgText)
    self.msgRoot['Subject'] = 'Audience Ingestion Integrated Test Report @%s [%s]' %(datetime.now().strftime('%Y-%m-%d'), socket.gethostname())
    strFrom = 'notifier@freewheel.tv'
    self.msgRoot['From'] = strFrom
    strTo = email.Utils.COMMASPACE.join(toList)
    self.msgRoot['To'] = strTo
    smtp = smtplib.SMTP('smtp1.dev.fwmrm.net', 25)
    smtp.sendmail(strFrom, strTo, self.msgRoot.as_string())
    smtp.quit()

这意味着当AddImage()时,只需将MIMEImage附加到MIMEMultipart并将字符串添加到html字符串,并在多次调用AddImage()之后发送Send(),将从html字符串生成的MIMEText附加到MIMEMultipart

答案 1 :(得分:1)

此代码有效,但我也尝试在每个图像上添加文本,但idk怎么做:

home = str(Path.home())
path = home + "\\Pictures"
list_of_images = glob( os.path.join(path, "*.png") )

mail = MIMEMultipart("related")
#Jinja2 for html template

main = Template('''
    <html><body> 
    <h2>This is a Test email for python script</h2>
    <br />
    {% for image in pictures %}<p> $(name) </p><br /><img src="cid:{{image}}"><br />{% endfor %}
    </body></html>''')



for filename in list_of_images:
    fp = open(filename, 'rb')
    msg_img = MIMEImage(fp.read())
    fp.close()
    msg_img.add_header('Content-ID', '<{}>'.format(filename))
    msg_img.add_header('Content-Disposition', 'inline', filename=filename)
    mail.attach(msg_img)

mail['Subject'] = "Python Script Test | You will receive this email every 30 minutes"
mail['From'] = me
mail['To'] = you

答案 2 :(得分:0)

这对我很有帮助。

在我包含(循环)所有<img src="cid:%s">使用msgAlternative.as_string()之后,我发现有帮助,并解决了该问题。现在的问题是,它只包含第一张图像,现在影响到我包含多少张图像。