- 一封电子邮件的历程是:
- 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方法