[PY3]——发送邮件

一些概念

MUA:Mail User Agent——邮件用户代理,例如OutLook、Foxmail

MTA:Mail Transfer Agent——邮件传输代理,例如163.com、sina.com这些Email服务提供商

MDA:Mail Delivery Agent——邮件投递代理,邮件投递的最终目的地、就像一个存储有点的数据库一样

 

邮件收发过程

send@163.com -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- receive@sina.com

1. 写邮件:通过MUA这样的软件完成,并由MUA负责发送

2. 传输过程:自己的电子邮件是@163.com,所以会首先被投递给网易提供的MTA,再由网易的MTA发送给新浪的MTA,中间可能还会经过别的MTA

3. 投递到最终目的地:最终新浪的MTA会把Email投递到MDA中,就相当于发送到了receive@sina.com这个电子邮箱中了,这封Email内容被放到了新浪的某个服务器(数据库)上

4. 收件人看到邮件内容:Email之所以不会直接到达对方的电脑,就因为对方电脑不一定开机,开机也不一定联网,那最终收件人提取邮件时,是通过MUA从MDA上获取的

 

协议

发邮件时:

  MUA通过SMTP协议将Email发送到MTA

        发邮件时需要先配置SMTP服务器,例如163提供的SMTP服务器地址:smtp.163.com

        为了证明你是163.com用户,MTA需要验证SMTP服务器地址、邮箱地址、口令

收邮件时:

  MUA从MDA收邮件使用的协议有两种:POP3 / IMAP(IMAP不但能读取邮件还能直接操作MDA上存储的邮件)

        为了防止你冒充他人收邮件,MDA需要验证POP3/IMAP服务器地址、邮箱地址、口令

发送普通文本邮件

from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr,formataddr
import smtplib

mail_send='******@163.com'
mail_passwd='******'      #这是授权口令密码,不是邮箱登录密码
mail_smtp='smtp.163.com'
main_to=['******@**.com','******@163.com']

def _format_addr(s):
    name,addr=parseaddr(s)
    return formataddr((Header(name,'utf-8').encode(),addr))

'''Python2应该这这么写
def _format_addr(s):
    name,addr=parseaddr(s)
    return formataddr(( Header(name, 'utf-8').encode(), addr.encode('utf-8') if isinstance(addr, unicode) else addr))
'''

def send_mail(to_list,subject,content):
    msg=MIMEText(content,'plain','utf-8')
    msg['Subject']=Header(subject,'utf-8')
    msg['From']=_format_addr("我是发件人 <{}>".format(mail_send)) # Python2: msg['From']=_format_addr('我是发件人 <%s>' % mail_send) #
    msg['To']=",".join(to_list)
    try:
        server=smtplib.SMTP()
        server.connect(mail_smtp)
        server.login(mail_send,mail_passwd)
        server.sendmail(mail_send,to_list,msg.as_string())
        server.close()
    except Exception:
        print("Error")

send_mail(main_to,"发送测试","邮件发送文本成功")

 

发送带附件的邮件

def send_mail_accessory(to_list,subject,content,filename):
    msg=MIMEMultipart()
    msg['Subject']=Header(subject,'utf-8')
    msg['From']=_format_addr("我是发件人 <{}>".format(mail_send))
    msg['To']=",".join(to_list)
    msg.attach(MIMEText(content,'plain','utf-8'))

    with  open(filename,mode='rb') as f:
        mime=MIMEBase('excel','xlsx',filename=filename.split('/')[2])
        mime.add_header('content-disposition','attachment', filename=filename.split('/')[2])
        mime.add_header('Content-ID', '<0>')
        mime.add_header('X-Attachment-Id', '0')
        mime.set_payload(f.read())
        encoders.encode_base64(mime)
        msg.attach(mime)

        server=smtplib.SMTP()
        server.connect(mail_smtp)
        server.login(mail_send,mail_passwd)
        server.sendmail(mail_send,to_list,msg.as_string())
        server.close()

send_mail_accessory(mail_to,"发附件测试","给你发了一个文件","/py3/xxx.xlsx")

 

 

 


 

posted @ 2017-10-20 15:52  Jelly_lyj  阅读(189)  评论(0编辑  收藏  举报