• 一封电子邮件的历程是:
  •  MUA:Mail User Agent——邮件用户代理。(即类似Outlook的电子邮件软件)
  •  MTA:Mail Transfer Agent——邮件传输代理,就是那些Email服务提供商,比如网易、新浪等等。
  •  MDA:Mail Delivery Agent——邮件投递代理。 最终目的地

          发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- 收件人

要编写程序来发送和接收邮件,本质上就是:

  1. 编写MUA把邮件发到MTA;
  2.  编写MUA从MDA上收邮件。

发邮件时MTA与MUA使用的协议都是SMTP;

收邮件时有两种协议:一种是POP3,另一种是IMAP,优点是不但能取邮件,还可以直接操作MDA上存储的邮件,比如从收件箱移到垃圾箱,等等。(推荐使用)

最后特别注意,目前大多数邮件服务商都需要手动打开SMTP发信和POP收信的功能,否则只允许在网页登录

发送邮件:

         Python对SMTP支持有smtplibemail两个模块,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方法