Python3+smtplib+poplib+imaplib实现发送和收取邮件(以qq邮箱为例)
一、说明
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邮件收取截图:
二、程序代码
- import smtplib
- import poplib
- import imaplib
- from email.mime.text import MIMEText
- from email.header import Header
- class operate_email:
- # 此函数通过使用smtplib实现发送邮件
- def send_email_by_smtp(self):
- # 用于发送邮件的邮箱。修改成自己的邮箱
- sender_email_address = "your_email@qq.com"
- # 用于发送邮件的邮箱的密码。修改成自己的邮箱的密码
- sender_email_password = "your_email_password"
- # 用于发送邮件的邮箱的smtp服务器,也可以直接是IP地址
- # 修改成自己邮箱的sntp服务器地址;qq邮箱不需要修改此值
- smtp_server_host = "smtp.qq.com"
- # 修改成自己邮箱的sntp服务器监听的端口;qq邮箱不需要修改此值
- smtp_server_port = 465
- # 要发往的邮箱
- receiver_email = "your_dest_email@qq.com"
- # 要发送的邮件主题
- message_subject = "Python smtp测试邮件"
- # 要发送的邮件内容
- message_context = "这是一封通过Python smtp发送的测试邮件..."
- # 邮件对象,用于构建邮件
- # 如果要发送html,请将plain改为html
- message = MIMEText(message_context, 'plain', 'utf-8')
- # 设置发件人(声称的)
- message["From"] = Header(sender_email_address, "utf-8")
- # 设置收件人(声称的)
- message["To"] = Header(receiver_email, "utf-8")
- # 设置邮件主题
- message["Subject"] = Header(message_subject,"utf-8")
- # 连接smtp服务器。如果没有使用SSL,将SMTP_SSL()改成SMTP()即可其他都不需要做改动
- email_client = smtplib.SMTP_SSL(smtp_server_host, smtp_server_port)
- try:
- # 验证邮箱及密码是否正确
- email_client.login(sender_email_address, sender_email_password)
- print("smtp----login success, now will send an email to {receiver_email}")
- except:
- print("smtp----sorry, username or password not correct or another problem occur")
- else:
- # 发送邮件
- email_client.sendmail(sender_email_address, receiver_email, message.as_string())
- print(f"smtp----send email to {receiver_email} finish")
- finally:
- # 关闭连接
- email_client.close()
- # 此函数通过使用poplib实现接收邮件
- def recv_email_by_pop3(self):
- # 要进行邮件接收的邮箱。改成自己的邮箱
- email_address = "your_email@qq.com"
- # 要进行邮件接收的邮箱的密码。改成自己的邮箱的密码
- email_password = "your_email_password"
- # 邮箱对应的pop服务器,也可以直接是IP地址
- # 改成自己邮箱的pop服务器;qq邮箱不需要修改此值
- pop_server_host = "pop.qq.com"
- # 邮箱对应的pop服务器的监听端口。改成自己邮箱的pop服务器的端口;qq邮箱不需要修改此值
- pop_server_port = 995
- try:
- # 连接pop服务器。如果没有使用SSL,将POP3_SSL()改成POP3()即可其他都不需要做改动
- email_server = poplib.POP3_SSL(host=pop_server_host, port=pop_server_port, timeout=10)
- print("pop3----connect server success, now will check username")
- except:
- print("pop3----sorry the given email server address connect time out")
- exit(1)
- try:
- # 验证邮箱是否存在
- email_server.user(email_address)
- print("pop3----username exist, now will check password")
- except:
- print("pop3----sorry the given email address seem do not exist")
- exit(1)
- try:
- # 验证邮箱密码是否正确
- email_server.pass_(email_password)
- print("pop3----password correct,now will list email")
- except:
- print("pop3----sorry the given username seem do not correct")
- exit(1)
- # 邮箱中其收到的邮件的数量
- email_count = len(email_server.list()[1])
- # 通过retr(index)读取第index封邮件的内容;这里读取最后一封,也即最新收到的那一封邮件
- resp, lines, octets = email_server.retr(email_count)
- # lines是邮件内容,列表形式使用join拼成一个byte变量
- email_content = b'\r\n'.join(lines)
- # 再将邮件内容由byte转成str类型
- email_content = email_content.decode()
- print(email_content)
- # 关闭连接
- email_server.close()
- # 此函数通过使用imaplib实现接收邮件
- def recv_email_by_imap4(self):
- # 要进行邮件接收的邮箱。改成自己的邮箱
- email_address = "your_email@qq.com"
- # 要进行邮件接收的邮箱的密码。改成自己的邮箱的密码
- email_password = "your_email_password"
- # 邮箱对应的imap服务器,也可以直接是IP地址
- # 改成自己邮箱的imap服务器;qq邮箱不需要修改此值
- imap_server_host = "imap.qq.com"
- # 邮箱对应的pop服务器的监听端口。改成自己邮箱的pop服务器的端口;qq邮箱不需要修改此值
- imap_server_port = 993
- try:
- # 连接imap服务器。如果没有使用SSL,将IMAP4_SSL()改成IMAP4()即可其他都不需要做改动
- email_server = imaplib.IMAP4_SSL(host=imap_server_host, port=imap_server_port)
- print("imap4----connect server success, now will check username")
- except:
- print("imap4----sorry the given email server address connect time out")
- exit(1)
- try:
- # 验证邮箱及密码是否正确
- email_server.login(email_address,email_password)
- print("imap4----username exist, now will check password")
- except:
- print("imap4----sorry the given email address or password seem do not correct")
- exit(1)
- # 邮箱中其收到的邮件的数量
- email_server.select()
- email_count = len(email_server.search(None, 'ALL')[1][0].split())
- # 通过fetch(index)读取第index封邮件的内容;这里读取最后一封,也即最新收到的那一封邮件
- typ, email_content = email_server.fetch(f'{email_count}'.encode(), '(RFC822)')
- # 将邮件内存由byte转成str
- email_content = email_content[0][1].decode()
- print(email_content)
- # 关闭select
- email_server.close()
- # 关闭连接
- email_server.logout()
- if __name__ == "__main__":
- # 实例化
- email_client = operate_email()
- # 调用通过smtp发送邮件的发送函数
- email_client.send_email_by_smtp()
- # 调用通过pop3接收邮件的接收函数
- email_client.recv_email_by_pop3()
- # 调用通过imap4接收邮件的接收函数
- 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邮箱为例)的更多相关文章
- thinkphp5 邮件发送(qq邮箱为例)
一.首先需要你开启smtp 服务,登录qq邮箱,进入设置 -> 账户 注意: 开启后会生成授权码,一定要记下,两个都记下,登录邮件客户端需要.这里配置邮件发送也需要这个授权码 二. 下载phpm ...
- 【故障公告】SendCloud 邮件发送服务故障造成大量 QQ 邮箱收不到邮件
抱歉,由于我们所使用的搜狐旗下的 SendCloud 邮件发送服务出现故障,今天上午大量发往 @qq.com 邮箱的邮件无法正常发送,从 SendCloud 管理控制台看这些邮件一直处于“请求中”的状 ...
- 命令行发送SMTP协议邮件(163邮箱)
这里我们用163邮箱为例子,借助命令行发送smtp邮件 1.连接服务器 在终端上输入:telnet smtp.163.com 25 回车,然后就连接了服务器的25端口,成功会输出 220 163.co ...
- 解决使用Foxmail客户端软件不能收取腾讯企业邮箱的全部邮件
一般说来,使用Foxmail客户端软件收取邮箱时,需要作如下几步: 1.进入邮箱web界面授权开启POP3/SMTP服务.IMAP/SMTP等服务 2.在邮箱web界面配置收取选项,可选择收取全部邮件 ...
- Thinkphp3.2 PHPMailer 发送 QQ邮箱 163邮箱
在进入正题这前先看下网易(163)邮箱的服务器地址和端口号 类型 服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号 收件服务器 POP pop.163.com 995 110 收件服务器 ...
- SpringBoot系列(十四)集成邮件发送服务及邮件发送的几种方式
往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)web静 ...
- 【python3】基于 qq邮箱的邮件发送
脚本内容: #!/usr/bin/python3 # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText ...
- 使用Python内置的smtplib包和email包来实现邮件的构造和发送。
此文章github地址:https://github.com/GhostCNZ/Python_sendEmail Python_sendEmail 使用Python内置的smtplib包和email包 ...
- python3:利用SMTP协议发送QQ邮件+附件
转载请表明出处:https://www.cnblogs.com/shapeL/p/9115887.html 1.发送QQ邮件,首先必须知道QQ邮箱的SMTP服务器 http://service.mai ...
随机推荐
- C# linq 最大、最小对象的扩展
public static class LinqExtension { public static T MaxBy<T, TR>(this IEnumerable<T> en, ...
- JS中什么是发布--订阅模式?
转载文章部分内容: 发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. ...
- JavaSE习题 第四章 类与对象
问答题: 1.在声明类时,类名应该遵守哪些习惯? 1.与文件名相同2.首字母大写 2.类体内容中有那两类比较重要的成员? 1.成员变量2.方法 3.实例方法可以操作类变量吗?类方法可以操作实例变量吗? ...
- Kali Linux 更新源 操作完整版教程
一.查看kali系统的更新源地址文件 命令: vim /etc/apt/sources.list 上面这是kali官方的更新源: 拓展知识: 一个完整的源包括:deb 和 deb-src:上图源地址是 ...
- asp.net 虹软人脸识别sdk 释放内存
初始化时申请内存,用完记得释放,不然就会报“内存已满”的. 使用时: pMem = Marshal.AllocHGlobal(detectSize); 释放内存: Marshal.FreeHGloba ...
- Unity--- 纹理设置属性 alphaIsTransparency
官方的解释: 意思就是没什么实际效果,只是用做显示用. 参考:https://docs.unity3d.com/ScriptReference/Texture2D-alphaIsTransparenc ...
- sql server 学习笔记 ( backup 备份方案 )
做个记入就好 USE [master] SELECT bs.database_name AS 'Database Name', bs.backup_start_date AS 'Backup Star ...
- PyMongo官方文档翻译——VNPY
PyMongo是MongoDB数据库的python模块 VNPY默认的数据库,没有采用SQL类型的数据库,而是采用No-Sql类型的MongoDB数据库, 对于想了解VNPY内部结构的童鞋,多多少少会 ...
- nodejs使用log4js记录日志
log4j是java里面最好用的日志记录插件,在.net上面也有移植log4j.net.同样也移植到了nodejs里面,多的不说,把自测通过的代码粘出来吧. var log4js = require( ...
- Java从内存流中读取byte数组
Java中通过servlet接收二进制数据,然后将二进制数据流读取为byte数组.开始使用:byte[] bs = new byte[request.getContentLength()];reque ...