我的知识记录

Python发送HTML格式邮件 排版美化教程

用Python smtplib发送HTML格式邮件,支持加粗、颜色、表格、按钮等富文本排版,比纯文本邮件更专业,附完整代码。

场景痛点

纯文本邮件干巴巴,领导看着没质感。发周报、营销通知、活动邀请时,想要加粗标题、配色、表格、按钮,用Python拼一段HTML发出去,效果跟网页邮件一模一样,不用再去第三方邮件平台排版。

用到的库

smtplib、email都是标准库。

# 无需安装

完整代码

# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header

SMTP_SERVER = "smtp.qq.com"
SMTP_PORT = 465
SENDER = "your_account@qq.com"
AUTH_CODE = "your_smtp_auth_code"
RECEIVER = "receiver@example.com"


def send_html_email():
# 1. 写一段HTML,邮件正文支持大部分常用标签
html = """
<html>
<body>
<h2 style="color:#1677ff;">本周工作周报</h2>
<p>你好,以下是本周关键数据:</p>
<table border="1" cellpadding="6" cellspacing="0"
style="border-collapse:collapse;">
<tr style="background:#f0f5ff;">
<th>指标</th><th>本周</th><th>环比</th>
</tr>
<tr><td>新客户数</td><td>128</td><td>+12%</td></tr>
<tr><td>成交金额</td><td>56万</td><td>+8%</td></tr>
</table>
<p style="margin-top:20px;">
请点击<a href="https://example.com/report">查看完整报表</a>
</p>
</body>
</html>
"""

# 2. 关键:第二参数用"html"而不是"plain"
msg = MIMEText(html, "html", "utf-8")
msg["From"] = Header(f"周报机器人 <{SENDER}>", "utf-8")
msg["To"] = Header(RECEIVER, "utf-8")
msg["Subject"] = Header("【周报】本周业务数据概览", "utf-8")

# 3. 登录发送
server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
server.login(SENDER, AUTH_CODE)
server.sendmail(SENDER, [RECEIVER], msg.as_string())
server.quit()
print("HTML邮件发送成功")


if __name__ == "__main__":
send_html_email()

代码讲解

  • MIMEText(html, "html", "utf-8"):关键就是第二参数从plain改成html,邮件客户端会按HTML渲染。
  • 邮件里写HTML建议用内联样式(style属性),因为Outlook、QQ邮箱对<style>块和外部CSS支持很差。
  • 表格、颜色、超链接、加粗都能正常显示;但JavaScript、外部JS、iframe一律不支持。
  • 复杂模板可以从公司已有HTML邮件里把代码复制过来,改变量即可。

运行结果

收件人收到一封排版好的邮件,标题蓝色,表格有边框,链接可点击。在网页邮箱和手机客户端都能正常渲染。

注意事项

  • 不要在HTML里用<script>,邮箱客户端会直接过滤,还可能触发垃圾箱。
  • 邮件HTML兼容性最好用table布局,不要用div+flex,Outlook会把布局打乱。
  • 想同时兼容不支持HTML的老客户端,可以用MIMEMultipart("alternative")同时附plain和html两个版本。
  • 链接域名要跟发件邮箱域名一致,否则容易被判垃圾邮件。

Python发送HTML格式邮件 排版美化教程

标签:

更新时间:2026-09-14 21:05:47

上一篇:Python发送邮件多个附件 一次打包发送

下一篇:Python发送邮件带附件完整示例