smtplib 抄送邮件_用Python收发电子邮件

电子邮件是最古老的互联网服务之一,发明于1969年,它已经50岁了!它并不要求收信人发信人同时连接网络,邮件存放于服务器,所以至今在企业内部还在大量使用。而且它是开放协议,没有被某大公司垄断。我们完全可以拿来做一个可靠的消息来源。

比如说我们在远程主机运行一个耗时较长的任务,或者搭建某个自己写的后台服务,当某些事件发生时,就可以发送一个邮件,手机任何一个邮件客户端都可以接收推送。

国内较好的邮件服务器就是QQ邮件了,它支持SMTP, ftjMAP, 默认都支持SSL的,这点很重要。要知道SMTP, POP密码都是明文显示在TCP包里。要开启SMTP/IMAP, 要在QQ邮件里做一下设置,拿到授权码,这个就是做为SMTP/IMAP的密码,而不是QQ密码。

59bb5b826c8bdaee562ee63faf69b3a0.png

ae9bdd61dafa2e6b3a405a05948fd949.png

dd94401b79d9ec1f245749a4ef941d3f.png

用IMAP接收邮件

python标准库里的imaplib就支持IMAP, 连接imap.qq.com即可with IMAP4_SSL("imap.qq.com") as M:M.noop()M.login("111111@qq.com", "gzoyimtltnqsbdba")  #qq邮件地址和刚才拿到的授权码,注意不是QQ号码和QQ密码M.select()typ, data = M.search(None, 'ALL')  #ALL为所有邮件,可替换为想搜索的字符串count = 10pcount = 1for num in data[0].split():typ, data = M.fetch(num, '(RFC822)')   #RFC822 为email标准for response_part in data:if isinstance(response_part, tuple):part = response_part[1].decode('utf-8')msg = email.message_from_string(part)  #收到的邮件包parseHeader(msg)parseBody(msg)pcount += 1if pcount > count:break

上面的msg包含了邮件本身的所有信息,我们感兴趣的有from, to, cc, subject, body等,分别代表了发件人,收件人,抄送列表,标题和邮件主体。python提供了email库帮助从message里提取。

  subject = message.get('Subject')# subject=str(message)# if subject is not None:h = email.header.Header(subject, charset='utf-8')dh = email.header.decode_header(h)subject = str(dh[0][0], encoding="utf-8")subject = encoded_words_to_text(subject)# .encode('utf-8')# print(h)# # 发件人from_sb = encoded_words_to_text(email.utils.parseaddr(message.get('from'))[0])if len(from_sb) == 0:from_sb = encoded_words_to_text(email.utils.parseaddr(message.get('from'))[1])# # 收件人to_sb = email.utils.parseaddr(message.get('to'))[1]# # 抄送人cc = email.utils.parseaddr(message.get_all('cc'))[1]# try:fmt = "ddd, D MMM YYYY HH:mm:ss Z"# date = arrow.get(message['Date'], fmt)date = arrow.get(message['Received'].split(';')[1], fmt)print(f"{from_sb:30} {subject:80} {date.humanize():20}")

arrow是python的一个第三方时间库,humanize可以生成one month ago这样容易懂的格式。

encoded_words_to_text方法是专门用来处理=?utf-8?q?打头的字符串的,因为电子邮件设计当初是只考虑ASCII码的,因为unicode还没诞生!为了支持unicode,又兼容以前的邮件,所以引入了这样的字符串格式。

def encoded_words_to_text(encoded_words):if not encoded_words.startswith("=?"):return encoded_wordsencoded_word_regex = r'=?{1}(.+)?{1}([B|Q])?{1}(.+)?{1}='charset, encoding, encoded_text = re.match(encoded_word_regex, encoded_words, flags=re.IGNORECASE).groups()if encoding.upper() == 'B':byte_string = base64.b64decode(encoded_text)elif encoding.upper() == 'Q':byte_string = quopri.decodestring(encoded_text)return byte_string.decode(charset)

用smtplib发送邮件

发送相对于接收就很简单了,在用QQ授权码登录http://smtp.qq.com服务器后调用sendemail就可以了,唯一要注意的一点是sendmail的msg参数是指email的所有内容,并没有提供subject和body的专门参数。所以我们需要用换行符分开。

def send_mail(fromaddr, toaddrs, subject, body):# Add the From: and To: headers at the start!msg = ("From: %srnTo: %srnSubject: %snn%s"% (fromaddr, ", ".join(toaddrs), subject, body))while True:  # 从命令行接收邮件内容,直到连按两下回车try:line = input()except EOFError:breakif not line:breakmsg = msg + lineprint("Message length is", len(msg))server = SMTP_SSL('smtp.qq.com')server.set_debuglevel(1)  #打开调试server.login("111111@qq.com", "gzoyimtltnqsbdba")server.sendmail(fromaddr, toaddrs, msg)server.quit()

8de1b5be7906e4e8b1478886bae4f2d7.png

扫码关注公众号,获取更多文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

带有JUnit 5支持的Ant 1.10.3发布

我们今天刚刚发布了 1.9.11和1.10.3版本的Ant。 这些下载位于Ant项目的下载页面上 。 这两个版本主要是错误修复版本,尤其是1.9.11版本。 由于几个原因,1.10.3版本是重要的版本。 先前的1.10.2版本无意中引入了许多更改,这些更改导致Ant任务中…

android 号码查联系人,Android联系人查询

我在查询电话簿联系人时遇到问题.我需要做的是获取同时输入电话和电子邮件或特定类型的联系人列表.基本上是这样的:public static final String SELECTION "("ContactsContract.Contacts.HAS_PHONE_NUMBER "1) OR " RawContacts.ACCOUNT_TYPE …

console.log()不显示结果_RNA结合蛋白与RNA的缠绵故事,教你不做实验发文章

解螺旋公众号陪伴你科研的第1869天继续学习如何不做实验发文章RNA结合蛋白是(RNA binding protein,RBP)细胞中一类可以识别特殊的RNA结合域与RNA互作,并参与RNA剪切、转运、序列编辑、胞内定位及翻译控制等多种转录后的调控过程中。既然RBP功能这么重要&…

watch gt 鸿蒙,鸿蒙登陆第三站:第一枚Harmony手表亮相?华为Watch GT 2e首发

作者|蒋杰升简称|单蒋让你们荡起昨天(3月19日)中午,华为官方放出两款华为WatchGT 2全新配色:玫瑰金、冰雪白。而前一天则是被猜测新增石墨黑、火山红、薄荷绿三种配色。至此,华为WatchGT 2改款Watch GT 2e,定于3月26日发布已无悬念…

JPA技巧:避免N + 1选择问题

介绍 诸如JPA的ORM框架通过帮助我们在对象<->关系数据映射期间避免了很多样板代码&#xff0c;从而简化了我们的开发过程。 但是&#xff0c;它们还会给表带来一些其他问题&#xff0c;N 1是其中之一。 在本文中&#xff0c;我们将简短地探讨该问题以及避免这些问题的一…

python设计模式有哪些_设计模式教程

设计模式是软件设计中常见问题的典型解决方案。它们就像能根据需求进行调整的预制蓝图&#xff0c;可用于解决代码中反复出现的设计问题。 设计模式与方法或库的使用方式不同&#xff0c;你很难直接在自己的程序中套用某个设计模式。模式并不是一段特定的代码&#xff0c;而是解…

一建机电实务教材电子版_必背!一建《机电实务》高频考点,每日一背

本文部分来自学霸笔记&#xff0c;点击链接关注公众号下载【工业管道的施工程序】1.管道施工前应具备的开工条件&#xff1a;1.工程设计图纸及其他技术文件完整齐全&#xff0c;已按程序进行了工程交底和图纸会审。2.施工组织设计和施工方案已批准&#xff0c;并已进行了技术和…

鸿蒙开发者社区入口,鸿蒙OS 社区

OpenHarmony community欢迎来到OpenHarmony社区&#xff01;Community仓库用于管理OpenHarmony社区治理、开发者贡献指南、开发者贡献协议、社区交流等内容。社区治理组织架构社区交流OpenHarmony社区通过项目管理委员会( Project Management Committee)管理OpenHarmony社区。请…

python 数据去重_科学网—python学习——根据条件提取数据,并去重 - 李立的博文...

[Python字符串提取] 摘要&#xff1a;根据要求进行字符串的提取&#xff0c;并去重 导入分析所需的库import pandas as pd 构造数据集 as1 pd.DataFrame({a:[1,2,3,4], b:[adwdea,asdw;swa,des,swa,dwad;asdw;swa,se;dw,asd;erf,de,de]})编写分析函数 def trans(b): as1[c] b…

assertionerror python_Python成为专业人士笔记–内置模块Modules和函数Functions

“专业人士笔记”系列目录&#xff1a;创帆云&#xff1a;Python成为专业人士笔记--强烈建议收藏&#xff01;每日持续更新&#xff01;​zhuanlan.zhihu.com模块是一个包含Python定义和语句的文件&#xff0c;而函数是执行逻辑的一段代码 。要检查python中内置的函数&#xff…

android 7.0 禁止 imei,Android一些适配

# Android 版本适配重点其他细节请查看官网对应版本&#xff1a;https://developer.android.com/preview## 7.01. 后台优化- 移除了以下静态注册广播通知(动态注册可继续使用)&#xff1a;CONNECTIVITY_ACTION ACTION_NEW_PICTURE ACTION_NEW_VIDEO2. 系统权限更改- Android 7…

【Filament】纹理贴图

1 前言 本文主要介绍使用 Filament 实现纹理贴图&#xff0c;读者如果对 Filament 不太熟悉&#xff0c;请回顾以下内容。 Filament环境搭建绘制三角形绘制矩形绘制圆形绘制立方体 Filament 纹理坐标的 x、y 轴正方向分别朝右和朝上&#xff0c;其 y 轴正方向朝向与 OpenGL ES…

认识JSON绑定:概述系列

JSON绑定的Java API&#xff08;JSON-B&#xff09;1.0增强了Java EE平台对JSON数据交换格式的整体支持。 事实证明&#xff0c; 用于JSON处理的Java API&#xff08;JSON-P&#xff09;1.1十分流行&#xff0c;它们共同构成了完美的合作伙伴&#xff0c;填补了Java EE的JSON功…

c++可视化界面_新基建的福音:智慧楼宇可视化监控系统引领智能化新时代

前言智慧楼宇和人们的生活息息相关&#xff0c;楼宇智能化程度的提高&#xff0c;会极大程度的改善人们的生活品质&#xff0c;在当前 工业互联网 大背景下受到很大关注。目前 智慧楼宇可视化监控 的主要优点包括:智慧化 -- 智慧楼宇是一个生态系统&#xff0c;像人一样拥有感知…

table 多行 宽度不一致_“table”除了桌子,你还知道一些别的意思吗?

就比如"nine-nine table"这可是小学一年级必须要掌握的知识实际上&#xff0c;nine-nine table是九九乘法表&#xff0c;乘法表可以用times table表示&#xff0c;书面用语是multiplication table。table除了桌子的意思外&#xff0c;还有一些别的意思和表达&#xf…

android uri db,Android ContentProvider封装数据库和文件读写总结

本文是我各处东拼西凑加上自己实现一个ContentProvider的使用总结&#xff0c;留做后用&#xff0c;主要介绍ContentProvider的集成方法。一、综述ContentProvider是Android四大组件之一&#xff0c;其核心功能是提供应用间的统一的数据访问方式&#xff0c;当然也可以用于应用…

ddos攻击工具_简单有效的ddos攻击防御方法

做过网站的站长大多有被ddos攻击的经历&#xff0c;不少人面对竞争对手的网站就是直接雇人ddos攻击网站&#xff0c;导致对方网站长期打不开&#xff0c;最后无奈关闭网站&#xff0c;初尧今天就告诉大家一个最简单也是最有效的防御方法。高防服务器/高防IP对于游戏&#xff0c…

android gpio驱动实例,安卓gpio操作示例

GPIO值在RK3288中的计算方法为&#xff1a;bank32pin&#xff0c;如&#xff1a;GPIO7A3&#xff1a; 732 0*8 3227GPIO0B5: 032 1*8 5131. 导出/sys/class/gpio# echo 44 > export2. 设置方向/sys/class/gpio/gpio44# echo out > direction3. 查看方向/sys/class/gpio/…

回调函数中有回调函数吗_嗨,那里有回调!

回调函数中有回调函数吗因为是我的书包&#xff0c;所以我喜欢JavaScript 。 实际上&#xff0c;我已经开始喜欢JavaScritp的面向异步回调的编程风格 。 因此&#xff0c;当我发现自己处于非JavaScript环境中时&#xff08;例如Java&#xff09; &#xff0c;我往往会错过使用回…

python的django_django能用来做什么

Django是什么 Django是一个开放源代码的Web应用框架&#xff0c;由Python写成。采用了MT‘V的框架模式&#xff0c;即模型M&#xff0c;模板T和视图V。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的&#xff0c;即是CMS&#xff08;内容管理系统&am…