一些概念

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

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

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

邮件收发过程

  1. 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服务器地址、邮箱地址、口令

发送普通文本邮件

  1. from email import encoders
  2. from email.header import Header
  3. from email.mime.text import MIMEText
  4. from email.utils import parseaddr,formataddr
  5. import smtplib
  6.  
  7. mail_send='******@163.com'
  8. mail_passwd='******' #这是授权口令密码,不是邮箱登录密码
  9. mail_smtp='smtp.163.com'
  10. main_to=['******@**.com','******@163.com']
  11.  
  12. def _format_addr(s):
  13. name,addr=parseaddr(s)
  14. return formataddr((Header(name,'utf-8').encode(),addr))
  15.  
  16. '''Python2应该这这么写
  17. def _format_addr(s):
  18. name,addr=parseaddr(s)
  19. return formataddr(( Header(name, 'utf-8').encode(), addr.encode('utf-8') if isinstance(addr, unicode) else addr))
  20. '''
  21.  
  22. def send_mail(to_list,subject,content):
  23. msg=MIMEText(content,'plain','utf-8')
  24. msg['Subject']=Header(subject,'utf-8')
  25. msg['From']=_format_addr("我是发件人 <{}>".format(mail_send)) # Python2: msg['From']=_format_addr('我是发件人 <%s>' % mail_send) #
  26. msg['To']=",".join(to_list)
  27. try:
  28. server=smtplib.SMTP()
  29. server.connect(mail_smtp)
  30. server.login(mail_send,mail_passwd)
  31. server.sendmail(mail_send,to_list,msg.as_string())
  32. server.close()
  33. except Exception:
  34. print("Error")
  35.  
  36. send_mail(main_to,"发送测试","邮件发送文本成功")

发送带附件的邮件

  1. def send_mail_accessory(to_list,subject,content,filename):
  2. msg=MIMEMultipart()
  3. msg['Subject']=Header(subject,'utf-8')
  4. msg['From']=_format_addr("我是发件人 <{}>".format(mail_send))
  5. msg['To']=",".join(to_list)
  6. msg.attach(MIMEText(content,'plain','utf-8'))
  7.  
  8. with open(filename,mode='rb') as f:
  9. mime=MIMEBase('excel','xlsx',filename=filename.split('/')[2])
  10. mime.add_header('content-disposition','attachment', filename=filename.split('/')[2])
  11. mime.add_header('Content-ID', '<0>')
  12. mime.add_header('X-Attachment-Id', '')
  13. mime.set_payload(f.read())
  14. encoders.encode_base64(mime)
  15. msg.attach(mime)
  16.  
  17. server=smtplib.SMTP()
  18. server.connect(mail_smtp)
  19. server.login(mail_send,mail_passwd)
  20. server.sendmail(mail_send,to_list,msg.as_string())
  21. server.close()
  22.  
  23. send_mail_accessory(mail_to,"发附件测试","给你发了一个文件","/py3/xxx.xlsx")
  1.  

[PY3]——发送邮件的更多相关文章

  1. python模块之lib2to3(py2转py3自动化工具)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之lib2to3(py2转py3自动化工具) #http://tieba.baidu.com ...

  2. python3发送邮件

    import smtplib from email.mime.text import MIMEText from email.utils import formataddr import psutil ...

  3. 利用SQLServer数据库发送邮件

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 这个应用案例很多,一般都是预警,比如异常连接的时候,或者数据库报错的时候.等等,,, 先 ...

  4. C# 多种方式发送邮件(附帮助类)

    因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...

  5. JavaMail发送邮件

    发送邮件包含的内容有: from字段  --用于指明发件人 to字段      --用于指明收件人 subject字段  --用于说明邮件主题 cc字段     -- 抄送,将邮件发送给收件人的同时抄 ...

  6. 技术笔记:Indy控件发送邮件

    工作中有个需求需要发送邮件,因为使用的delphi6,所以自然就选择了indy组件,想想这事挺简单的.实现的过程倒是简单,看着Indy的demo很快就完了,毕竟也不是很复杂的功能. 功能要求: 1.压 ...

  7. mono中发送邮件并保存本次收件人的地址

    在ios端mono开发中,发送邮件可以选择调用ios原生email程序.有两种方式实现这种功能,一是程序跳转到ipad中email程序,另外一种是将发送邮件的界面在自己应用里弹出. 首先第一种方式的代 ...

  8. Azure 上通过 SendGrid 发送邮件

    SendGrid 是什么? SendGrid 是架构在云端的电子邮件服务,它能提供基于事务的可靠的电子邮件传递. 并且具有可扩充性和实时分析的能力.常见的用例有: 自动回复用户的邮件 定期发送信息给用 ...

  9. 使用nodemailer发送邮件

    今天闲来无事,一时兴起看了下如果使用javascript来发送邮件.经过调研发现,nodeJs可以实现这个功能. 具体的步骤如下: 1.安装依赖 npm install nodemailer -g ( ...

随机推荐

  1. Android SQLiteOpenHelper Sqlite数据库升级onUpgrade

    Android Sqlite数据库升级,在Android APP开发之中,非常常见: 在确定原来的数据库版本号之后,在原来数据库版本号+1,就会执行onUpgrade方法,进行数据库升级操作: 在on ...

  2. Git安全配置

      今天收到了阿里云异地登录的短信报警,登录阿里云后台发现,有人从深圳登录了我的服务器(本人在北京),查看详细信息一共登录了5次,前两次是使用的git用户进行登录,后两次已经变成了root用户,怀疑是 ...

  3. WPF/Silverlight开发的15个最佳实践(转发)

    英文出处:http://www.kunal-chowdhury.com/2010/08/some-best-practices-for-silverlight.html 作者:Kunal Chowdh ...

  4. 初识powershell、nuget powershell 调试

    初识powershell.nuget powershell 调试 补充 此文仅当做powershell的初步认识体验,关于nuget包里此脚本的使用官方已在vs2017停止支持,请看此文文末 前言 老 ...

  5. 避免图片路径访问405,可以用图片控件来显示局部相对路径,不需要域名就不会出现jpg静态资源访问错误

    <asp:Image ID="Image1" runat="server"/> protected void Page_Load(object se ...

  6. WPF 自定义下拉列表

    XAML代码: <Popup x:Name="popupStrategy" StaysOpen="False" PopupAnimation=" ...

  7. Visual Studio 编译信息细度显示设置

    visual studio 项目在编译时,可根据调试需要设置output窗口输出内容的详细程度,这对于bug或warning的解决具有很大帮助.具体设置如下: 依次点击:"Tools&quo ...

  8. Day 25 多态.

    一.多态的概念 多态指的是一类事物有多种形态.动物有多种形态:人,狗,猪 from abc import ABCMeta,abstractmethod class Animal(metaclass=a ...

  9. webpack快速入门——CSS文件打包

    1.在src下新建css文件,在css文件下新建index.css文件,输入以下代码 body{ background:pink; color:yellowgreen; } 2.css建立好后,需要引 ...

  10. jmeter插件之自定义场景图(万能场景设计)

    添加扩展插件 自定义线程组:jp@gc - Ultimate Thread Group 此线程组功能强大,可以实现多种场景设置,添加路径如图 参数含义解释 Start Threads Count:当前 ...