本文目录导读:

- 方法一:使用 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 方法最灵活且跨平台,适合大多数场景,建议使用 方法一 或 完整示例,它们兼具灵活性和易维护性。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播