Python:如何方便地用Python发outlook邮件
背景
单位有自动定时邮件需求,而Windows自带的定时任务不好用,不灵活,于是自己用Python写。
重点库
- outlook邮件库:exchangelib
- 定时跑批的库:schedule
完整源码
https://gitee.com/sheep431/Automail
实现方法
- 造一个发送邮件的通用函数exchangelib
- 每一个邮件任务单独形成一个函数,调用exchangelib发送邮件,对发送配置项进行配置。
- 造一个运行用py文件,用schdule实现轮询调用各邮件任务函数。
- 对于需要月初月末等特定日期发送的邮件,为了方便实现添加了计算月末日期和前一个业务日期的函数。
诀窍
- 比较麻烦的是HTML富文本形式的邮件如何正确配置内容。有一个很方便的方法就是发一个相同内容的邮件到网络邮箱,然后直接复制相应的HTML到自己的代码中作为发送的content部分。
- 没有条件做1的话,直接Outlook桌面程序右键选择查看源文件也可以参考。
- Outlook的嵌入img src不能直接引用本地文件,而是必须将img作为attachment放到相应邮件中后,以cid(outlook中的资源名称引用),其实挺合乎逻辑的。
def send_no_cellphone_notice():from Code.sendMail_exchange import exg_send_mailto_address = "xyy@cn.test.jp"cc_address = "wk@cn.test.jp"subject = "No cellphone notice"attachments = ["resource/img/no_phone.PNG"]content = '''<img src="cid:no_phone.PNG" data-custom="AAMkAGU2NWNjZmZjLTNkY2UtNGFiYy1iZjM1LTEzYjMxM2Q1MTFjZgBGAAAAAAAAjMjoipm6R4cG0fcoVRy2BwDwmmOI0ecmRKvtnTObaXr8AAAAAAEMAADwmmOI0ecmRKvtnTObaXr8AACdbEhiAAABEgAQAHsL%2BbbVnmFEjpMdUhKs8T4%3D" naturalheight="601" naturalwidth="459" src="service.svc/s/GetFileAttachment?id=AAMkAGU2NWNjZmZjLTNkY2UtNGFiYy1iZjM1LTEzYjMxM2Q1MTFjZgBGAAAAAAAAjMjoipm6R4cG0fcoVRy2BwDwmmOI0ecmRKvtnTObaXr8AAAAAAEMAADwmmOI0ecmRKvtnTObaXr8AACdbEhiAAABEgAQAHsL%2BbbVnmFEjpMdUhKs8T4%3D&X-OWA-CANARY=DgcknvBpZ0u31fE3APHxKPCNG2-8YtkIu036BMDdmIzO-2okMHUTQmRT7IkcKZoBzJyRhMId15Y.&isImagePreview=True" width="459" height="601" id="x_图片_x0020_1" style="">'''auth = "wk@cn.test.jp"exg_send_mail(to_address,cc_address,subject,content,attachments,auth)
上述代码其实在发送邮件部分我自己进行了封装,exg_send_mail是我写的通用函数,直接将png文件同时放在attatchment和正文中即可嵌入。
通用函数内容如下,更多详细内容可以参考我的github资源
def exg_send_mail(mail_addr, cc_addr, subject, htmlBody, attchmentList,auth="Robot"):from exchangelib import DELEGATE, Account, Credentials, Message, Mailbox, HTMLBody, Configuration, NTLM, \FileAttachmentfrom exchangelib.protocol import BaseProtocol, NoVerifyHTTPAdapterimport urllib3import datetimeBaseProtocol.HTTP_ADAPTER_CLS = NoVerifyHTTPAdapterurllib3.disable_warnings()cred = Credentials(r'username', 'pwd')config = Configuration(server='exgmail.cn.test.jp', credentials=cred, auth_type=NTLM)a = Account(primary_smtp_address="robot@tmp.cn.test.jp", config=config, autodiscover=False, access_type=DELEGATE)commen_message = '''<div align="left" style="text-align: justify;"><font color="red" face="Arial" size="2" style="font-family: Arial;"><span style="font-size: 10pt;">这是一封系统自动生成的邮件,请勿直接回复!</span></font><div><div align="left" style="text-align: justify;"><font color="red" face="Arial" size="2" style="font-family: Arial;"><span style="font-size: 10pt;"><u>This mail is from:%s</u></span></font><div><br><br>'''%authto_list = []for x in mail_addr.split(';'):if x:to_list.append(Mailbox(email_address=x))cc_list = []for x in cc_addr.split(';'):if x:cc_list.append(Mailbox(email_address=x))m = Message(account=a,folder=a.sent,subject=subject,body=HTMLBody(commen_message+htmlBody),to_recipients=to_list,cc_recipients=cc_list)for file in attchmentList:print(file.split('/')[-1])with open(file, 'rb') as f:content = f.read()new_attach = FileAttachment(name=file.split('/')[-1], content=content)m.attach(new_attach)m.send_and_save()
Python:如何方便地用Python发outlook邮件相关推荐
- python自动发outlook邮件_使用python自动发邮件(163、QQ、outlook邮箱)
import smtplib fromemail.mime.text import MIMEText fromemail.utils import formataddr fromdatetime im ...
- Python基础笔记_Day12_Python元类、type动态创建类、Python动态创建方法、Python运算符、Python发邮件、短信
Day12_Python元类.type动态创建类.Python动态创建方法.Python运算符重载.Python发邮件.短信 12.01_Python语言基础(类对象)(熟悉) 12.02_Pytho ...
- python插件做nagios发报警邮件二
接上文 python插件做nagios发报警邮件 http://www.nginxs.com/linux/371.html,由于python 传入的参数,python 会自动加 \ ,经过代码测试,代 ...
- python之钉钉机器人自动发消息——傻瓜式教程
文章目录 python之钉钉机器人自动发消息--傻瓜式教程 前言 钉钉创建机器人 主要流程如下: 细节流程如下 python连接dingtalk 发送MarkDown格式消息 源码展示 效果展示 代码 ...
- Python 图像 一样大小_#带你学Python# 表白利器:用Python发微信表情画-带你认识图片的秘密...
首先感谢大家对上篇文章"python实现传染病模型"的肯定: 孙小白:#带你学Python# 疫情当前,在家没事?你也可以用Python预测疫情发展zhuanlan.zhihu. ...
- python实现用程序给自己发邮件
之前跑的实验总是很耗时,有时候让程序跑着自己出去玩,又得经常回来看它有没有跑完. 于是干脆写个监测程序,让它每隔一段时间就给我发个邮件. 当然,你要设置一个监测条件. 比如我的主程序运行后会生成一些新 ...
- python excel 内容写入html,PYTHON读取EXCEL内容再转变成HTML添加到OUTLOOK中
需求 读取excel里的表格里的内容,然后打开本机的outlook.把excel里的内容添加到正文里,注意.这里是要添加到正文!正文!正文!而不是添加到附件里 设计思路 1.excel处理 打开exc ...
- 利用python写一个自动给手机发邮件程序
在用python做一些测试时候,不想一直盯着测试结果.当测试完成或者测试出现问题时候,希望能够快速提醒自己.这时候给自己发个邮件,手机邮箱就会收到消息.从而实现消息的快速获取. 这是小编准备的pyth ...
- Python爬虫之每天给她发一个笑话
寒假在家真是无聊透顶,天气又冷,整天只能躺在床上睡觉.玩游戏.出于好玩,偶然间看到一篇有趣的博客"python实现自动定时给女朋友发手机短信,每天一个笑话!" https://bl ...
最新文章
- JavaScript语言标准
- 每日一皮:为了找个程序员租客,我拼了!
- c++批量重命名_文件批量重命名?这个方法百试百灵
- [USACO1.1]黑色星期五Friday the Thirteenth
- mssql 批量导入mysql_mssql 数据库 批量导入指令
- Atom飞行手册翻译: 2.12 在Atom中写作
- bzoj3620 似乎在梦中见过的样子
- Confluence或JIRA验证码乱码的问题
- 中文语句分词 -- HanLP词性
- 机器学习:贝叶斯网络
- casue usb kb 找不到驱动程序_手把手教你安装喷墨打印机驱动程序
- 短视频剪辑怎么做?4步教你快速入门
- word公式编号问题
- tempo.js模板引擎:通过tempo将Json串填充到html页面中
- 【米勒拉宾模板】Palindromic Primes
- 海信android电视直播软件,2017年,海信电视看电视必装的四大直播软件
- 2022建筑设计企业申报建筑设计资质流程
- USB会议摄像机的重要的网络特性
- Symbian开发环境
- nginx反向代理node,解决前后端跨域问题
热门文章
- SYD8811 AES硬件加密
- tyvj 1031 热浪
- 【踩坑记录】—— 越南语ipa包安装失败
- Docker物理机重启后,docker报错 error creating overlay mount to /var/lib/docker/overlay2
- 在不同的库存情况下,亚马逊CPC广告的投放策略会有什么改变呢?
- 如何评价python知乎_如何看待当下许多人盲目追风Python
- 市面上的长距离激光测距仪的小知识?TFN LR20KI带你走近长距离激光测距的世界。
- 职场干货:身为程序员的你,用了多长时间学习和研究,才达到某一领域技术专家的水平?
- IDEA系列新手上路(作者使用经历,长篇预警)
- Maven打包(瘦身打包部署),不包含第三方依赖jar包