Python 使用Python语言收发电子邮件


文章目录

  • Python 使用Python语言收发电子邮件
  • 一、开发POP3邮件程序
    • 1.类
    • 2.方法
  • 二、开发SMTP邮件程序

  自从互联网诞生那一刻起,人们之间日常交互的方式便又多了一种新的渠道。从此以后,交流变得更加迅速快,更具有实时性。一时之间,很多网络通信产品出现在大家面前,例如 QQ、MSN和邮件系统,其中电子邮件更是经常被人们使用。使用Python语言可以开发出功能强大的邮件系统,在本节的内容中,将详细讲解使用Python语言开发邮件程序的过程。


一、开发POP3邮件程序

  在计算机应用中,使用 POP3 协议可以登录E-mail 服务器收取邮件。在 Python程序中,内置模块poplib提供了对 POP3邮件协议的支持。现在市面中大多数邮箱软件都提供了POP3收取邮件的方式,例如 Outlook 等E-mail客户端就是如此。开发者可以使用 Python语言中的poplib模块开发出一个支持POP3邮件协议的客户端脚本程序。

1.类

  在poplib模块中,通过如下所示的两个类实现POP3功能。

  (1)类 poplib.POP3 (host,port=POP3_ PORT[,timeout]):实现了实际的POP3协议,当实例初始化时创建连接。
 ● 参数port:如果省略port 端口参数,则使用标准 POP3端口(110)。
 ● 参数timeout:可选参数timeout 用于设置连接超时的时间,以秒为单位。如果未指定,将使用全局默认超时值。

  (2)类poplib.POP3_SSL(host, port=POP3_SSL_PORT, keyfile=None, certfile=None, timeout=None,context=None):是POP3的子类,通过SSL 加密的套接字连接到服务器。
 ● 参数port: 如果没有指定端口参数port,则使用标准的POP3 over SSL端口。
 ● 参数timeout: 超时的工作方式与上面的POP3构造函数中的相同。
 ● 参数context: 上下文对象,是可选的ssl.SSLContext对象,允许将SSL 配置选项,证书和私钥捆绑到单个(可能长期)结构中。
 ● 参数keyfile 和 certfile: 是上下文的传统替代方式,可以分别指向SSL的 PEM格式的
私钥和证书链文件连接。

  在 Python程序中,可以使用类POP3创建一个POP3对象实例。其语法原型如下所示:

POP3 (host, port)

 ● 参数host: POP3邮件服务
 ● 参数port: 服务器端口,一个可选参数,默认值为110。

2.方法

  在poplib模块中,常用的内置方法如下所示。

  (1)方法user()
  当创建一个POP3对象实例后,可以使用其中的方法user() 向POP3服务器发送用户名。其语法原型如下所示:

use (username)

  参数username表示登录服务器的用户名。

  (2)方法 pass()
  可以使用POP3对象中的方法pass_()(注意,在pass后面有一个下画线字符)向POP3服务器发送密码。其语法原型如下所示:

pass- (password)

  参数 password是指登录服务器的密码。

  (3)方法getwelcome()
  当成功登录邮件服务器后,可以使用POP3对象中的方法 getwelcome()获取服务器的欢迎信息。其语法原型如下所示:

getwelcome ()

  (4)方法set_debuglevel()。
  可以使用POP3对象中的方法set_debuglevel()设置调试级别。其语法原型如下所示:

set_debuglevel(level)

  参数level表示调试级别,用于显示与邮件服务器交互的相关信息。

  (5)方法stat()
  使用 POP3对象中的方法stat()可以获取邮箱的状态,例如邮件数、邮箱大小等。其语法原型如下所示:

stat ()

  (6)方法 list()
  使用POP3对象中的方法list()可以获得邮件内容列表,其语法原型如下所示:

list (which)

  参数 which是一个可选参数,如果指定则仅列出指定的邮件内容。

  (7)方法retr()
  使用POP3对象中的方法retr()可以获取指定的邮件。其语法原型如下所示:

retr(which)

  参数which 用于指定要获取的邮件。

  (8)方法 dele()
  使用POP3对象中的方法 dele()可以删除指定的邮件。其语法原型如下所示:

dele (whtch)

  参数which用于指定要删除的邮件。

  (9)方法top()
  使用POP3对象中的方法top()可以收取某个邮件的部分内容。其语法原型如下所示:

top (which, howmuch)

 ● 参数which: 指定获取的邮件。
 ● 参数howmuch:指定获取的行数。

  除了上面介绍的常用内置方法外,还可以使用POP3对象中的方法rset()清除收件箱中邮件的删除标记;使用POP3对象中的方法noop()保持同邮件服务器的连接;使用POP3对象中的方法quit()断开同邮件服务器的连接。
  要想使用Python获取某个email邮箱中邮件主题和发件人的信息,首先应该知道自己所使用的email的POP3服务器地址和端口。一般来说, 邮箱服务器的地址格式如下所示:

pop.主机名.域名

  而端口的默认值是110, 例如126邮箱的POP3服务器地址为pop.1214.com,端口为默认值110。
  例如在下面的实例代码中,演示了使用poplib库获取指定邮件中的最新两封邮件的主题和发件人的方法。

from poplib import POP3      #导入内置邮件处理模块
import re,email,email.header     #导入内置文件处理模块def decode_email_content(msg_src,names):         #定义解码邮件内容函数decode_email_content()msg = email.message_from_bytes(msg_src)  #email.message_from_bytes只可以在python 3中运行result = { }        #变量初始化for name in names:      #遍历namecontent = msg.get(name)     #获取nameinfo = email.header.decode_header(content)  #解码if info[0][1]:print ('---------------------------------')if info[0][1].find('unknown-') ==-1:        #如果是已知编码result[name] = info[0][0].decode(info[0][1])else:                       #如果是未知编码try:                    #异常处理result[name] = info[0][0].decode('gbk')except:result[name] = info[0][0].decode('utf-8')else:result[name] = info[0][0]       #获取解码结果return result       #返回解码结果if __name__== "__main__":pp=POP3("pop3.sina.com")      #实例化邮件服务器类pp.user('**********@sina.com')        #传入邮箱地址(可更改)pp.pass_('登录密码')           #密码设置(邮箱的密码)total,totalnum = pp.stat()  #邮件的数量和邮件总的字节数print (total,totalnum)      #打印显示统计信息for i in range(total-2,total):      #遍历获取最近的两封邮件hinfo,msgs,octet=pp.top(i+1,0)  #得到指定邮件中的第一行内容(从0开始)b=b''           #返回bytes类型的内容for msg in msgs:        #遍历msgb += msg+b'\n'items = decode_email_content(b,['subject','from'])   #遍历函数返回邮件主题print (items['subject'],'\nFrom:',items['from'])  #调用函数返回收件人的信息pp.quit()       #关闭连接

  在上述实例代码中,函数decode_email_content()的功能是使用email 包来解码邮件头,用POP3对象的方法连接POP3服务器井获取邮箱中的邮件总数。在程序中获取最近的两封邮件的邮件头,然后传递给函数decode_email_content()进行分析,并返回邮件的主题和发件人的信息。执行效果如图所示。

二、开发SMTP邮件程序

  SMTP即简单邮件传输协议,是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。在Python语言中,通过模块smtplib对SMTP协议进行封装,通过这个模块可以登录SMTP服务器发送邮件。有两种使用SMTP协议发送邮件的方式。
   (1)第一种:直接投递邮件,比如要发送邮件到邮箱aaa@163.com那么就直接连接163.com的邮件服务器,把邮件发送给aaa@163.com。
  (2)第二种:验证通过后的发送邮件,如你要发送邮件到邮箱aaa@163.com,不是直接发送到163.com,而是通过自己在sina.com 中的另一个邮箱来发送。 这样就要先连接sina.com中的SMTP服务器,然后进行验证,之后把要发到163com的邮件投到sina com上,sina.com会帮我们把邮件发送到163.com。
  在smtplib模块中,使用类SMTP可以创建一个SMTP对象实例,具体语法格式如下所示:

import smtplib
smtpobj = smtplib.SMTP (host,port,local_hostname)

  上述各个参数的具体说明如下所示。
 ● host:表示SMTP服务器主机,可以指定主机的IP地址或者域名,例如w3cschool.cc,这是一个可选参数。
 ● port: 如果你提供了host参数,需要指定SMTP服务使用的端口号。在一般情况,
SMTP端口号为25。
 ● local_hostname: 如果SMTP在本机上,只需要指定服务器地址为localhost即可。
  为了防止邮件被反垃圾邮件丢弃,这里采用前文中提到的第二种方法,即登录认证后再发送,例如下面的实例演示了这一用法。

import smtplib, email       #导入内置模块
#使用email模块构建一封邮件
chst = email.charset.Charset(input_charset = 'utf-8')
header = ("From: %s\nTO: %s\nSubject: %s\n\n"       #邮件主题%("**********@sina.com",      #邮箱地址"********@qq.com" ,       #收件人chst.header_encode("Python smtplib 测试!")))    #邮件头
body = "你好!"        #邮件内容
email_con = header.encode('utf-8') +body.encode( 'utf-8')   #构建邮件完整内容,中文编码处理
smtp = smtplib.SMTP("smtp.sina.com")        #邮件服务器
smtp.login('**********@sina.com','登录密码')       #用户名和密码登邮箱
smtp.sendmail("**********@sina.com","********@qq.com",email_con)
smtp.quit()     #退出系统

  在上述实例代码中,使用新浪的SMTP服务器邮箱**********@sina.com发送邮件,收件人的邮箱地址是********@qq.com。首先使用email.charset.Charset()对象对邮件头进行编码,然后创建SMTP对象,并通过验证的方式给********@qq.com发送一封测试邮件 。因为在邮件的主体内容中含有中文字符,所以使用encode()函数进行编码。执行后的效果如图所示:

自学Python 64 使用Python语言收发电子邮件相关推荐

  1. 自学编程是从python语言还是c语言开始-初中生想学编程,请问先学C语言好还是先学Python?...

    市面上常见的几种编程语言就是:c,c++,c#,java,python,这几种我都学过,所以建议从python开始. 原因就是: (1)python简单好上手 c的数据类型很麻烦,而python就相对 ...

  2. python的优点和缺点-Python语言的优缺点,你知道吗?

    Python被称为是机器学习最优秀的语言,没有之一.很多人不禁会问,Python究竟有什么优点呢?能够在短短时间内上升为编程界最受欢迎的语言.今天,千锋武汉Python培训小编就详细讲解一下Pytho ...

  3. python中文下载官网_python下载|python 64位 v3.7.3 官方中文最新版 - 软件下载 - 绿茶软件园|33LC.com...

    python 64位是款面向对象的编程语言.python 64位具有非常多的优点,支持交互式运行.支持图形方式运行.支持模块和包.支持拓展,支持各类函数库,是款即译式的.互动的编程语言,是非常受程序员 ...

  4. 64岁Python之父退休失败,正式加入微软搞开源

    来源 | CSDN 今天,64岁的Python 之父 Guido van Rossum 在 Twitter 上正式宣布,退休太无聊,如今加入了微软开发者部门. Guido van Rossum 去年宣 ...

  5. 免费学python的网站-python自学网站

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 继上一篇「python自学之路-序」之后,决定开始零基础学习python ...

  6. 没有c语言基础可以学python吗-没有c语言基础,能不能学好python?

    学习C语言对学好python有帮助吗? 答案是有. 学好python需不需要有C语言基础? 答案是不一定. 实际上,所有的编程语言都是在做一件事情--告诉计算机,将你输入的数据A如何转化成需要输出的数 ...

  7. python课程内容-Python自学难吗?有哪些课程内容?

    自学一门技能,本身就有难度,更何况还是编程类型的Python,要是有兴趣还好说,兴趣是 原始动力.但是光有兴趣还远远不够,要足够坚持才能学有所成.那么Python自学难吗?本 文将为大家来解答! 前期 ...

  8. 我要自学网python视频教程_人生苦短,请用Python!学习Python的四大理由

    "人生苦短,请用Python!" 零基础学Python 作为一个学习过编程语言的过来人,如果是自己自学编程,我推荐学Python. 虽然在高校中,大部分学校依然还在采用C语言来进行 ...

  9. 自学python推荐书-学习python求推荐一波书籍?

    豆瓣最受好评的20本Python书 No.1 Fluent Python(豆瓣评分:9.6) />Many programmers who learn Python basics fall in ...

最新文章

  1. try finally 中的return
  2. Javascript单线程实现
  3. 第一百零四节,JavaScript时间与日期
  4. 跳一跳python源码下载_微信跳一跳python代码实现
  5. history linux 日志服务器_Linux下使用rsyslog部署日志服务器 记录history并发送到rsyslog服务器...
  6. Ubuntu 12.04 静态ip的设置方法
  7. java中JOptionPane类_Java学习之JOptionPane类
  8. 审计风险控制流程的起点_【经验分享】审计整改流程体系的优化措施
  9. 在win10在使用cmder代替Linux是怎样的体验
  10. 【Kettle】date类型不能被excel输出
  11. Docker 安装与操作 Mysql 数据库快速入门
  12. 为什么JavaScript声明变量的时候鼓励加var关键字
  13. 中移苏研大规模资源高可用研究及实践
  14. 19、删除链表的倒数第N个节点(python)
  15. win10熄屏时间不对_电脑熄屏时间怎么设置win10的
  16. python判断火车票座位是否靠窗_Python查询火车票(一)
  17. 机器学习_正态分布下的贝叶斯分类器
  18. 现代计算机图形学笔记(六)——布林-冯反射模型、图形管线、纹理映射
  19. 软考倒计时26天,最后冲刺阶段
  20. 魔兽半月谈——NSL全灭 国手需自强

热门文章

  1. 两化融合是从工业大国向工业强国转变必由之路
  2. PhpSpreadsheet实现Excel操作
  3. 「Slack」- 安装 @20210303
  4. 科技交流英语(2022秋)Unit 6 test
  5. mysql创建用户只能访问数据库中一张表
  6. import-html-entry]: error occurs while executing entry script, 乾坤加载子应用路由报错
  7. 骞云科技DevOps实践
  8. 洗衣机程序c语言代码大全,全自动洗衣机控制器设计的单片机代码
  9. Kaggle数据竞赛记录 - Steel Defect Detection
  10. vi 编辑器的使用 笔记