背景

单位有自动定时邮件需求,而Windows自带的定时任务不好用,不灵活,于是自己用Python写。

重点库

  1. outlook邮件库:exchangelib
  2. 定时跑批的库:schedule

完整源码

https://gitee.com/sheep431/Automail

实现方法

  1. 造一个发送邮件的通用函数exchangelib
  2. 每一个邮件任务单独形成一个函数,调用exchangelib发送邮件,对发送配置项进行配置。
  3. 造一个运行用py文件,用schdule实现轮询调用各邮件任务函数。
  4. 对于需要月初月末等特定日期发送的邮件,为了方便实现添加了计算月末日期和前一个业务日期的函数。

诀窍

  1. 比较麻烦的是HTML富文本形式的邮件如何正确配置内容。有一个很方便的方法就是发一个相同内容的邮件到网络邮箱,然后直接复制相应的HTML到自己的代码中作为发送的content部分。
  2. 没有条件做1的话,直接Outlook桌面程序右键选择查看源文件也可以参考。
  3. 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&amp;X-OWA-CANARY=DgcknvBpZ0u31fE3APHxKPCNG2-8YtkIu036BMDdmIzO-2okMHUTQmRT7IkcKZoBzJyRhMId15Y.&amp;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邮件相关推荐

  1. python自动发outlook邮件_使用python自动发邮件(163、QQ、outlook邮箱)

    import smtplib fromemail.mime.text import MIMEText fromemail.utils import formataddr fromdatetime im ...

  2. Python基础笔记_Day12_Python元类、type动态创建类、Python动态创建方法、Python运算符、Python发邮件、短信

    Day12_Python元类.type动态创建类.Python动态创建方法.Python运算符重载.Python发邮件.短信 12.01_Python语言基础(类对象)(熟悉) 12.02_Pytho ...

  3. python插件做nagios发报警邮件二

    接上文 python插件做nagios发报警邮件 http://www.nginxs.com/linux/371.html,由于python 传入的参数,python 会自动加 \ ,经过代码测试,代 ...

  4. python之钉钉机器人自动发消息——傻瓜式教程

    文章目录 python之钉钉机器人自动发消息--傻瓜式教程 前言 钉钉创建机器人 主要流程如下: 细节流程如下 python连接dingtalk 发送MarkDown格式消息 源码展示 效果展示 代码 ...

  5. Python 图像 一样大小_#带你学Python# 表白利器:用Python发微信表情画-带你认识图片的秘密...

    首先感谢大家对上篇文章"python实现传染病模型"的肯定: 孙小白:#带你学Python# 疫情当前,在家没事?你也可以用Python预测疫情发展​zhuanlan.zhihu. ...

  6. python实现用程序给自己发邮件

    之前跑的实验总是很耗时,有时候让程序跑着自己出去玩,又得经常回来看它有没有跑完. 于是干脆写个监测程序,让它每隔一段时间就给我发个邮件. 当然,你要设置一个监测条件. 比如我的主程序运行后会生成一些新 ...

  7. python excel 内容写入html,PYTHON读取EXCEL内容再转变成HTML添加到OUTLOOK中

    需求 读取excel里的表格里的内容,然后打开本机的outlook.把excel里的内容添加到正文里,注意.这里是要添加到正文!正文!正文!而不是添加到附件里 设计思路 1.excel处理 打开exc ...

  8. 利用python写一个自动给手机发邮件程序

    在用python做一些测试时候,不想一直盯着测试结果.当测试完成或者测试出现问题时候,希望能够快速提醒自己.这时候给自己发个邮件,手机邮箱就会收到消息.从而实现消息的快速获取. 这是小编准备的pyth ...

  9. Python爬虫之每天给她发一个笑话

    寒假在家真是无聊透顶,天气又冷,整天只能躺在床上睡觉.玩游戏.出于好玩,偶然间看到一篇有趣的博客"python实现自动定时给女朋友发手机短信,每天一个笑话!" https://bl ...

最新文章

  1. JavaScript语言标准
  2. 每日一皮:为了找个程序员租客,我拼了!
  3. c++批量重命名_文件批量重命名?这个方法百试百灵
  4. [USACO1.1]黑色星期五Friday the Thirteenth
  5. mssql 批量导入mysql_mssql 数据库 批量导入指令
  6. Atom飞行手册翻译: 2.12 在Atom中写作
  7. bzoj3620 似乎在梦中见过的样子
  8. Confluence或JIRA验证码乱码的问题
  9. 中文语句分词 -- HanLP词性
  10. 机器学习:贝叶斯网络
  11. casue usb kb 找不到驱动程序_手把手教你安装喷墨打印机驱动程序
  12. 短视频剪辑怎么做?4步教你快速入门
  13. word公式编号问题
  14. tempo.js模板引擎:通过tempo将Json串填充到html页面中
  15. 【米勒拉宾模板】Palindromic Primes
  16. 海信android电视直播软件,2017年,海信电视看电视必装的四大直播软件
  17. 2022建筑设计企业申报建筑设计资质流程
  18. USB会议摄像机的重要的网络特性
  19. Symbian开发环境
  20. nginx反向代理node,解决前后端跨域问题

热门文章

  1. SYD8811 AES硬件加密
  2. tyvj 1031 热浪
  3. 【踩坑记录】—— 越南语ipa包安装失败
  4. Docker物理机重启后,docker报错 error creating overlay mount to /var/lib/docker/overlay2
  5. 在不同的库存情况下,亚马逊CPC广告的投放策略会有什么改变呢?
  6. 如何评价python知乎_如何看待当下许多人盲目追风Python
  7. 市面上的长距离激光测距仪的小知识?TFN LR20KI带你走近长距离激光测距的世界。
  8. 职场干货:身为程序员的你,用了多长时间学习和研究,才达到某一领域技术专家的水平?
  9. IDEA系列新手上路(作者使用经历,长篇预警)
  10. Maven打包(瘦身打包部署),不包含第三方依赖jar包