电子邮件相关协议
电子邮件协议有SMTP、POP3、IMAP4,它们都隶属于TCP/IP协议簇,默认状态下,分别通过TCP端口25、110和143建立连接
前言
Internet电子邮件系统是基于客户机/服务器方式,客户端也叫用户代理(User Agent),提供用户界面,负载邮件发送的准备工作,如邮件的起草、编辑以及向服务器发送邮件或从服务器取邮件等。服务器端也叫传输代理(Message Transfer Agent),负责邮件的传输,它采用端到端的传输的传输方式,源端主机参与邮件传输的全过程。
一、SMTP协议
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是Internet上基于TCP/IP的应用层协议,使用于主机与主机之间的电子邮件交换。SMTP的特点是简单,它只定义了邮件发送方和接收方之间的连接传输,将电子邮件有一台计算机传送到另一台计算机,而不规定其他任何操作
#!/usr/bin/python3
import smtplib
from smtplib import SMTP
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import time
host = 'smtp.qq.com' #邮箱的接口
port = '465' #端口
pwd = 'xxxxxxxx' #授权码
sender = 'xxxxxxxx@qq.com' #发送方
receiver = "xxxxxx@qq.com" #接收方
def SetMsg():
'''
设置邮件格式
'''
msg = MIMEMultipart('mixed')
#标题
msg['Subject'] = '爱你的我'
msg['From'] = sender
msg['To'] = receiver
#邮件正文内容
text = '快看我美丽的容颜'
text_plain = MIMEText(text,'plain','utf-8') #正文转码
msg.attach(text_plain)
return msg.as_string()
def SendEmail(msg):
'''
发送邮件
:msg :邮件内容
:return
'''
try:
smtp = smtplib.SMTP_SSL(host,port) #创建一个邮件服务
smtp.login(sender,pwd)
smtp.sendmail(sender,receiver,msg)
time.sleep(3)
smtp.quit() #退出邮件服务
except smtplib.SMTPException as e:
print("出错啦")
if __name__ == '__main__':
# 2. 设置邮件格式
msg = SetMsg()
# 3. 发送邮件
SendEmail(msg)
python的smtplib库和email库提供了很多有用的接口函数,也有许多合适的第三方包,可以实现正常用邮箱能做到的绝大部分功能,最关键是可以通过编写定时脚本来实现自动化功能
想学习golang版本的同学可以看一下这篇文章,强烈推荐!
二、POP协议
POP邮局协议负责从邮件服务器中检索电子邮件。
它要求邮件服务器完成下面几种任务之一:
- 从邮件服务器中检索邮件并从服务器中删除这个邮件;
- 从邮件服务器中检索邮件但不删除它;
- 不检索邮件,只是询问是否有新邮件到达。
POP协议支持多用户互联网邮件扩展,后者允许用户在电子邮件上附带二进制文件,如文字处理文件和电子表格文件等,实际上这样就可以传输任何格式的文件了,包括图片和声音文件等。
在用户阅读邮件时,POP命令所有的邮件信息立即下载到用户的计算机上,不在服务器上保留。
POP3(Post Office Protocol 3)即邮局协议的第3个版本,是因特网电子邮件的第一个离线协议标准。
代码如下(示例):
import poplib
emailServer = poplib.POP3('xxx.xxx.xxx.xxx')
emailServer.user('xxx@qq.com')
emailServer.pass_('xxxxxxx')
# 获取一些统计信息
emailMsgNum, emailSize = emailServer.stat()
print('email number is %d and size is %d'%(emailMsgNum, emailSize))
# 遍历邮件,并打印出每封邮件的标题
for i in range(emailMsgNum):
for piece in emailServer.retr(i+1)[1]:
if piece.startswith('Subject'):
print('\t' + piece)
break
emailServer.quit()
我浅显的认为模拟pop3协议的难度不在于连接并获取信息,python和golang都给出了很多可用的模块包,但是如果邮件里含有附件,拿到的数据信息需要解析,这一步工作应该比较难,鉴于只是初步学习一下pop3协议,所以没去深入研究
总结
提示:希望友友们多多转发
本文只是初步介绍了电子邮件相关的SMTP和POP协议,但是实际上电子邮件相关协议还有IMAP、MIME等,只是对于学生而言不太常见