python发送带附件的邮件;python调用windows系统通知
有个同事需要定期发送邮件给老板,邮件内容基本上固定,附件来自电脑上固定的路径,于是我写了个程序,发送邮件出去,并将指定目录下的第一个文件作为附件。
核心知识点:python发送带附件的邮件;python调用windows系统通知。
# 帮助丁方硕发送外汇周报邮件的程序,执行后会将一段文本和指定目录下的某个文件作为附件发送邮件出去 # 核心知识点:发送带附件的邮件,调用win10系统通知 import os import smtplib from email.header import Header from email.mime.application import MIMEApplication from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from plyer import notification to_list = ['test1@urovo.com', 'test2@urovo.com'] # 收件人列表 cc_list = ['test3@urovo.com', 'test4@urovo.com'] # 抄送人列表 to_list_test = ['test5@qq.com'] # 测试用的收件人列表 cc_list_test = ['test6@aliyun.com'] # 测试用的抄送人人列表 # 登录邮箱,需要知道邮箱登录地址及对应的端口号25 smtp = smtplib.SMTP() smtp.connect("smtp.exmail.qq.com", "25") # 邮箱登录地址,及端口号 smtp.login("abc@urovo.com", "123456") # 邮箱账号,及密码 # 以上代码也可以写成如下带SSL加密的形式: # smtp = smtplib.SMTP_SSL(host="smtp.exmail.qq.com", port=465) # smtp.login("abc@urovo.com", "123456") # 准备邮件内容 msg = MIMEMultipart() msg['From'] = 'abc@urovo.com' # 设置发件人 msg['To'] = ';'.join(to_list) # 设置收件人,使用join函数将列表用;号隔开 msg['Cc'] = ';'.join(cc_list) # 设置抄送人,使用join函数将列表用;号隔开 msg['Subject'] = '资金部上周外汇周报' # 设置邮件标题 msg.attach(MIMEText('郭总、刘总:<br><p>上周外汇周报已出,请过目。</p>', 'html', 'utf-8')) #设置邮件文本 try: filepath = 'C:\\Users\\Lenovo\\Desktop\\美元周报邮件发送\\' filepath_test = 'D:\\newfolder\\' attach_file = MIMEApplication(open(filepath + (os.listdir(filepath))[0], 'rb').read()) #访问filepath目录下的第一个文件,以只读形式打开,此处rb如果省略,当文件名或文件内容存在中文时,会报编码错误 attach_file['Content-type'] = 'application/octet-stream' attach_file.add_header('Content-Disposition', 'attachment', filename=Header((os.listdir(filepath))[0], 'utf-8').encode()) # 设置header信息,设置附件文件名称,其中文件名要用Header(filename,'utf-8').encode()来进行解码,否附件文件名会显示乱码 msg.attach(attach_file) # 添加附件 smtp.sendmail('abc@urovo.com', to_list + cc_list, msg.as_string()) # 发送邮件 # 调用windows自带的系统通知,需要在库引用里面增加from plyer import notification # 调用该系统通知时,如果用pyinstaller打包成exe文件,打包命令末尾应加上一句--hidden-import plyer.platforms.win.notification,打包命令示例如下: # pyinstaller -F -w script.py --hidden-import plyer.platforms.win.notification # 如果打包时不加这句,那么打包后的exe文件运行时就会报“NotImplementedError: No usable implementation found!”错误 notification.notify( title='邮件发送成功', # 设置通知标题 message='外汇周报邮件发送成功', # 设置通知内容 app_icon=None, # 设置通知图标 timeout=15, # 设置通知持续时间 ) except Exception as e: notification.notify( title='邮件发送失败', message='请联系管理员检查程序:\n' + str(e), app_icon=None, timeout=15, ) smtp.quit() # 退出邮箱,这一步很重要不能省略