一、几个专业名词:MUA 、MTA、MDA

假设我们自己的电子邮件地址是me@163.com,对方的电子邮件地址是friend@sina.com(注意地址都是虚构的哈),现在我们用Outlook或者Foxmail之类的软件写好邮件,填上对方的Email地址,点“发送”,电子邮件就发出去了。这些电子邮件软件被称为MUA:Mail User Agent——邮件用户代理。

Email从MUA发出去,不是直接到达对方电脑,而是发到MTA:Mail Transfer Agent——邮件传输代理,就是那些Email服务提供商,比如网易、新浪等等。由于我们自己的电子邮件是163.com,所以,Email首先被投递到网易提供的MTA,再由网易的MTA发到对方服务商,也就是新浪的MTA。这个过程中间可能还会经过别的MTA,但是我们不关心具体路线,我们只关心速度。

Email到达新浪的MTA后,由于对方使用的是@sina.com的邮箱,因此,新浪的MTA会把Email投递到邮件的最终目的地MDA:Mail Delivery Agent——邮件投递代理。Email到达MDA后,就静静地躺在新浪的某个服务器上,存放在某个文件或特殊的数据库里,我们将这个长期保存邮件的地方称之为电子邮箱。

同普通邮件类似,Email不会直接到达对方的电脑,因为对方电脑不一定开机,开机也不一定联网。对方要取到邮件,必须通过MUA从MDA上把邮件取到自己的电脑上。

所以,一封电子邮件的旅程就是:

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

有了上述基本概念,要编写程序来发送和接收邮件,本质上就是:

  1. 编写MUA把邮件发到MTA;

  2. 编写MUA从MDA上收邮件。

发邮件时,MUA和MTA使用的协议就是SMTP:Simple Mail Transfer Protocol,后面的MTA到另一个MTA也是用SMTP协议。

收邮件时,MUA和MDA使用的协议有两种:POP:Post Office Protocol,目前版本是3,俗称POP3;IMAP:Internet Message Access Protocol,目前版本是4,优点是不但能取邮件,还可以直接操作MDA上存储的邮件,比如从收件箱移到垃圾箱,等等。

邮件客户端软件在发邮件时,会让你先配置SMTP服务器,也就是你要发到哪个MTA上。假设你正在使用163的邮箱,你就不能直接发到新浪的MTA上,因为它只服务新浪的用户,所以,你得填163提供的SMTP服务器地址:smtp.163.com,为了证明你是163的用户,SMTP服务器还要求你填写邮箱地址和邮箱口令,这样,MUA才能正常地把Email通过SMTP协议发送到MTA。

类似的,从MDA收邮件时,MDA服务器也要求验证你的邮箱口令,确保不会有人冒充你收取你的邮件,所以,Outlook之类的邮件客户端会要求你填写POP3或IMAP服务器地址、邮箱地址和口令,这样,MUA才能顺利地通过POP或IMAP协议从MDA取到邮件。

在使用Python收发邮件前,请先准备好至少两个电子邮件,如xxx@163.comxxx@sina.comxxx@qq.com等,注意两个邮箱不要用同一家邮件服务商。

MTP用于发送邮件,如果要收取邮件呢?

收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上。收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3

Python内置一个poplib模块,实现了POP3协议,可以直接用来收邮件。

注意到POP3协议收取的不是一个已经可以阅读的邮件本身,而是邮件的原始文本,这和SMTP协议很像,SMTP发送的也是经过编码后的一大段文本。

要把POP3收取的文本变成可以阅读的邮件,还需要用email模块提供的各种类来解析原始文本,变成可阅读的邮件对象。

所以,收取邮件分两步:

第一步:用poplib把邮件的原始文本下载到本地;

第二部:用email解析原始文本,还原为邮件对象。

######################################################################################################

客户端程序SMTP和POP3示例

使用SMTP和POP3创建一个既能接收和下载电子邮件也能上传和发送电子邮件的客户端

#!/usr/bin/env python
#-*- coding:UTF-8 -*-
from smtplib import SMTP
from poplib import POP3
from time import sleepSMTPSVR='smtp.python.is.cool'
POP3SVR='pop.python.is.cool'

who='wesley@python.is.cool'
body='''\
From:%(who)s
To:%(who)s
Subject:test msg
Hello World!
'''%{'who':who}sendSvr=SMTP(SMTPSVR)
errs=sendSvr.sendmail(who,[who],origMsg)
sendSvr.quit()
assert len(errs) == 0,errs
sleep(10)   #wait for mail to be delivered

recvSvr=POP3(POP3SVR)
recvSvr.user('wesley')
recvSvr.pass_('youllNeverGuess')
rsp,msg,siz=recvSvr.retr(recvSvr.stat()[0])
#strip headers and compare to orig msg
sep=msg.index('')
recvBody=msg[sep+1:]
assert origBody == recvBody #assert identical

python实现电子邮件编程相关推荐

  1. Python 的电子邮件编程

    目录 python 的电子邮件编程 1.开启SMTP服务设置, 获取验证码 2.编写Python程序发送邮件示例 python 的电子邮件编程 两个内建模块 email 模块, 用于准备邮件内容的模块 ...

  2. 使用Python发送电子邮件

    by Arjun Krishna Babu 通过Arjun Krishna Babu 如何使用Python发送电子邮件 (How to send emails using Python) As a l ...

  3. 《Python数据可视化编程实战》——5.5 用OpenGL制作动画

    本节书摘来异步社区<Python数据可视化编程实战>一书中的第5章,第5.5节,作者:[爱尔兰]Igor Milovanović,更多章节内容可以访问云栖社区"异步社区" ...

  4. PYTHON黑帽编程1.5 使用WIRESHARK练习网络协议分析

    Python黑帽编程1.5  使用Wireshark练习网络协议分析 1.5.0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks At ...

  5. Python黑帽编程2.4 流程控制

    Python黑帽编程2.4  流程控制 本节要介绍的是Python编程中和流程控制有关的关键字和相关内容. 2.4.1 if -..else 先上一段代码: #!/usr/bin/python # - ...

  6. Python面对对象编程——对象、类详解及实例

    Python中类与对象的初认识 1.Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的 ...

  7. python的socket编程_Python Socket编程详细介绍

    在使用Python做socket编程时,由于需要使用阻塞(默认)的方式来读取数据流,此时对于数据的结束每次都需要自己处理,太麻烦.并且网上也没找到太好的封装,所以就自己写了个简单的封装. 封装思路 1 ...

  8. Python黑帽编程 3.1 ARP欺骗

    Python灰帽编程 3.1 ARP欺骗 ARP欺骗是一种在局域网中常用的攻击手段,目的是让局域网中指定的(或全部)的目标机器的数据包都通过攻击者主机进行转发,是实现中间人攻击的常用手段,从而实现数据 ...

  9. python采用函数式编程模式吗_Python函数与函数式编程

    1 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创 ...

  10. python趣味编程100_《Python游戏趣味编程》 第8章 勇闯地下一百层

    知乎视频​www.zhihu.com 图书简介可以看这里:童晶:<Python游戏趣味编程>新书上架了​zhuanlan.zhihu.com 本章我们将编写一个勇闯地下一百层的游戏,键盘控 ...

最新文章

  1. Mac os x下配置nginx + php
  2. DB2临时表空间的作用
  3. as2.0与php交互,Flash(AS2.0)与php通讯 分享
  4. Kudu报错:你的主机中的软件终止了一个已建立的链接
  5. JAVA单例模式 关于延迟加载问题
  6. STM8学习笔记---利用PWM功能输出SPWM波
  7. python文件写入乱码_python写文件打开后是乱码
  8. CentOS 7.4系统安装配置图解教程
  9. excanvas让canvas兼容ie7,8
  10. 毕业之际,个人学习感言和收获
  11. 大数据在电力行业的应用前景有哪些?
  12. 压缩感知中常用的待还原信号种类
  13. SPSS modeler for mac安装教程
  14. DFS和BFS算法框架
  15. 全民一起玩Python提高篇第十五课:函数式编程初步(下)
  16. Chang-Xiao Li Machine Learning 2019 Task5
  17. mysql translate 函数_Oracle字符串函数-Translate()总结
  18. 宇言(四):关于时间循环
  19. 一文教你学会使用GitHub!(附视频)
  20. Rocket-api 调研

热门文章

  1. Flume avro client和hdfs sink 完成自定义目录文件收集
  2. Bottom Sheet
  3. 【Flink】Flink 做检查点 报错 Checkpoint Coordinator is suspending.
  4. git 如何下载单个文件夹或者单个文件
  5. 打不开磁盘*或它所依赖的某个快照磁盘
  6. 阿里天池:小样本商标检测(baseline0.50)
  7. 从乡巴佬到世界首富,连续7年蝉联全球最大公司:真正厉害的人,都敢于不走寻常路...
  8. 林彪-怎样当好一名师长
  9. chmod 权限详细解析(rw)
  10. 计算机sci多少字,一篇英文sci论文多少字