如何使用Python exchangelib在Outlook邮件中发送HTML表格?解决HTML内容显示为纯文本问题及MIME配置方法
问题原因&解决方案
我帮你梳理下邮件显示为纯文本的原因,以及在exchangelib里正确配置HTML邮件的方法:
为什么HTML内容显示成纯文本?
你当前的代码里,创建Message时直接把HTML内容传给了body参数,但exchangelib默认会把body解析为纯文本格式。这就导致邮件的Content-Type被设置成了text/plain,Outlook收到后只会把你的HTML代码当作普通文字展示,不会去渲染成表格。
最简单的修复方法:指定HTML格式
只需要在创建Message的时候,加上body_type='HTML'这个参数,明确告诉exchangelib你传入的是HTML内容:
email_message = Message( account=self._account, subject=self._subject_prefix + self._mail_subject, body=email_body, body_type='HTML', # 关键:添加这一行 to_recipients=recipients, cc_recipients=self._cc_mail )
添加这个参数后,exchangelib会自动帮你设置正确的Content-Type为text/html,Outlook就能正常渲染你的表格了。
进阶:自定义MIME结构(含MIME版本和Content-Type配置)
如果需要更精细的控制(比如同时提供纯文本备用版本、自定义MIME头部等),可以手动构建MIME邮件对象,再传给Message的mime_content参数:
from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText def send_mail(self, send_to=email_config.to_mail): try: self._to_mail = email_config.to_mail if len(email_config.cc_mail): self._cc_mail=email_config.cc_mail if self._to_mail is None: raise ReportException(ErrorLevel.ERROR, DeliveryErrors.MailRecipientNotSet) recipients = self.prepare_recipient_list(self._to_mail) email_html = self.create_template() # 准备纯文本备用内容,兼容不支持HTML的邮件客户端 email_plain = "这里是纯文本版本的内容,如果收件端不支持HTML会显示这个" # 构建MIME多部分邮件 mime_msg = MIMEMultipart('alternative') # 设置邮件主题、发件人、收件人 mime_msg['Subject'] = self._subject_prefix + self._mail_subject mime_msg['From'] = self._account.primary_smtp_address mime_msg['To'] = ', '.join(self._to_mail) if self._cc_mail: mime_msg['Cc'] = ', '.join(self._cc_mail) # 自定义MIME版本(可选,默认就是1.0) mime_msg['MIME-Version'] = '1.0' # 添加纯文本和HTML部分 plain_part = MIMEText(email_plain, 'plain', 'utf-8') html_part = MIMEText(email_html, 'html', 'utf-8') mime_msg.attach(plain_part) mime_msg.attach(html_part) # 添加附件(如果有的话) if self._attachment_file is not None: email_attachment = self.get_attachment() mime_msg.attach(email_attachment) # 创建exchangelib Message并发送 email_message = Message( account=self._account, mime_content=mime_msg.as_string() ) email_message.send() except Exception as e: print(e)
这种方式下,你可以完全掌控邮件的MIME结构,包括设置MIME版本、Content-Type(每个MIMEText对象会自动设置对应的Content-Type)等。
额外小提示
Outlook对HTML/CSS的兼容性有点挑剔,你当前代码里用的ID选择器#customers大概率能正常显示,但如果遇到渲染问题,可以尝试把CSS样式内联到每个表格元素上(比如直接给<td>、<th>加style属性),这样兼容性会更好。
内容的提问来源于stack exchange,提问作者Aaditya R Krishnan
相关产品推荐
相关产品推荐

