python2.6.x/python3发送邮件,并在正文中显示附件中的图片

直接在HTML邮件中链接图片地址是不行的。引文大部分邮件服务商都会自动屏蔽带有外链的图片,因为不知道这些链接是否指向恶意网站。
只需要在HTML中通过

方式一:引用src="cid:0"就可以把附件作为图片嵌入了。如果有多个图片,给它们依次编号,然后引用不同的cid:x即可。

Q: 使用方式一在苹果邮件客户端会出现A1的邮件图片,会替换A2的邮件图片;

方式二:

读取图片并添加邮件头
fp = open(imgpath, 'rb')
msgImage = MIMEImage(fp.read())
fp.close()

# Define the image's ID as referenced above
msgImage.add_header('Content-ID', '<image{count}>'.format(count=i))
msgRoot.attach(msgImage)
解决方式一中出现的问题;

# -*- coding:utf-8 -*-
import smtplib
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header

class EmailMsg():
    def sendMail(self, msg):
     
        # 邮件对象:
        message = MIMEMultipart()
        message.attach(MIMEText(msg, 'html', 'utf-8'))
        # 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
        # message = MIMEText(msg, 'html', 'utf-8')

        message['from'] = '[email protected]'
        message['to'] = '[email protected]'
        password = "123456"
        message['subject'] = Header(u'公众号消息', 'utf-8').encode()
        smtp_server = "smtp.163.com"
        server = smtplib.SMTP(smtp_server, 25)  # SMTP协议默认端口是25
        # 打印出和SMTP服务器交互的所有信息。
        # server.set_debuglevel(1)
        # 登录SMTP服务器
        server.login(message['from'], password)

        # 添加附件就是加上一个MIMEBase,从本地读取一个图片:
        with open('./img/00_00.jpg', 'rb') as f:
            # 设置附件的MIME和文件名,这里是png类型:
            mime = MIMEBase('image', 'jpg', filename='timg.jpg')
            # 加上必要的头信息:
            mime.add_header('Content-Disposition', 'attachment', filename='test.png')
            mime.add_header('Content-ID', '<0>') //如果有多个文件需要使用.format(index)
            mime.add_header('X-Attachment-Id', '0') //如果有多个文件需要使用.format(index)
            # 把附件的内容读进来:
            mime.set_payload(f.read())
            # 用Base64编码:
            encoders.encode_base64(mime)
            # 添加到MIMEMultipart:
            message.attach(mime)
        # 发邮件,由于可以一次发给多个人,所以传入一个list;
        # 邮件正文是一个str,as_string()把MIMEText对象变成str。
        server.sendmail(message['from'], [message['to']], message.as_string())
        server.quit()

if __name__ == '__main__':
    em = EmailMsg()
    em.sendMail('''<html lang="en">
    <body>
    <h1>附件中的图片</h1>
    <img src="cid:0">
    <img src="cid:1">
    <img src="cid:2">
        ....
    </body>
    </html>''')

猜你喜欢

转载自blog.csdn.net/liaonanfeng88/article/details/84941921
今日推荐