基于SMTP协议的电子邮件客户端程序

电子邮件的完整传输过程:
​ 发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- 收件人
MUA:邮件用户代理
MTA:邮件传输代理
MDA:邮件投递代理

# -*- coding: utf-8 -*-
"""
Created on Tue Dec 11 15:40:02 2018@author: yufeng
"""'''电子邮件的完整传输过程:发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- 收件人Python对SMTP支持有smtplib和email两个模块,eamil负责构造邮件,smtplib负责发送邮件邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给MTA,而是包含在发给MTA的文本中的,所以,我们必须把From、To和Subject添加到MIMEText中,才是一封完整的邮件
'''
import smtplib
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBasedef _format_addr(s):name, addr = parseaddr(s)return formataddr((Header(name, 'utf-8').encode(), addr))# 输入Email地址 和 密码; 收件人地址;SMTP服务器地址
from_addr = input('From: ')
password = input('Password: ')
to_addr = input('To: ')
smtp_server = 'smtp.sina.com'
smtp_port = 25# 设置收发邮件人,邮件主题,邮件正文
# 参数分别代表 邮件正文; MIME的subtype, 'plan'表示纯文本,最终是'text/plain'
# 第三个参数是编码格式,保证多种语言的兼容性# from:XXX@sina.com 这里必须加上发送邮箱地址,
# 参考: https://blog.csdn.net/weixin_36394146/article/details/81268466
#msg = MIMEText('from:fzhiy270@sina.comhello, send by Python...', 'plain', 'utf-8')#msg = MIMEText('<html><body><h1>Hello</h1>' +
#    '<p>send by <a href="http://www.python.org">Python</a>...</p>' +
#    '</body></html>', 'html', 'utf-8')# 邮件对象:
msg = MIMEMultipart()# 邮件正文是MIMEText:
#msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))
msg.attach(MIMEText('<html><body><h1>Hello</h1>' +'<p><img src="cid:0"></p>' +'</body></html>', 'html', 'utf-8'))# 添加附件就是加上一个MIMEBase,从本地读取一个图片:
with open(r'F:\workSpaces\PyCodes\spyder-py3\test.png', 'rb') as f:# 设置附件的MIME和文件名,这里是png类型:mime = MIMEBase('image', 'png', filename='test.png')# 加上必要的头信息:mime.add_header('Content-Disposition', 'attachment', filename='test.png')mime.add_header('Content-ID', '<0>')mime.add_header('X-Attachment-Id', '0')# 把附件的内容读进来:mime.set_payload(f.read())# 用Base64编码:encoders.encode_base64(mime)# 添加到MIMEMultipart:msg.attach(mime)msg['From'] = _format_addr('fzhiy270 <%s>' % from_addr)
msg['To'] = _format_addr('接收邮件测试账号 <%s>' % to_addr)
msg['Subject'] = Header('基于SMTP协议发送邮件的测试', 'utf-8').encode()# SMTP协议的默认端口号为25, SMTP协议是明文口令
server = smtplib.SMTP(smtp_server, smtp_port)
# 在创建SMTP对象后,立刻调用starttls()方法,就创建了安全连接
server.starttls()
server.set_debuglevel(1) # 打印出和SMTP服务器交互的所有信息
server.login(from_addr, password)
# 邮件正文是一个str,as_string()把MIMEText对象变成str。
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()

完整邮件接收:

HTML邮件接收:

发送附件的邮件接收:

发送图片:

小结

使用Python的smtplib发送邮件十分简单,只要掌握了各种邮件类型的构造方法,正确设置好邮件头,就可以顺利发出。

构造一个邮件对象就是一个Messag对象,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:

Message
+- MIMEBase+- MIMEMultipart+- MIMENonMultipart+- MIMEMessage+- MIMEText+- MIMEImage

这种嵌套关系就可以构造出任意复杂的邮件。你可以通过email.mime文档查看它们所在的包以及详细的用法。

如果你运行程序后没有找到发送后的邮件,可以去垃圾邮件看看

参考:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432005226355aadb8d4b2f3f42f6b1d6f2c5bd8d5263000

基于SMTP协议的电子邮件客户端程序相关推荐

  1. 使用java语言基于SMTP协议手写邮件客户端

    使用java语言基于SMTP协议手写邮件客户端 1. 说明 电子邮件是互联网上常见的应用,他是互联网早期的产品,直至今日依然受到广大用户的喜爱(在中国可能因为文化背景不同,电子邮件只在办公的时候常用) ...

  2. 电子邮件客户端程序_您更喜欢哪个电子邮件客户端?

    电子邮件客户端程序 爱它或恨它,对于我们大多数人来说,电子邮件是必不可少的. 尽管多年以来人们都在谈论取代它的下一件大事,但电子邮件似乎并不会很快消失. 与许多其他形式的通信相比,电子邮件的优势之一是 ...

  3. Java中使用SMTP协议发送电子邮件

    Java中使用SMTP协议发送电子邮件的具体的步骤: 1.首先需要获取发送邮件的Session对象 Session session = Session.getDefaultInstance(prope ...

  4. 计网实验c/c++ 电子邮件客户端程序实现发送接收邮件

    参照教材 6.5 节原理,设计一个电子邮件客户端程序. 可实现发送与接受. 如果发送邮件出去接受不到请把代码中的输出注释取消,运行确定错误地点 不懂的评论问 base64在线转码: https://b ...

  5. 基于SMTP协议的模拟邮件系统(计算机网络课程设计)

    目录 一.设计内容 二.所用到的知识 三.需求分析 四.运行效果 1.登录与注册 2.信息管理 3.邮件发送与收取 五.部分核心代码 1.SendServlet.java(实现邮件发送) 2.Rece ...

  6. 基于XMPP的IOS聊天客户端程序(XMPP服务器架构)

    最近看了关于XMPP的框架,以文本聊天为例,需要发送的消息为: <message type="chat" from="kang@server.com" t ...

  7. [iPhone高级] 基于XMPP的IOS聊天客户端程序(XMPP服务器架构)

    最近看了关于XMPP的框架,以文本聊天为例,需要发送的消息为: [html] view plaincopy <message type="chat" from="k ...

  8. daytime协议的服务器和客户端程序,用socket套接字实现daytime协议服务器和客户端程序.doc...

    文档介绍: 用socket套接字实现daytime协议服务器和客户端程序.doc一.设计目的为了提高同学的自主动手能力,把理论知识运用于实践中,从实践中更好的领悟所学的知识.二.题目要求及需求分析1. ...

  9. java gui论文_毕业设计论文-基于JAVA GUI的电子邮件客户端软件的设计与实现.doc

    毕业设计论文-基于JAVA GUI的电子邮件客户端软件的设计与实现.doc 还剩 41页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧, ...

最新文章

  1. mysql中0和空值_SQL中空值 和NULL的概念:
  2. linux中操作数据库的使用命令记录
  3. uml+oopc嵌入式c语言开发精讲_嵌入式开发中更接近底层的汇编与C语言
  4. 两列数据找出相同项自动对应_关于数据核对的6个超级技巧,用过的人都说好...
  5. 构造AlertDialog弹出框,根据量值实现然用户选择列表。
  6. 开源项目objective-zip
  7. 阿里云Link Security为企业级区块链提供易用性安全解决方案
  8. Microsoft Expression blend 3 新功能简介
  9. 微型计算机控制技术学科认识,微型计算机控制技术学习心得.docx
  10. 阿里大数据之路:数据模型篇大总结
  11. CentOS 7 yum update 报错 Failed to connect to 2404:6800:4012::200e: Network is unreachable
  12. JPA是什么?怎样开发JPA应用?
  13. 一文告诉你 K8s PR (Pull Request) 怎样才能被 merge?
  14. python stm32f401_STM32学习之GPIO配置 (STM32F401ZGT6)
  15. nginx配置-优化静态资源
  16. 肺管家科普:引发肺气肿的原因竟然是这些...
  17. 高德地图 瓦片地图上画圆,线段等
  18. 如何更新Nintendo Switch游戏
  19. 在 vi 编辑器中的命令模式下,删除当前光标处的字符使用 __ 命 令。
  20. A. Flipping Game(思维)Codeforces Round #191 (Div. 2)

热门文章

  1. android 获取剪切内容,Android Q 获取剪切板内容
  2. java包(package)的声明与访问
  3. 2022年道路运输企业主要负责人操作证考试题及答案
  4. 【TDA2x学习】待整理笔记
  5. ubuntu笔记本合盖不休眠设置
  6. c语言里面log函数怎么用
  7. 2022-2028全球与中国360度投影系统市场现状及未来发展趋势
  8. Teamcenter AWC安装问题记录
  9. 脚本之家c语言指针错误,wincc编译C语言脚本是出错!-工业支持中心-西门子中国...
  10. 结构化经验教训总结单