已发送html电子邮件但未处理电子邮件正文中的图像

时间:2018-02-02 18:57:15

标签: python html

我在python中编写代码来发送电子邮件。我使用smtplib和mime来发送电子邮件和格式化内容。我将word文档转换为HTML以用作内容。以下邮件与文本一起发送,但图像未在邮件中处理。你有什么建议吗?我试图将图像嵌入到html中,但它不起作用。

import os
from docx import Document
import re
import smtplib
from email.message import EmailMessage
from docxtpl import DocxTemplate
import pyperclip
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from bs4 import BeautifulSoup
from string import Template
from email.mime.application import MIMEApplication
import glob
from email.mime.image import MIMEImage
from jinja2 import Template


with open('welcome_message.htm') as f:
    a=f.read()
soup=BeautifulSoup(a, 'lxml')
for div in soup.find_all('p', {'class':'delete'}):
    div.decompose()
with open('Aloitusmateriaalit.zip', 'rb') as f:
    part=MIMEApplication(f.read())
part['subject']='attachement'
part.add_header('Content-Disposition', 'attachment', filename=os.path.basename('Aloitusmateriaalit.zip'))
msg.attach(part)

word=['$PERSON_NAME','$FIRST_DATE','$ADDRESS','$PEER_ADVISOR','$SUPERVISOR']
target=soup.find_all(text=re.compile('|'.join(map(re.escape,word))))
for v in target:
    v.replace_with(v.replace('$PERSON_NAME', 'Duyen').
                   replace('$FIRST_DATE', 'Duyen').replace('$ADDRESS', 'Duyen'))
 = main.render(pictures=list_of_images)
part1=MIMEText(soup, 'html')
msg.attach(part1)
msg.add_header('Content-Disposition', 'attachment', filename='data.XLSX')
msg['Subject'] ='test email'
smtpObj = smtplib.SMTP('')
smtpObj.ehlo()
smtpObj.starttls()
smtpObj.login('xxxxx', 'xxxxx')
smtpObj.sendmail('xxxxx', 'xxxx', msg.as_string())
smtpObj.quit()

并且word文档看起来像这样https://1drv.ms/w/s!Anyt3NEJ2JjqgeJtFMRGug96QkYFqA(我删除了内容但不重要)因为重要的是图像没有显示出来。 我将docx保存为htm(welcome_message.htm),然后运行代码

2 个答案:

答案 0 :(得分:1)

我已经想出如何处理它。事实证明我们需要将图片附加到电子邮件中,然后使用图片名称更改html中的scr。

import os
from docx import Document
import re
import smtplib
from email.message import EmailMessage
from docxtpl import DocxTemplate
import pyperclip
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from bs4 import BeautifulSoup
from string import Template
from email.mime.application import MIMEApplication
import glob
from email.mime.image import MIMEImage
from jinja2 import Template

list_of_images = glob('*.png')
msg = MIMEMultipart()
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)
    msg.attach(msg_img)

with open('welcome_message.htm') as f:
    a=f.read()
soup=BeautifulSoup(a, 'lxml')
count=-1
for img in soup.findAll('img'):
    count+=1
    img['src'] = 'cid:' + os.path.basename(list_of_images[count])

for div in soup.find_all('p', {'class':'delete'}):
    div.decompose()
with open('Aloitusmateriaalit.zip', 'rb') as f:
    part=MIMEApplication(f.read())
part['subject']='attachement'
part.add_header('Content-Disposition', 'attachment', filename=os.path.basename('Aloitusmateriaalit.zip'))
msg.attach(part)

答案 1 :(得分:-1)

发布您的代码对我们非常有帮助。

HTML:是一种常用于发送具有丰富文本格式,图形等的电子邮件的标准。

MIME:是一种互联网标准,它扩展了电子邮件消息的格式,以支持非ASCII字符集,多部分消息以及音频,视频和图像等附件。

"Servers insert the MIME header at the beginning of any Web transmission. Clients use this content type or media type header to select an appropriate viewer application for the type of data the header indicates. Some of these viewers are built into the Web client or browser (for example, almost all browsers come with GIF and JPEG image viewers as well as the ability to handle HTML files)." - 维基百科,2018年(2月2日访问)。

如果网络客户端/浏览器无法处理例如,该怎么办?一个图像文件?接收者可能只接受纯文本消息!

要解决此问题,我们使用MIME多部分消息。因此,您需要了解如何正确使用MIME结构。通过构建具有两部分的根电子邮件消息(即其多部分消息),我们可以允许Web客户端或浏览器选择它想要显示哪些部分

我们将使用 MIME标准附加这些部分添加到根目录。我们还将消息内容附加到这两个部分的每个。然后处理按ID加载/查找引用的图像。然后我们必须发送消息。

让我们创建MIME部分。让这两部分中的一部分成为包含嵌入式图像和其他内容的更好的HTML消息,让另一部分只是纯文本消息

对于我们根电子邮件的纯文本组件,我们必须附上:

myPlainVar = MIMEText('plain text here')

然后,对于我们根电子邮件的更好的HTML组件,我们将再次附加

myHTMLVar = MIMEText('<b>My <i>HTML </i>stuff</b><br><img src="cid:embeddedImage">', 'html')

请注意,这次它包含HTML脚本标记和图像。您将需要使用pythons open()和MIME&#39; s MIMEImage()从您的目录中打开图像文件的代码。

您还需要根据分配给它的内容ID,使用.add_header('Content-ID', '<embeddedImage>')在HTML标记中定义嵌入的图片。

最后一步是发送电子邮件。

请参阅this recipethis question。祝你好运。