如何在smtplib发送的邮件中实现文本格式化(加粗/斜体等)?
问题根源
你用的ANSI转义序列是给终端输出设计的,邮件客户端根本不识别这些转义字符。要实现加粗、斜体、下划线、超链接这类富文本效果,必须把邮件改成HTML格式——这是所有主流邮件客户端都支持的标准方式。
具体修改方案
1. 补充导入必要模块
除了原有的smtplib、datetime,还要导入Python标准库的邮件处理模块:
from email.mime.text import MIMEText from email.header import Header
2. 修改Event类,生成HTML格式内容
用HTML标签替代ANSI转义序列来实现样式:
- 加粗:
<b>文本</b> - 斜体:
<i>文本</i> - 下划线:
<u>文本</u> - 超链接:
<a href="目标地址">显示文本</a>
修改后的Event类:
class Event(): def __init__(self, path): self.path = path self.time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') def __str__(self): # 处理路径转超链接:本地路径转file://协议,网络地址直接用原链接 if self.path.startswith(('http://', 'https://')): path_link = f'<a href="{self.path}"><u>{self.path}</u></a>' else: # Windows系统注意路径格式:file:///C:/xxx/xxx,Linux/macOS是file:///home/xxx/xxx formatted_path = self.path.replace('\\', '/') path_link = f'<a href="file:///{formatted_path}"><u>{self.path}</u></a>' # 把Time设为加粗,Path设为带下划线的超链接 return f'<p><b>Time:</b> {self.time} <b>Path:</b> {path_link}</p>'
3. 重写send_email函数,发送HTML邮件
不再手动拼接邮件头,用MIMEText对象规范构造HTML邮件,避免编码和格式问题:
def send_email(self, subject, to_addr, from_addr, content): # 把所有Event对象拼接成完整的HTML内容 body_html = ''.join(str(cnt) for cnt in content) # 构造HTML邮件实例,指定subtype为'html',编码为utf-8 msg = MIMEText(body_html, 'html', 'utf-8') # 设置邮件头,用Header处理中文避免乱码 msg['From'] = Header(from_addr, 'utf-8') msg['To'] = Header(to_addr, 'utf-8') msg['Subject'] = Header(subject, 'utf-8') server = smtplib.SMTP(self.host) # 如果你的SMTP服务器需要登录(比如QQ/163邮箱),取消下面注释并填入密码/授权码 # server.login(from_addr, '你的邮箱密码或授权码') # 支持多收件人:将逗号分隔的收件人字符串转成列表 server.sendmail(from_addr, to_addr.split(','), msg.as_string()) server.quit()
额外提示
- 你可以自由扩展HTML标签,比如用
<span style="color:red">设置文字颜色,用<h3>设置小标题,进一步美化邮件内容。 - 本地路径转超链接时,Windows系统要注意前缀是
file:///(三个斜杠),比如file:///C:/Users/xxx/Documents/test.txt。
内容的提问来源于stack exchange,提问作者Alex Rebell
相关产品推荐
相关产品推荐

