python 发送正文表格邮件

由于需要用到发送正文内容是表格的邮件,之前用直接写html表格的方法,后面发现维护起来异常麻烦,所以找了最简单的一种办法,以此记录。
需要使用到pandas包

import pandas as pd
from email.mime.text import MIMEText
import smtplib

def send_html_text(subject, msg_text, to_recipients, cc=None, bcc=None):
    """发送html邮件
    :param subject: 邮件主题
    :param msg_text: 邮件内容 (纯文本)
    :param to_recipients: 收件人
    :type to_recipients: list
    配置SMTP服务器
    :param email_address: 邮箱地址
    :param password: 邮箱密码
    :param smtp_host: SMTP服务器
    :param smtp_port: SMTP端口
    :type smtp_port: int
    """
    port = 465
    host = 'smtp.exmail.qq.com'
    pwd = 'pwd'
    if not isinstance(to_recipients, list):
        raise TypeError('to_recipients类型不正确,需要是list类型。')

    if cc is not None and not isinstance(cc, list):
        raise TypeError('cc类型不正确,需要是list类型。')

    if bcc is not None and not isinstance(bcc, list):
        raise TypeError('bcc类型不正确,需要是list类型。')

    sender = '**@company.com.cn'

    msg = MIMEText(msg_text, "html", "utf-8")
    msg['Subject'] = subject
    msg['From'] = sender
    msg['To'] = ','.join(to_recipients)
    if cc is not None:
        msg['Cc'] = ','.join(cc)
    if bcc is not None:
        msg['Bcc'] = ','.join(bcc)
    if port == 465:
        server = smtplib.SMTP_SSL(host, port)
    elif port == 587:
        server = smtplib.SMTP(host, port)
        server.starttls()
    elif port == 25:
        server = smtplib.SMTP(host,port)
    else:
        raise Exception('端口号不是25, 465, 587. 程序退出!')
    server.login(sender, pwd)
    to_emails = to_recipients
    if cc is not None:
        to_emails = to_recipients + cc
    if bcc is not None:
        to_emails = to_emails + bcc
    server.sendmail(sender, to_emails, msg.as_string())
    server.quit()

# titles = ['UF_KBN','RCV_NUM','MAKER_CD','PRODUCT_CD','QUANTITY','BU']
data = [['S','K47263','ECAL','TP31C','20','21X2'],
        ['Q','K47263','ECAL','TP31C','20','21X2']]
table1 = pd.DataFrame(data)
# table1.style.set_table_styles(**{'border': '1px','cellspacing':'0','cellpadding':'3'})
# table1.style.clear()
# print(table1)
#
# print(table1)
styles = [{'selector': 'tbody td',
           'props': [('border', '1px solid black'),
                     ('font-size', '17px'),
                     ('text-align', 'center'),
                     ('width', '120')]}
          ]
# html1 = table1.to_html(index=False,header=False)
table1 = table1.style.hide_index().hide_columns().set_table_styles(styles)
table1.set_table_attributes('cellspacing="0" cellpadding="3" border="1px solid black"')
print(type(table1))
html1 = table1.to_html()
print(html1)
send_html_text('test', '这是一份测试邮件\n'+ html1, ['**@company.com.cn'],bcc=['***@c.com.cn'])

在此说明下,发送邮件的账号配置,我这用的是企业邮箱,host为smtp.exmail.qq.com,对应的端口号为465,使用其他邮箱的可以查找对应的host和端口号。

titles = [‘UF_KBN’,‘RCV_NUM’,‘MAKER_CD’,‘PRODUCT_CD’,‘QUANTITY’,‘BU’]
data = [[‘S’,‘K47263’,‘ECAL’,‘TP31C’,‘20’,‘21X2’],
[‘Q’,‘K47263’,‘ECAL’,‘TP31C’,‘20’,‘21X2’]]
table1 = pd.DataFrame(data)

data为需要发送的表格数据,此处使用pandas将list转换为DataFrame表格,借助pandas的强大功能,可以直接将表格转换为Html,然后发送。
此处的titles为列名,若需要列名,可以在转DataFrame时,将列名加入

table1 = pd.DataFrame(data,columns=titles)

!!!如果此刻直接将table1转为html格式,则发送的表格可能会有一些不足,发送的样式如下图
在这里插入图片描述
默认发出的是这种双框的格式,所以要加入一些css样式来使得表格符合要求。

styles = [{‘selector’: ‘tbody td’,
‘props’: [(‘border’, ‘1px solid black’),
(‘font-size’, ‘17px’),
(‘text-align’, ‘center’),
(‘width’, ‘120’)]}
]
table1 = table1.style.hide_index().hide_columns().set_table_styles(styles)
table1.set_table_attributes(‘cellspacing=“0” cellpadding=“3” border=“1px solid black”’)

此处style可以加入一些css样式,此style样式是针对表中内容的样式,使用set_table_styles方法,
而set_table_attributes则是对表格的属性进行一些添加。
在这里插入图片描述
!!!注意,如果要同时使用set_table_styles和set_table_attributes,务必先使用set_table_styles,并将table1重新赋值为Styler,试了好久发现,原来table是DataFrame格式,经过下面的样式加入后,table变成了Styler格式了,而set_table_attributes只能在Styler里使用,并且如果在set_table_styles之前使用,则set_table_attributes会失效,不知道这是为啥,有关于pandas的set_table_styles用法和CSS样式的就不多说了,比较复杂,记录不完,也不是很熟悉这块。

table1 = table1.style.hide_index().hide_columns().set_table_styles(styles)
table1.set_table_attributes('cellspacing="0" cellpadding="3" border="1px solid black"')

使用上面的全部代码,发送的邮件为这样的
在这里插入图片描述

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你可以使用Python中的email和smtplib库来发送带有表格邮件。下面是一个示例代码: ```python import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication import pandas as pd # 读取表格数据 df = pd.read_excel('table.xlsx') # 将表格转换为HTML格式 html = df.to_html() # 创建带有附件的消息对象 msg = MIMEMultipart() msg['Subject'] = '带有表格邮件' msg['From'] = 'sender@example.com' msg['To'] = 'recipient@example.com' # 将HTML内容添加到消息正文中 body = MIMEText(html, 'html') msg.attach(body) # 将表格作为附件添加到消息中 filename = 'table.xlsx' with open(filename, 'rb') as f: attachment = MIMEApplication(f.read(), _subtype='xlsx') attachment.add_header('Content-Disposition', 'attachment', filename=filename) msg.attach(attachment) # 发送邮件 smtp_server = 'smtp.example.com' smtp_port = 587 smtp_username = 'sender@example.com' smtp_password = 'password' with smtplib.SMTP(smtp_server, smtp_port) as smtp: smtp.starttls() smtp.login(smtp_username, smtp_password) smtp.send_message(msg) ``` 在上面的代码中,我们首先使用pandas库将表格读入到DataFrame对象中,然后使用to_html()方法将其转换为HTML格式。接下来,我们创建了一个带有附件的消息对象,并将HTML内容添加到消息正文中。最后,我们将表格作为附件添加到消息中,并使用smtplib库发送邮件。 请注意,上述代码中的SMTP服务器、端口、用户名和密码需要根据你的实际情况进行更改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值