一、说明

1.1 程序说明

(1)smtp是邮件发送协议;pop和imap都是邮件接收协议,两者的区别通常的说法是imap的操作会同步到邮箱服务器而pop不会,表现上我也不是很清楚

(2)本程序实现使用smtplib标准库实现邮件发送、使用poplib标准库和imaplib标准库实现邮件收取

(3)具体到代码上,三个功能依次对应程序中的send_email_by_smtp()、recv_email_by_pop3()、recv_email_by_imap4()三个函数,这三个函数相互独立没有调用关系

(4)由于还没弄清楚要怎么能很好地解码邮件,所以这里的pop和imap都只是直接将最新的一封邮件读取后直接打印出来,并没有进行解码。

(5)在贴上代码时,代码中的邮箱已全部替换,使用时记得修改这些信息;注释中已都有较详细说明,不多辍述。

(6)对于自己邮箱的smtp服端器、pop服务器、imap服务器地址如果不知道则自己百度一下,一般都是“协议+邮箱后辍”的形式(比如pop.qq.com),这种形式如果能ping通一般就是了;端口则可能多变,如果查不到就直接nmap等工具扫一下。比如下面:

1.2 程序运行截图

smtp邮件发送截图:

pop3邮件收取截图:

imap4邮件收取截图:

二、程序代码

  1. import smtplib
  2. import poplib
  3. import imaplib
  4. from email.mime.text import MIMEText
  5. from email.header import Header
  6.  
  7. class operate_email:
  8. # 此函数通过使用smtplib实现发送邮件
  9. def send_email_by_smtp(self):
  10. # 用于发送邮件的邮箱。修改成自己的邮箱
  11. sender_email_address = "your_email@qq.com"
  12. # 用于发送邮件的邮箱的密码。修改成自己的邮箱的密码
  13. sender_email_password = "your_email_password"
  14. # 用于发送邮件的邮箱的smtp服务器,也可以直接是IP地址
  15. # 修改成自己邮箱的sntp服务器地址;qq邮箱不需要修改此值
  16. smtp_server_host = "smtp.qq.com"
  17. # 修改成自己邮箱的sntp服务器监听的端口;qq邮箱不需要修改此值
  18. smtp_server_port = 465
  19. # 要发往的邮箱
  20. receiver_email = "your_dest_email@qq.com"
  21. # 要发送的邮件主题
  22. message_subject = "Python smtp测试邮件"
  23. # 要发送的邮件内容
  24. message_context = "这是一封通过Python smtp发送的测试邮件..."
  25.  
  26. # 邮件对象,用于构建邮件
  27. # 如果要发送html,请将plain改为html
  28. message = MIMEText(message_context, 'plain', 'utf-8')
  29. # 设置发件人(声称的)
  30. message["From"] = Header(sender_email_address, "utf-8")
  31. # 设置收件人(声称的)
  32. message["To"] = Header(receiver_email, "utf-8")
  33. # 设置邮件主题
  34. message["Subject"] = Header(message_subject,"utf-8")
  35.  
  36. # 连接smtp服务器。如果没有使用SSL,将SMTP_SSL()改成SMTP()即可其他都不需要做改动
  37. email_client = smtplib.SMTP_SSL(smtp_server_host, smtp_server_port)
  38. try:
  39. # 验证邮箱及密码是否正确
  40. email_client.login(sender_email_address, sender_email_password)
  41. print("smtp----login success, now will send an email to {receiver_email}")
  42. except:
  43. print("smtp----sorry, username or password not correct or another problem occur")
  44. else:
  45. # 发送邮件
  46. email_client.sendmail(sender_email_address, receiver_email, message.as_string())
  47. print(f"smtp----send email to {receiver_email} finish")
  48. finally:
  49. # 关闭连接
  50. email_client.close()
  51.  
  52. # 此函数通过使用poplib实现接收邮件
  53. def recv_email_by_pop3(self):
  54. # 要进行邮件接收的邮箱。改成自己的邮箱
  55. email_address = "your_email@qq.com"
  56. # 要进行邮件接收的邮箱的密码。改成自己的邮箱的密码
  57. email_password = "your_email_password"
  58. # 邮箱对应的pop服务器,也可以直接是IP地址
  59. # 改成自己邮箱的pop服务器;qq邮箱不需要修改此值
  60. pop_server_host = "pop.qq.com"
  61. # 邮箱对应的pop服务器的监听端口。改成自己邮箱的pop服务器的端口;qq邮箱不需要修改此值
  62. pop_server_port = 995
  63.  
  64. try:
  65. # 连接pop服务器。如果没有使用SSL,将POP3_SSL()改成POP3()即可其他都不需要做改动
  66. email_server = poplib.POP3_SSL(host=pop_server_host, port=pop_server_port, timeout=10)
  67. print("pop3----connect server success, now will check username")
  68. except:
  69. print("pop3----sorry the given email server address connect time out")
  70. exit(1)
  71. try:
  72. # 验证邮箱是否存在
  73. email_server.user(email_address)
  74. print("pop3----username exist, now will check password")
  75. except:
  76. print("pop3----sorry the given email address seem do not exist")
  77. exit(1)
  78. try:
  79. # 验证邮箱密码是否正确
  80. email_server.pass_(email_password)
  81. print("pop3----password correct,now will list email")
  82. except:
  83. print("pop3----sorry the given username seem do not correct")
  84. exit(1)
  85.  
  86. # 邮箱中其收到的邮件的数量
  87. email_count = len(email_server.list()[1])
  88. # 通过retr(index)读取第index封邮件的内容;这里读取最后一封,也即最新收到的那一封邮件
  89. resp, lines, octets = email_server.retr(email_count)
  90. # lines是邮件内容,列表形式使用join拼成一个byte变量
  91. email_content = b'\r\n'.join(lines)
  92. # 再将邮件内容由byte转成str类型
  93. email_content = email_content.decode()
  94. print(email_content)
  95.  
  96. # 关闭连接
  97. email_server.close()
  98.  
  99. # 此函数通过使用imaplib实现接收邮件
  100. def recv_email_by_imap4(self):
  101. # 要进行邮件接收的邮箱。改成自己的邮箱
  102. email_address = "your_email@qq.com"
  103. # 要进行邮件接收的邮箱的密码。改成自己的邮箱的密码
  104. email_password = "your_email_password"
  105. # 邮箱对应的imap服务器,也可以直接是IP地址
  106. # 改成自己邮箱的imap服务器;qq邮箱不需要修改此值
  107. imap_server_host = "imap.qq.com"
  108. # 邮箱对应的pop服务器的监听端口。改成自己邮箱的pop服务器的端口;qq邮箱不需要修改此值
  109. imap_server_port = 993
  110.  
  111. try:
  112. # 连接imap服务器。如果没有使用SSL,将IMAP4_SSL()改成IMAP4()即可其他都不需要做改动
  113. email_server = imaplib.IMAP4_SSL(host=imap_server_host, port=imap_server_port)
  114. print("imap4----connect server success, now will check username")
  115. except:
  116. print("imap4----sorry the given email server address connect time out")
  117. exit(1)
  118. try:
  119. # 验证邮箱及密码是否正确
  120. email_server.login(email_address,email_password)
  121. print("imap4----username exist, now will check password")
  122. except:
  123. print("imap4----sorry the given email address or password seem do not correct")
  124. exit(1)
  125.  
  126. # 邮箱中其收到的邮件的数量
  127. email_server.select()
  128. email_count = len(email_server.search(None, 'ALL')[1][0].split())
  129. # 通过fetch(index)读取第index封邮件的内容;这里读取最后一封,也即最新收到的那一封邮件
  130. typ, email_content = email_server.fetch(f'{email_count}'.encode(), '(RFC822)')
  131. # 将邮件内存由byte转成str
  132. email_content = email_content[0][1].decode()
  133. print(email_content)
  134. # 关闭select
  135. email_server.close()
  136. # 关闭连接
  137. email_server.logout()
  138.  
  139. if __name__ == "__main__":
  140. # 实例化
  141. email_client = operate_email()
  142. # 调用通过smtp发送邮件的发送函数
  143. email_client.send_email_by_smtp()
  144. # 调用通过pop3接收邮件的接收函数
  145. email_client.recv_email_by_pop3()
  146. # 调用通过imap4接收邮件的接收函数
  147. email_client.recv_email_by_imap4()

参考:

https://docs.python.org/3/library/smtplib.html

https://docs.python.org/3/library/poplib.html

https://docs.python.org/3/library/imaplib.html

http://help.163.com/10/0203/13/5UJONJ4I00753VB8.html

http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=371

http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=331

Python3+smtplib+poplib+imaplib实现发送和收取邮件(以qq邮箱为例)的更多相关文章

  1. thinkphp5 邮件发送(qq邮箱为例)

    一.首先需要你开启smtp 服务,登录qq邮箱,进入设置 -> 账户 注意: 开启后会生成授权码,一定要记下,两个都记下,登录邮件客户端需要.这里配置邮件发送也需要这个授权码 二. 下载phpm ...

  2. 【故障公告】SendCloud 邮件发送服务故障造成大量 QQ 邮箱收不到邮件

    抱歉,由于我们所使用的搜狐旗下的 SendCloud 邮件发送服务出现故障,今天上午大量发往 @qq.com 邮箱的邮件无法正常发送,从 SendCloud 管理控制台看这些邮件一直处于“请求中”的状 ...

  3. 命令行发送SMTP协议邮件(163邮箱)

    这里我们用163邮箱为例子,借助命令行发送smtp邮件 1.连接服务器 在终端上输入:telnet smtp.163.com 25 回车,然后就连接了服务器的25端口,成功会输出 220 163.co ...

  4. 解决使用Foxmail客户端软件不能收取腾讯企业邮箱的全部邮件

    一般说来,使用Foxmail客户端软件收取邮箱时,需要作如下几步: 1.进入邮箱web界面授权开启POP3/SMTP服务.IMAP/SMTP等服务 2.在邮箱web界面配置收取选项,可选择收取全部邮件 ...

  5. Thinkphp3.2 PHPMailer 发送 QQ邮箱 163邮箱

    在进入正题这前先看下网易(163)邮箱的服务器地址和端口号 类型 服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号 收件服务器 POP pop.163.com 995 110 收件服务器 ...

  6. SpringBoot系列(十四)集成邮件发送服务及邮件发送的几种方式

    往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)web静 ...

  7. 【python3】基于 qq邮箱的邮件发送

    脚本内容: #!/usr/bin/python3 # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText ...

  8. 使用Python内置的smtplib包和email包来实现邮件的构造和发送。

    此文章github地址:https://github.com/GhostCNZ/Python_sendEmail Python_sendEmail 使用Python内置的smtplib包和email包 ...

  9. python3:利用SMTP协议发送QQ邮件+附件

    转载请表明出处:https://www.cnblogs.com/shapeL/p/9115887.html 1.发送QQ邮件,首先必须知道QQ邮箱的SMTP服务器 http://service.mai ...

随机推荐

  1. C# linq 最大、最小对象的扩展

    public static class LinqExtension { public static T MaxBy<T, TR>(this IEnumerable<T> en, ...

  2. JS中什么是发布--订阅模式?

    转载文章部分内容: 发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. ...

  3. JavaSE习题 第四章 类与对象

    问答题: 1.在声明类时,类名应该遵守哪些习惯? 1.与文件名相同2.首字母大写 2.类体内容中有那两类比较重要的成员? 1.成员变量2.方法 3.实例方法可以操作类变量吗?类方法可以操作实例变量吗? ...

  4. Kali Linux 更新源 操作完整版教程

    一.查看kali系统的更新源地址文件 命令: vim /etc/apt/sources.list 上面这是kali官方的更新源: 拓展知识: 一个完整的源包括:deb 和 deb-src:上图源地址是 ...

  5. asp.net 虹软人脸识别sdk 释放内存

    初始化时申请内存,用完记得释放,不然就会报“内存已满”的. 使用时: pMem = Marshal.AllocHGlobal(detectSize); 释放内存: Marshal.FreeHGloba ...

  6. Unity--- 纹理设置属性 alphaIsTransparency

    官方的解释: 意思就是没什么实际效果,只是用做显示用. 参考:https://docs.unity3d.com/ScriptReference/Texture2D-alphaIsTransparenc ...

  7. sql server 学习笔记 ( backup 备份方案 )

    做个记入就好 USE [master] SELECT bs.database_name AS 'Database Name', bs.backup_start_date AS 'Backup Star ...

  8. PyMongo官方文档翻译——VNPY

    PyMongo是MongoDB数据库的python模块 VNPY默认的数据库,没有采用SQL类型的数据库,而是采用No-Sql类型的MongoDB数据库, 对于想了解VNPY内部结构的童鞋,多多少少会 ...

  9. nodejs使用log4js记录日志

    log4j是java里面最好用的日志记录插件,在.net上面也有移植log4j.net.同样也移植到了nodejs里面,多的不说,把自测通过的代码粘出来吧. var log4js = require( ...

  10. Java从内存流中读取byte数组

    Java中通过servlet接收二进制数据,然后将二进制数据流读取为byte数组.开始使用:byte[] bs = new byte[request.getContentLength()];reque ...