如何用脚本生成带图片的邮件

wen 实用脚本 2

本文目录导读:

如何用脚本生成带图片的邮件

  1. 方法一:使用 Python 的 smtplib + email 库(推荐)
  2. 方法二:使用 yagmail 库(更简洁)
  3. 方法三:使用 Outlook/SMTP 发送本地图片(Shell 脚本)
  4. 方法四:PowerShell 脚本(Windows)
  5. 关键注意事项
  6. 完整示例(带错误处理和配置分离)

生成带图片的邮件可以通过编写脚本(如 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 "邮件已发送"

关键注意事项

  1. SMTP 配置

    • QQ邮箱:smtp.qq.com:587(SSL/TLS)
    • Gmail:smtp.gmail.com:587
    • 163邮箱:smtp.163.com:25
  2. 密码安全

    • 使用应用专用密码(非邮箱登录密码)
    • 推荐使用环境变量存储敏感信息
  3. 图片大小

    • 内嵌图片一般建议 < 5MB
    • 过大图片可能导致发送失败或加载缓慢
  4. 图片路径

    • 确保图片文件存在且有读取权限
    • 可以使用绝对路径或相对路径

完整示例(带错误处理和配置分离)

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 方法最灵活且跨平台,适合大多数场景,建议使用 方法一完整示例,它们兼具灵活性和易维护性。

抱歉,评论功能暂时关闭!