如何通过python在邮件中添加多个嵌入式图像

2024-09-30 20:20:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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)

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

你能帮忙找出问题吗?在


Tags: fromimportselfdatetimeemaildeffilenameattach
3条回答

解决办法是:

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字符串;当Send()在多次调用AddImage()之后,将从html字符串生成的MIMEText附加到MIMEMultipart。在

这对我很有帮助。在

在我包含(循环)所有的<img src="cid:%s">使用msgAlternative.as_string()并修复了这个问题之后,我发现这有帮助。问题是它如何只包括第一个图像,现在关系到我包括了多少个图像。在

这段代码可以工作,但我也尝试在每个图像中添加文本,但我知道如何做到:

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

相关问题 更多 >