- 一封电子邮件的历程是:
- MUA:Mail User Agent——邮件用户代理。(即类似Outlook的电子邮件软件)
- MTA:Mail Transfer Agent——邮件传输代理,就是那些Email服务提供商,比如网易、新浪等等。
- MDA:Mail Delivery Agent——邮件投递代理。 最终目的地
发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- 收件人
要编写程序来发送和接收邮件,本质上就是:
- 编写MUA把邮件发到MTA;
- 编写MUA从MDA上收邮件。
发邮件时MTA与MUA使用的协议都是SMTP;
收邮件时有两种协议:一种是POP3,另一种是IMAP,优点是不但能取邮件,还可以直接操作MDA上存储的邮件,比如从收件箱移到垃圾箱,等等。(推荐使用)
最后特别注意,目前大多数邮件服务商都需要手动打开SMTP发信和POP收信的功能,否则只允许在网页登录
发送邮件:
Python对SMTP支持有smtplib
和email
两个模块,email
负责构造邮件,smtplib
负责发送邮件
from email.mime.text import MIMEText
from email.mime.text import MIMEText
# email模块负责构造邮件
# 类email.mime.text.MIMEText(_text),是使用字符串_text来生成MIME对象的主体文本
# MIME是(Multipurpose Internet Mail Extensions) 多用途互联网邮件扩展类型
# MIME是设置将某种扩展名文件用一种应用程序来打开的方式类型
# MIME设置的目的是为了在发送电子邮件时附加多媒体数据,让邮件根据其类型进行处理。
from email import encoders
from email import encoders
# email.encoders 功能是编码器
from email.header import Header
# 如果你想让你的邮件标题使用非ASCII字符集,就要使用email.header编码非ASCII字符集
# email.header.Header(s=None, charset=None, maxlinelen=None, header_name=None, continuation_ws=' ', errors='strict')
# 创建一个能容纳不同字符集的字符串的MIME对象的标头 # 其中,s:初始标头,即要编码之前的标头
# 其中,chatset:字符集,默认为ASCII # 其中,maxlinelen:标头名的行的最大长度,默认为76 # 其中,header_name:标头名,默认无
# 其中,continuation_ws:默认为单个空格字符
# 其中,errors:直接传递到Header的append()方法里
from email.utils import parseaddr, formataddr
from email.utils import parseaddr, formataddr
# email.utils:杂项工具
# email.utils.parseaddr(address):解析地址的功能,
# 其中,address是一个包含用户名和email地址的值(realname<address>),返回一个二元组(realname, email address)
# email.utils.formataddr(pair, charset='utf-8')
# 其中,pair是二元组(realname, email address)
# 其中,charset是字符串,默认为utf-8 # 实际上,parseaddr(), formataddr(),两者互逆
import smtplib
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name,'utf-8').encode(), addr))
from_addr = input('From: ')
password = input('授权码:')
#接收邮件的人
to_addr = input('To:')
#smtp服务器的地址
smtp_server = input('Server:')
#邮件的内容:
msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
msg['From'] = _format_addr('美美哒的妹子<%s>' % from_addr)
msg['To'] = _format_addr('给萌萌哒的妹子<%s>' % to_addr)
msg['Subject'] = Header('来自Python的问候...','utf-8').encode()
#发送文件
server = smtplib.SMTP_SSL(smtp_server,465)
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr,[to_addr],msg.as_string())
server.quit()
import smtplib
# smtplib模块负责发送邮件
# 类smtplib.SMTP([host[, port[, local_hostname[, timeout]]]]) :SMTP对象 # 其中,host:smtp服务器主机名 # 其中,port:smtp服务器的端口,默认是25
# 如果在创建SMTP对象时定义了这两个参数,在初始化时会自动调用connect方式连接服务器
# smtplib模块还提供了SMTP_SSL类和LMTP类,对它们的操作与SMTP基本一致。 # SSL是一种安全传输,LMTP是与SMTP不同的另一种传输协议
特别注意的是QQ邮箱登录需要免登陆,即使用SMTP_SSL方法