使用 python 将 excel table 复制并格式化为 outlook 正文

Copy and format excel table to outlook body using python

我正在尝试发送一封 outlook 电子邮件,其中包含粘贴在 outlook 电子邮件正文中的 excel 文件的内容。 我只能使用smtplib

我使用了下面显示的 中的代码

import csv
from tabulate import tabulate
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
me = 'user2@org.com'
server = 'internal-server:25'
you = 'user1@org.com'
text = """
Hello, Friend.

Here is your data:

{table}

Regards,

Me"""

html = """
<html><body><p>Hello, Friend.</p>
<p>Here is your data:</p>
{table}
<p>Regards,</p>
<p>Me</p>
</body></html>
""" 
with open('input.csv') as input_file:
    reader = csv.reader(input_file)
    data = list(reader)
text = text.format(table=tabulate(data, headers="firstrow", tablefmt="grid"))
html = html.format(table=tabulate(data, headers="firstrow", tablefmt="html"))
message = MIMEMultipart(
    "alternative", None, [MIMEText(text), MIMEText(html,'html')])
message['Subject'] = "Your data"
message['From'] = me
message['To'] = you
server = smtplib.SMTP(server)
server.ehlo()
server.sendmail(me, you, message.as_string())
server.quit()

但是,它打印 table 如下(没有 table 网格线和格式)

我希望我的输出如下所示(作为 table 而不是 outlook 正文中的图像)

您可能希望将 border=1 属性添加到 table HTML 元素。可悲的是,tabulate 不支持这样的事情。添加 border 属性的一种方法是跳过 tabulate.tabulate 并编写您自己的 table 格式化程序,如下所示:

def html_tabulate(table):
    table_it = iter(table)
    result = []
    result.append("<table border=1>")
    result.append("<thead>")
    headers = next(table_it)
    result.append("<tr><th>" + "</th><th>".join(headers) + "</th></tr>")
    result.append("</thead>")
    for row in table_it:
        result.append("<tr><td>" + "</td><td>".join(row) + "</td></tr>")
    result.append("</table>")
    return "\n".join(result) 

然后在为电子邮件创建 HTML 时使用新函数:

html = html.format(table=html_tabulate(data))