Python使用email.message模块无法在邮件正文插入图片问题咨询
Python email模块嵌入图片到邮件正文的解决方案
你当前代码的问题在于HTML中直接引用了本地路径的图片文件,收件人的邮件客户端无法访问你本地设备上的图片资源,因此只会加载alt提示文本。要实现图片内嵌到正文,需要通过CID(Content-ID)关联内嵌的图片资源,改用MIME多部分结构来构造邮件即可,具体实现代码如下:
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage def send_email(From, to_email, passw, img_path="image_name.jpg"): # 构造多部分消息容器,subtype设为related来关联HTML和内嵌资源 msg = MIMEMultipart('related') msg['Subject'] = "subject" msg['From'] = From msg['To'] = to_email password = passw # HTML正文中img的src用cid: + 自定义的资源ID来引用 body = """ <p>Text blabla </p> <img src="cid:embedded_img" alt="loading problem" width=400 height=560> """ # 添加HTML正文部分 msg.attach(MIMEText(body, 'html', 'utf-8')) # 读取本地图片并构造MIMEImage对象 with open(img_path, 'rb') as f: img = MIMEImage(f.read()) # 给图片设置Content-ID,和HTML中的cid对应,注意需要包裹尖括号 img.add_header('Content-ID', '<embedded_img>') # 设置为内联资源,不会被识别为附件 img.add_header('Content-Disposition', 'inline', filename=img_path.split('/')[-1]) msg.attach(img) s = smtplib.SMTP('smtp.gmail.com: 587') s.starttls() s.login(msg['From'], password) s.sendmail(msg['From'], [msg['To']], msg.as_string()) s.quit() print('Email sent')
关键说明
- 必须使用
multipart/related类型的消息容器,才能同时承载HTML内容和内嵌的关联资源 - 图片的Content-ID取值需要和HTML中
cid:后面的标识严格对应,设置Content-ID时必须包裹尖括号 - 图片路径建议使用绝对路径,避免相对路径读取文件失败
- 若使用Gmail发信,需要先开启账号的两步验证,再生成专用的应用密码用于登录,无法直接使用账号原密码登录SMTP服务
内容的提问来源于stack exchange,提问作者Jack Sullivan
相关产品推荐
相关产品推荐

