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

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

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

用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()

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

smtplib 抄送邮件_用Python收发电子邮件相关推荐

  1. python群发邮箱软件下载_用python群发电子邮件

    python作为一款编程语言,其用处多多,今天一米软件就来教教大家用python群发电子邮件怎么做. 1. SMTP 服务器介绍 SMTP(Simple Mail Transfer Protocol) ...

  2. python电子邮件地址怎么写_用Python发送电子邮件

    今天给大家分享如何用Python自动发送电子邮件,当我们在云服务器上部署了爬虫,就希望当爬虫发生异常情况的时候能通过自动发送电子邮件来通知我们.因此学会用Python程序自动发送邮件能减轻不少爬虫监控 ...

  3. 用python群发邮件_使用Python实现电子邮件群发功能

    原标题:使用Python实现电子邮件群发功能 在某些应用中,可能会需要由管理员给所有用法群发电子邮件,或者类似的应用.本文代码使用Python详细模拟了这个过程. importemail fromem ...

  4. python邮件的图片放在哪里_用python保存电子邮件中的嵌入图像

    我试图在一个嵌入的电子邮件中抓取图像.问题是我保存的图像不可读,我不知道为什么. 电子邮件(保存为我在代码开头加载的文件):MIME-Version: 1.0 Received: by 10.100. ...

  5. 发送邮件_使用 Python 发送电子邮件

    在实际运用中,我们可能需要通过电子邮件告诉我们 Python 运行的结果的是否与预期的一致.现在我们就来看一下,怎么通过 Python 发送邮件. 这个示例中我们需要用到的第三方库有: •smtpli ...

  6. smtplib 抄送邮件_python 2.7 利用smtplib发送、抄送邮件以及发送html表格

    开发语言: python2.7 包:smtplib 导入包:import smtplib 定义一个函数:def send_mail(to_list, cc_list, html, sub): me = ...

  7. python发html邮件_在python中如何制作发送HTML格式的邮件?

    邮件的设计和制作,作为邮件营销的重要环节,直接影响着一次营销活动转化.我们知道,不同的邮件客户端有不同的解析规则.一封设计精美的邮件,如果Html格式不规范,在客户端显示的效果往往会大打折扣.所以,如 ...

  8. python发送邮箱_利用Python自动发送电子邮件

    在利用Python进行发送邮件时主要借助smtplib和email两个模块,其中smtplib主要用来建立服务器链接.服务器断开的工作,而email模块主要用来设置一些与邮件本身相关的内容,比如收件人 ...

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

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

最新文章

  1. Redis初学:7(Set类型)
  2. oracle数据库查询如何导出大字段,Oracle数据库导出大字段(CLOB)数据-Oracle
  3. VTK:图表之ConstructTree
  4. 点到面距离公式向量法_点到线或面的距离公式
  5. basic knowledge
  6. JavaScript var语句简析
  7. android 利用cmdline,将參数从preloader传递到kernel
  8. 嵌入式linux设计报告,嵌入式Linux程设计报告.doc
  9. PS中有哪些快速抠图的方法
  10. cmd格式化(重置)磁盘/U盘的操作流程
  11. python cad二次开发文档_AutoCAD二次开发&实现简单的自动编号
  12. 计算机考在职研究生有用吗,报考计算机在职研究生有用吗?
  13. Google App Engine + JDO + Spring MVC,CRUD示例
  14. 项目集锦 | 易基因DNA羟甲基化5hmC测序研究成果
  15. 切断ADG的关联,划分为两个独立的数据库
  16. 【汇编语言】Arm处理器之中断处理
  17. 《剑指offer》所有面试题及其参考代码
  18. Windows中的共享文件和文件服务器
  19. 【计算机毕业设计】38.网上轰趴预订系统
  20. rpf逆向路径转发 linux,CISCO 组播RPF 逆向路径转发 实验原理

热门文章

  1. HOW-TO:带有Spring MVC的Tomcat中的自定义错误页面
  2. WildFly 8.0.0.Alpha1的发布和一些历史
  3. java sendmessage函数_vc中SendMessage自定义消息函数用法实例
  4. LeetCode 66 加一
  5. C++ 异常的详细介绍
  6. Python3实现32位整数翻转
  7. php做一个网页的源代码,用HTML5做一个个人网站此文仅展示个人主页界面。内附源代码下载地址...
  8. linux命令创建硬链接,Linux终端命令接口(十一)硬链接与软连接
  9. 最大隶属度原则_模糊数学笔记:六、模糊模型识别-I(最大隶属度原则)
  10. python逻辑运算符的使用_总结Python中逻辑运算符的使用