PHP页面显示图片正常,如何将其正确嵌入邮件正文?
搞定邮件内嵌图片这事儿我熟,给你两种靠谱的方案,分分钟解决你的问题!
正确嵌入图片到邮件正文的两种方案
方案一:CID(Content-ID)内嵌法(推荐)
这是邮件客户端支持最广泛的标准方法,原理是把图片作为邮件的「内嵌附件」,然后用唯一的CID在HTML正文中引用它,既不会被当成普通可下载附件,又能稳定显示。
具体步骤:
- 把图片添加为邮件的附件,但设置为内嵌资源(而非普通附件)
- 给图片分配一个唯一的CID(格式类似
<unique-id@your-domain.com>,只要保证在当前邮件里唯一就行) - 在HTML邮件正文中,用
<img src="cid:your-unique-id">引用这张图片
代码示例(Python为例):
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage # 创建带内嵌资源的邮件对象 msg = MIMEMultipart('related') msg['Subject'] = '带内嵌图片的测试邮件' msg['From'] = 'sender@example.com' msg['To'] = 'recipient@example.com' # HTML正文,通过CID引用内嵌图片 html_content = """ <p>这是内嵌的图片:</p> <img src="cid:my-custom-image-id" alt="我的图片"> """ msg.attach(MIMEText(html_content, 'html')) # 读取本地图片并添加为内嵌附件 with open('your-image-file.png', 'rb') as img_file: mime_img = MIMEImage(img_file.read()) # 设置图片的Content-ID,注意要保留尖括号 mime_img.add_header('Content-ID', '<my-custom-image-id>') # 标记为内嵌资源,避免被当成普通附件 mime_img.add_header('Content-Disposition', 'inline', filename='your-image-file.png') msg.attach(mime_img) # 发送邮件(根据你的SMTP服务器配置调整) with smtplib.SMTP('smtp.example.com', 587) as server: server.starttls() server.login('your-email-username', 'your-email-password') server.send_message(msg)
方案二:Base64编码直接嵌入
把图片转换成Base64字符串,直接嵌入到HTML的src属性里,不需要添加附件。这种方法适合小图标之类的小体积图片,缺点是部分旧版邮件客户端(比如Outlook 2016及更早版本)支持不佳,且会直接增大邮件体积。
示例代码片段:
import base64 # 读取图片并转换为Base64字符串 with open('small-icon.png', 'rb') as img_file: img_base64 = base64.b64encode(img_file.read()).decode('utf-8') # 直接在HTML中引用Base64编码内容 html_content = f""" <p>这是Base64嵌入的小图标:</p> <img src="data:image/png;base64,{img_base64}" alt="小图标" width="50"> """
避坑指南:
- 别直接引用网页图片URL:绝大多数邮件客户端会默认阻止加载外部资源,收件人大概率看不到图片
- 优先用PNG/JPG格式:SVG等小众格式很多客户端不支持,尽量避开
- 不同语言/库的细节:比如PHPMailer用
$mail->addEmbeddedImage('path/to/image.png', 'image-cid', 'image.png');,JavaMail需要把图片放到MimeMultipart("related")容器中
内容的提问来源于stack exchange,提问作者mvasco
相关产品推荐
相关产品推荐

