本文目录导读:

- 方法一:使用 Python 的 smtplib + email 库(推荐)
- 方法二:使用 yagmail 库(更简洁)
- 方法三:使用 Outlook/SMTP 发送本地图片(Shell 脚本)
- 方法四:PowerShell 脚本(Windows)
- 关键注意事项
- 完整示例(带错误处理和配置分离)
生成带图片的邮件可以通过编写脚本(如 Python)实现,以下是几种常见方法,我会从最简单到最专业的方式排列:
使用 Python 的 smtplib + email 库(推荐)
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
def send_email_with_image():
# 邮件配置
sender = "your_email@example.com"
receiver = "receiver@example.com"
password = "your_password" # 建议使用应用专用密码
# 创建邮件对象
msg = MIMEMultipart()
msg['Subject'] = '带图片的测试邮件'
msg['From'] = sender
msg['To'] = receiver
# 方法1: 内嵌图片(推荐,图片显示在正文中)
# 先创建HTML正文,引用图片CID
html_content = """
<html>
<body>
<h2>这是一封带图片的邮件</h2>
<p>图片如下:</p>
<img src="cid:image1" alt="示例图片" width="500">
<p>邮件正文结束</p>
</body>
</html>
"""
html_part = MIMEText(html_content, 'html')
msg.attach(html_part)
# 添加图片附件(内联方式)
with open('example.jpg', 'rb') as f:
img = MIMEImage(f.read())
img.add_header('Content-ID', '<image1>') # 与HTML中的cid对应
img.add_header('Content-Disposition', 'inline', filename='example.jpg')
msg.attach(img)
# 方法2: 作为普通附件(图片显示为附件)
# with open('example.jpg', 'rb') as attachment:
# part = MIMEBase('application', 'octet-stream')
# part.set_payload(attachment.read())
# encoders.encode_base64(part)
# part.add_header('Content-Disposition',
# f'attachment; filename=example.jpg')
# msg.attach(part)
try:
# 连接SMTP服务器(以QQ邮箱为例)
server = smtplib.SMTP('smtp.qq.com', 587)
server.starttls()
server.login(sender, password)
server.sendmail(sender, receiver, msg.as_string())
print("邮件发送成功!")
except Exception as e:
print(f"发送失败: {e}")
finally:
server.quit()
# 调用函数
send_email_with_image()
使用 yagmail 库(更简洁)
import yagmail
def send_with_yagmail():
# 配置
yag = yagmail.SMTP(
user='your_email@example.com',
password='your_password', # 或应用专用密码
host='smtp.example.com'
)
# 发送带图片的邮件
yag.send(
to='receiver@example.com',
subject='带图片的邮件 - yagmail',
contents=[
'邮件正文文本',
yagmail.inline('example.jpg'), # 内嵌图片
'更多文本内容'
]
)
print("邮件已发送!")
# 安装:pip install yagmail
使用 Outlook/SMTP 发送本地图片(Shell 脚本)
Linux/Mac Bash 脚本:
#!/bin/bash
# 使用 mutt 或 mail 命令(需要安装)
# mutt 示例
echo "邮件正文" | mutt -s "测试邮件" \
-a "image.jpg" \
-- receiver@example.com
# 或者使用 mpack(更简单)
mpack -s "带图片的邮件" -d body.txt image.jpg receiver@example.com
PowerShell 脚本(Windows)
# 使用 .NET 的 SmtpClient
$smtpServer = "smtp.example.com"
$smtpFrom = "sender@example.com"
$smtpTo = "receiver@example.com"
$messageSubject = "带图片的邮件"
$messageBody = @"
<html>
<body>
<h2>测试邮件</h2>
<img src='cid:image1' />
</body>
</html>
"@
$smtp = New-Object Net.Mail.SmtpClient($smtpServer, 587)
$smtp.EnableSsl = $true
$smtp.Credentials = New-Object System.Net.NetworkCredential("username", "password")
$mailMessage = New-Object Net.Mail.MailMessage($smtpFrom, $smtpTo)
$mailMessage.Subject = $messageSubject
$mailMessage.Body = $messageBody
$mailMessage.IsBodyHtml = $true
# 添加内嵌图片
$imagePath = "C:\path\to\image.jpg"
$attachment = New-Object Net.Mail.Attachment($imagePath)
$attachment.ContentId = "image1"
$attachment.ContentDisposition.Inline = $true
$mailMessage.Attachments.Add($attachment)
$smtp.Send($mailMessage)
Write-Host "邮件已发送"
关键注意事项
-
SMTP 配置:
- QQ邮箱:
smtp.qq.com:587(SSL/TLS) - Gmail:
smtp.gmail.com:587 - 163邮箱:
smtp.163.com:25
- QQ邮箱:
-
密码安全:
- 使用应用专用密码(非邮箱登录密码)
- 推荐使用环境变量存储敏感信息
-
图片大小:
- 内嵌图片一般建议 < 5MB
- 过大图片可能导致发送失败或加载缓慢
-
图片路径:
- 确保图片文件存在且有读取权限
- 可以使用绝对路径或相对路径
完整示例(带错误处理和配置分离)
import os
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from dotenv import load_dotenv
# 从.env文件加载配置
load_dotenv()
def send_image_email(image_path='example.jpg'):
"""发送带内嵌图片的邮件"""
# 读取配置
SMTP_CONFIG = {
'host': os.getenv('SMTP_HOST', 'smtp.qq.com'),
'port': int(os.getenv('SMTP_PORT', 587)),
'user': os.getenv('SMTP_USER'),
'password': os.getenv('SMTP_PASSWORD')
}
# 检查图片是否存在
if not os.path.exists(image_path):
raise FileNotFoundError(f"图片文件不存在: {image_path}")
# 创建邮件
msg = MIMEMultipart('related')
msg['Subject'] = '自动发送的带图片邮件'
msg['From'] = SMTP_CONFIG['user']
msg['To'] = 'recipient@example.com'
# 构建HTML正文
html = """
<html>
<body style="font-family: Arial, sans-serif;">
<h1 style="color: #333;">测试邮件</h1>
<p>这是一封自动发送的带图片邮件</p>
<div style="margin: 20px 0;">
<img src="cid:myimage" style="max-width: 600px; border-radius: 8px;">
</div>
<p style="color: #666;">此邮件由系统自动发送</p>
</body>
</html>
"""
# 附加HTML
msg.attach(MIMEText(html, 'html'))
# 附加图片(内嵌)
with open(image_path, 'rb') as img_file:
img = MIMEImage(img_file.read())
img.add_header('Content-ID', '<myimage>')
img.add_header('Content-Disposition', 'inline', filename=os.path.basename(image_path))
msg.attach(img)
# 发送邮件
try:
with smtplib.SMTP(SMTP_CONFIG['host'], SMTP_CONFIG['port']) as server:
server.starttls()
server.login(SMTP_CONFIG['user'], SMTP_CONFIG['password'])
server.send_message(msg)
print("邮件发送成功!")
except Exception as e:
print(f"发送失败: {e}")
raise
# .env 文件内容示例:
# SMTP_HOST=smtp.qq.com
# SMTP_PORT=587
# SMTP_USER=your_email@qq.com
# SMTP_PASSWORD=your_app_password
if __name__ == '__main__':
send_image_email('chart_output.png')
选择哪种方法取决于你的技术栈和需求,Python 方法最灵活且跨平台,适合大多数场景,建议使用 方法一 或 完整示例,它们兼具灵活性和易维护性。