MIME 通过定制的一个Content-Type,让接受者知道如何显示它。内容类型有:text/plain 、text/html、image/jpeg、video/mpeg、audio/mp3;他们分别是:主类型/子类型。

使用带附件的MIME消息:

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplibmsg = MIMEMultipart()att1 = MIMEText(open('c:\\unintall.log', 'rb').read(), 'base64', 'gb2312')
att1['Content-type'] = 'application/octet-stream'
att1['Content-Disposition'] = 'attachment; filename="123.txt"'
msg.attach(att1)att2 = MIMEText(open('c:\\unintall.log', 'rb').read(), 'base64', 'gb2312')
att1['Content-type'] = 'application/octet-stream'
att1['Content-Disposition'] = 'attachment; filename="123.txt"'
msg.attach(att1)msg['to'] = '******@qq.com'
msg['from'] = 'username@163.com'
msg['subject'] = 'hello world'
try:server = smtplib.SMTP()server.connect('smtp.163.com')server.login('username', 'password')server.sendmail(msg['from'], msg['to'], msg.as_string())server.quit()print('send success')
except Exception, e:print(str(e))

在这里通过添加了两个附件。并且这两个附件在对方的显示邮件中为:123.txt.

顺便在这里简单那说明一下发送邮件的流程

1、因为要添加带附件的邮件,所以要先构造一个MIMEMultipart的对象,然后想要添加的东西往里面塞。最后在讲该对象通过邮件发送出去。

2、添加的附件:这里有两个附件,这里以读二进制文件的形式打开了我电脑上存在的一个文件,然后指定了编码方式是base64,该编码方式是以二进制的方式在网络上进行传送。因为这里是文件不是字符串,所以必须以二进制的方式进行传送。不论带附件的是jpg还是其他压缩文件也是可以这么做。第三个参数指定的是gb2312这个是为了能够支持中文的形式。然后在指定这个Content-type 是'application/octet-stream'的方式进行传送,即8个位的流方式。 然后指定了'Content-Disposition' 的是'attachment; filename="123.txt"' 即指定了部署到对方邮件上的附件的该文件名重命名为123.txt.  然后就可以讲该附件attach到MIMEMultipart上面

这里传送图片的时候,也可以使用MIMEImage 来替换MIMEText  如果要在正文中显示的话,就需要使用MIMEImage

3、发送需求:连接到本身账户的服务器上面即:smtp.***.com  现在一般的邮箱都需要身份验证,所以connect到服务器之后,需要进行login() 到该服务器,登陆完成之后就可以进行邮件的发送,sendmail(from, to, msg) 发送成功没有发生异常之后。可以退出跟本身邮箱服务器的通信,即断开链接quit

接下来是一个在正文中显示图片的一个例子

import smtplib
import mimetypes
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImagedef AutoSendMail():subject = 'html'smtpserver = 'smtp.163.com'msgRoot = MIMEMultipart()msgRoot['Subject'] = 'testMessage'msgText = MIMEText('邮件<img src="cid:image2"/><img src="cid:image1"/><br>good!', 'html', 'gb2312')msgRoot.attach(msgText)fp = open('D:\\123.jpg', 'rb')msgImage = MIMEImage(fp.read())fp.close()msgImage.add_header('Content-ID', '<image1>')msgRoot.attach(msgImage)fp = open('D:\\xl.jpg', 'rb')msgImage = MIMEImage(fp.read())fp.close()msgImage.add_header('Content-ID', '<image2>')msgRoot.attach(msgImage)server = smtplib.SMTP()server.connect('smtp.163.com')server.login('username', 'password')server.sendmail('username@163.com', 'destname@qq.com', msgRoot.as_string())server.quit()if __name__ == '__main__':AutoSendMail()

在这里使用的是html的方式在文本中进行显示,其实是为了能够在正文中显示图片。在这里的MIMEText中使用了中文,还有html的格式。  第一个参数是正文要显示的方式,使用了<img src="cid:image2"/> 这里就是指定在该位置要显示的图片,在msgRoot 的attach中存在的一个名字,即下文中的msgImage.add_header中的ID为image1的文件。因为在文中出现了html所以,这里要以html的方式进行发送,否则可能会被识别为附件。

这里添加的图片,是以MIMEImage类的方式来进行操作。然后在加入的msgImage。add_header中,指定了ID 为了能够让正文识别该图片是为了显示在正文中,如果图片没有被用到正文中,则该文件,将被当成附件的形式发送到对方的邮件中。

接下来是简单的ssl邮件的发送

msg = MIMEText('你好', 'plain', 'gb2312')
msg['subject'] = Header(subject, 'gb2312')smtp = smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.ehlo()
smtp.starttls()
smtp.ehlo()
smtp.set_debuglevel(1)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()

这里在链接到smtp服务器之后,先进行了一系列的操作,ehlo

来自百度百科:支持SMTP服务扩展的客户应该以EHLO命令开始SMTP会话,而不是通常的HELO命令。如果服务器也支持,那就返回确认响应,如果不支持就返回失败响应。因为引入了EHLO命令,因此会话开始的第一条命令可以是HELO或EHLO。   EHLO命令可以出现在任何HELO命令出现的地方,在成功发送一个HELO或EHLO命令后再次发送它会使服务器返回503。客户这时不能缓存服务器返回的任何信息。这里一定要注意的是,每次开始SMTP扩展服务会话的时候必须发送EHLO命令。  end 百度百科

starttls 是将纯文本提升为加密方式

参考:http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html

还参考了另一个人的博客,可惜那个博客现在没找到,不好意思

转载于:https://www.cnblogs.com/cxiaoln/p/3674637.html

python 发送 smtp相关推荐

  1. 如何用python发送SMTP邮件(基于QQ邮箱)亲测可用

    第一步 首先我们要在QQ邮箱开通SMTP邮件,并生成授权码 设置->账户->生成授权码 通过绑定手机发送短信生成授权码,并保存授权码,一系列英文字母(等会要用) 第二步 确保自己的计算机名 ...

  2. 【Python】如何用Python发送SMTP邮件

    [背景] 自动发送邮件通知是流成自动化系统必备的功能,今天介绍如何用Python实现. [代码] 这里以163邮箱为例 def send_smtp_mail(host="smtp.163.c ...

  3. oracle 发的邮件qq,python基于SMTP发送QQ邮件

    python基于SMTP发送QQ邮件,供大家参考,具体内容如下 第一步: 1.打开qq邮箱,开启smtp服务 2.验证密保 3.获取授权码 python代码里面使用 在Python中, smtplib ...

  4. Python利用SMTP/IMTP制作简单邮件(QQ邮箱)发送程序(保姆级)

    先看效果图和代码 效果图 import smtplib from email.mime.text import MIMEText # 邮件正文 from email.header import Hea ...

  5. python使用SMTP发送qq/sina邮件

    python使用qq邮箱(个人邮箱)发送邮件需开启qq邮箱的SMTP服务 在设置中开启pop3/SMTP服务,返回的密码就是之后代码中登录使用账户密码(在完整代码中标识了出来) 之后出现如下错误 sm ...

  6. python判断邮件发送成功_【基本解决】python中用SMTP发送QQ邮件提示成功但是收件人收不到邮件...

    折腾: 期间, 已经用了smtp的ssl去发送邮件了,但是结果: 第二收件人也没有收到邮件... 那去把端口号从465改为587: smtpPort=587, 结果直接出错: smtpObj = sm ...

  7. python发送qq邮件_python使用SMTP发送qq或sina邮件

    python使用qq邮箱(个人邮箱)发送邮件需开启qq邮箱的SMTP服务 在设置中开启pop3/SMTP服务,返回的密码就是之后代码中登录使用账户密码(在完整代码中标识了出来) 之后出现如下错误 复制 ...

  8. Python 发送 email 的三种方式

    Python发送email的三种方式,分别为使用登录邮件服务器.使用smtp服务.调用sendmail命令来发送三种方法 本文原文自米扑博客:Python 发送 email 的三种方式 Python发 ...

  9. python发邮件11002_【python发送zabbix报警邮件,SSL版本】mailman.py

    [python发送zabbix报警邮件,SSL版本]mailman.py#!/usr/local/bin/python3 # # via  @ 20150210 # SSL only ''' 用法: ...

最新文章

  1. java线程 kill linux_linux查看进程和线程的命令
  2. double java 坑,Java中四则运算的那些坑
  3. JS事件调试 - 查找HTML元素绑定的事件以及绑定代码所在位置
  4. Linux下三大最佳的开源视频播放器
  5. [vue] vue的is这个特性你有用过吗?主要用在哪些方面?
  6. 互联网早报 | 3月16日 星期二 | 微信AI直播助理开放内测;汽车之家港交所挂牌上市;美团App内测“群聊”功能...
  7. Git - Pull Request工作流
  8. linux下安装svn1.7
  9. 16个 Redis 常见使用场景,面试有内容聊啦
  10. Windows下安装hadoop2.7.1
  11. [leetcode]592. Fraction Addition and Subtraction
  12. PID控制及温度调节程序举例
  13. 小书MybatisPlus第9篇-常用字段默认值自动填充
  14. 学生管理系统--【Java+MySQL】--数据库系统概论综合性实验
  15. web-HTML5-图片+超链接标签..
  16. 【android opengles开发的一些基础类】
  17. HTML几种设置水平居中和垂直居中的方式
  18. stm32开发3D打印机(二)——方向、相关资料链接
  19. Saiku控制页面展示的数据过长自动换行(二十四)
  20. 使用隐含Trace参数诊断Oracle Data Pump(expdp)故障

热门文章

  1. 设计一个媒体类,其中包含:书,CD及磁带3个子类。按照类的设计模式,完成他们的插入、删除和查找功能。
  2. 三合一乐高迷你机器人_乐高太贵?这10个品牌积木玩具购买指南请收好
  3. java 初始化和清楚_浅谈Java中的初始化和清理
  4. 零基础入门语义分割-Task5 模型训练与验证
  5. java中jsp时间插件_日期插件 - WEB源码|JSP源码/Java|源代码 - 源码中国
  6. java package 路径_java文件路径问题及Eclipse package,source folder,folder区别及相互转换...
  7. IOS开发-表视图LV3导航控制器
  8. python框架实例,从零构建一个简单的 Python 框架
  9. ReactNative之Realm预加载数据
  10. JSON数据格式转换(StringBuffer拼接json串)大全及用法