centos 7 中发邮件很简单,只需要配置好参数,使用mail 命令就可以了,但是在python中发邮件还是比较麻烦的;
为了解决这个问题,本文编写了一个简单实用的python邮件发送函数,用法类似linux中的mail命令,支持添加各种类型的附件,支持抄送,正文支持html页面。
本文主要使用python 的email.mime模块中的一些功能来实现,email是个功能很强大的模块,此处不展开说明,只利用其编写一个简单的发邮件函数
详细代码如下图
def SendMail(to_receivers=[],cc_receivers=[], subject='', file_name=[], content='正文无内容'): ''' 用来发送邮件,没有做异常判断,需要的可以自己优化 :parm to_receivers 收件人的邮箱,最少1个人,可填多个,类型为list :parm cc_receivers 抄送人的邮箱,可不填,也可填多个,类型为list :subject 邮件主题,必填,类型为字符串 :file_name 附件的名称,可不填,类型为list :content 邮件正文,必填,可以是html代码,类型为字符串 ''' import smtplib from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText ################################################## # 发邮件账号相关配置 sender = '****此处填写发件账号' password = '***此处填写密码***' smtp_address = 'smtp.exmail.qq.com' # 此处填写自己账号对应的smtp服务器 smtp_port = '465' # 填写端口 ################################################## receivers = to_receivers + cc_receivers # 全部人 # 定义邮件正文 textApart = MIMEText(content, 'html', 'utf-8') # 添加附件: 任何资源都可以添加 # 第1行使用 MIMEApplication 这个类读取资源文件,结果赋值给动态变量expandApart # 第2行将已读取的资源(动态变量expandApart)添加到头部 if len(file_name) >= 1: for i in range(len(file_name)): exec("expandApart_{0}=MIMEApplication(open(r'{1}', 'rb').read())".format(i, file_name[i])) exec("expandApart_{0}.add_header('Content-Disposition', 'attachment', filename=r'{1}')".format(i, file_name[i])) # 将定义的正文和附件添加到主题中 msg = MIMEMultipart() msg.attach(textApart) # 添加正文 if len(file_name) >= 1: for i in range(len(file_name)): exec("msg.attach(expandApart_{0})".format(i)) # 逐个添加附件 # 定义邮件主题等 msg['Subject'] = subject # 主题 msg['From'] = sender # 发件人 # 收件人,此处必须是字符串,要用join转化 ; 但是sendmail 中必须用数组 msg['TO'] = ','.join(to_receivers) if len(cc_receivers) > 0: # 若抄送人未被定义,则不添加进邮件 msg['Cc'] = ",".join(cc_receivers) msg['Accept-Language'] = 'zh-CN' msg['Accept-Charset'] = 'ISO-8859-1,utf-8' try: s = smtplib.SMTP_SSL(smtp_address, smtp_port) s.login(sender, password) s.sendmail(sender, receivers, msg.as_string()) s.quit() return 'success' except smtplib.SMTPException as e: return e if __name__ == "__main__": #使用举例 import os # 指定目录,就可以不用带绝对路径 os.chdir(r"C:\Users\good\Desktop") filename = [r'aaaa.doc', r'test.xlsx', r'11111.png'] # 也可以使用绝对路径,但是文件名也会包含该路径 filename += [r'C:\Users\good\Desktop\无标题.xlsx'] cc = ['[email protected]', '[email protected]'] # 抄送人 to = ['[email protected]'] # 收件人 subject = '测试1' # 主题 # 正文 content = ''' <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> <h1>欢迎访问草结笔记 https://caojie.blog </h1> <h2>邮件测试</h2> </body> ''' status = SendMail(to_receivers=to, cc_receivers=cc, subject=subject, content=content) print(status)
代码执行后,查看邮箱,已经成功收到邮件。
收件人、抄送、附件 都正常。
需要注意的是,当使用绝对路径添加附件后,附件名亦为绝对路径,且不同的邮件客户端显示的名称都不一样。
所以一般不推荐这么用。