由于需要用到发送正文内容是表格的邮件,之前用直接写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"')
使用上面的全部代码,发送的邮件为这样的