R生成的table.tableizer-table样式HTML邮件经MIMEText发送Gmail失效
问题原因
包括Gmail在内的绝大多数主流邮件客户端,都会主动过滤HTML中<style>标签定义的类选择器样式,仅支持直接写在元素上的行内样式(inline style),所以你在普通浏览器中正常渲染的类样式,发送到邮箱后会全部失效。
解决方法
方法1:用Python库自动转换CSS为行内样式(推荐)
不需要手动修改原有HTML,使用专门处理邮件HTML的premailer库,自动将所有类样式批量转换为对应元素的行内样式即可:
- 安装依赖:
pip install premailer
- 发送邮件前处理HTML字符串:
import smtplib, ssl from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from premailer import transform # 原有HTML处理,把内嵌CSS自动转成行内样式 processed_html = transform(one_email_html) message = MIMEMultipart("alternative", None, [MIMEText(processed_html, 'html')]) receiver = 'aaa@gmail.com' sender_email = 'bbb@gmail.com' print('Type in password') password = input() message["Subject"] = subject message["From"] = sender_email message["To"] = receiver # 创建加密连接发送邮件 context = ssl.create_default_context() with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server: server.login(sender_email, password) server.sendmail( sender_email, receiver, message.as_string() )
方法2:手动改写HTML为行内样式
如果不想额外安装依赖,也可以手动把所有样式直接写到对应标签的style属性中,示例如下:
- 原来的table标签修改为:
<table style="font-size: 12px;border: 1px solid #CCC;font-family: Arial, Helvetica, sans-serif;"> - 原来的td标签修改为:
<td style="padding: 4px;margin: 3px;border: 1px solid #CCC;"> - 其他类对应的样式同理,全部写入对应元素的style属性即可。
该方法仅适合HTML内容较少的场景,内容量大时建议使用方法1。
额外注意事项
- 不要在邮件HTML中使用外部CSS链接,邮件客户端会默认拦截外部资源加载
- 尽量使用基础CSS属性,邮件客户端的CSS支持度远低于普通浏览器,新特性大概率无法正常渲染
- 你提供的HTML代码中有多余的
</a>闭合标签,没有对应的<a>起始标签,建议顺便删除避免渲染异常
内容的提问来源于stack exchange,提问作者Yang
相关产品推荐
相关产品推荐

