详解Python发送邮件实例


Posted in Python onJanuary 10, 2016

Python发送邮件需要smtplib和email两个模块。也正是由于我们在实际工作中可以导入这些模块,才使得处理工作中的任务变得更加的简单。今天,就来好好学习一下使用Python发送邮件吧。

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。

Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。

1.邮件正文是文本的格式

# -*- coding: UTF-8 -*-

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
import sys
import csv
import xlrd
from pyExcelerator import *
import os
import xlwt
from xlutils.copy import copy
import pyExcelerator
import datetime
import time

reload(sys)
sys.setdefaultencoding("utf-8")

mailto_list = [""] # 邮件接收方的邮件地址
mail_host = "smtp.exmail.qq.com"  # 邮件传送协议服务器
mail_user = "" # 邮件发送方的邮箱账号
mail_pass = "" # 邮件发送方的邮箱密码

def send_mail(to_list, sub, content):
  me = "天才白痴梦"+"<"+mail_user+">"
  msg = MIMEText(content, _subtype='plain', _charset='utf-8')
  msg['Subject'] = sub  # 邮件主题
  msg['From'] = me
  msg['To'] = ";".join(to_list)
  try:
    server = smtplib.SMTP()
    server.connect(mail_host)
    server.login(mail_user, mail_pass)
    server.sendmail(me, to_list, msg.as_string())
    server.close()
    return True
  except Exception, e:
    print str(e)
    return False

if __name__ == '__main__':
  sub = "天才白痴梦"
  content = '...'
  if send_mail(mailto_list, sub, content):
    print "发送成功"
  else:
    print "发送失败"

2.邮件正文是表格的格式:由于是表格,所以我们选择HTML来实现表格的功能,邮件上面显示的就是HTML实现的内容了。

# -*- coding: UTF-8 -*-

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
import sys
import csv
import xlrd
from pyExcelerator import *
import os
import xlwt
from xlutils.copy import copy
import pyExcelerator
import datetime
import time

reload(sys)
sys.setdefaultencoding("utf-8")

mailto_list = [""] # 邮件接收方的邮件地址
mail_host = "smtp.exmail.qq.com"  # 邮件传送协议服务器
mail_user = "" # 邮件发送方的邮箱账号
mail_pass = "" # 邮件发送方的邮箱密码

def send_mail(to_list, sub, content):
  me = "天才白痴梦"+"<"+mail_user+">"
  # 和上面的代码不同的就是,这里我们选择的是html 的格式
  msg = MIMEText(content, _subtype='html', _charset='utf-8')
  msg['Subject'] = sub  # 邮件主题
  msg['From'] = me
  msg['To'] = ";".join(to_list)
  try:
    server = smtplib.SMTP()
    server.connect(mail_host)
    server.login(mail_user, mail_pass)
    server.sendmail(me, to_list, msg.as_string())
    server.close()
    return True
  except Exception, e:
    print str(e)
    return False

if __name__ == '__main__':
  sub = "天才白痴梦"
  html = '<html></html>'
  if send_mail(mailto_list, sub, html):
    print "发送成功"
  else:
    print "发送失败"

3.邮件正文是图片的格式:要把图片嵌入到邮件正文中,我们只需按照发送附件的方式,先把邮件作为附件添加进去,然后,在HTML中通过引用src="cid:0"就可以把附件作为图片嵌入了。如果有多个图片,给它们依次编号,然后引用不同的cid:x即可。

def send_mail(to_list, sub, content):
  me = "天才白痴梦"+"<"+mail_user+">"

  msg = MIMEMultipart()
  msg['Subject'] = sub  # 邮件主题
  msg['From'] = me
  msg['To'] = ";".join(to_list)

  txt = MIMEText("天才白痴梦", _subtype='plain', _charset='utf8')
  msg.attach(txt)

  # <b>:黑体 <i>:斜体
  msgText = MIMEText('<b>Some <i>HTML</i> text</b> and an image.<img alt="" src="cid:image1" />good!', 'html', 'utf-8')
  msg.attach(msgText)

  file1 = "F:\\1.jpg"
  image = MIMEImage(open(file1, 'rb').read())
  image.add_header('Content-ID', '<image1>')
  msg.attach(image)

  try:
    server = smtplib.SMTP()
    server.connect(mail_host)
    server.login(mail_user, mail_pass)
    server.sendmail(me, to_list, msg.as_string())
    server.close()
    return True
  except Exception, e:
    print str(e)
    return False

if __name__ == '__main__':
  sub = "天才白痴梦"
  html = '<html></html>'
  if send_mail(mailto_list, sub, html):
    print "发送成功"
  else:
    print "发送失败"

4.发送邮件附件:邮件附件是图片

def send_mail(to_list, sub, content):
  me = "天才白痴梦"+"<"+mail_user+">"

  msg = MIMEMultipart()
  msg['Subject'] = sub  # 邮件主题
  msg['From'] = me
  msg['To'] = ";".join(to_list)

  txt = MIMEText("天才白痴梦", _subtype='plain', _charset='utf8')
  msg.attach(txt)

  # # <b>:黑体 <i>:斜体
  # msgText = MIMEText('<b>Some <i>HTML</i> text</b> and an image.<img alt="" src="cid:image1" />good!', 'html', 'utf-8')
  # msg.attach(msgText)
  #
  # file1 = "F:\\1.jpg"
  # image = MIMEImage(open(file1, 'rb').read())
  # image.add_header('Content-ID', '<image1>')
  # msg.attach(image)

  att = MIMEText(open('F:\\1.jpg', 'rb').read(), 'base64', 'utf-8')
  att["Content-Type"] = 'application/octet-stream'
  att["Content-Disposition"] = 'attachment; filename="1.jpg"'
  msg.attach(att)

  try:
    server = smtplib.SMTP()
    server.connect(mail_host)
    server.login(mail_user, mail_pass)
    server.sendmail(me, to_list, msg.as_string())
    server.close()
    return True
  except Exception, e:
    print str(e)
    return False

5.发送群邮件:同时发送给多人
mailto_list = [""]  # 邮件接收方的邮件地址
上面这一行代码是邮件接收方的邮件地址,如果我们需要给多人发送邮件的话,就只需要把对方的邮件帐号绑在这一个列表里就ok了。

加密SMTP

使用标准的25端口连接SMTP服务器时,使用的是明文传输,发送邮件的整个过程可能会被窃听。要更安全地发送邮件,可以加密SMTP会话,实际上就是先创建SSL安全连接,然后再使用SMTP协议发送邮件。

方法:只需要在创建SMTP对象后,立刻调用starttls()方法,就创建了安全连接。

smtp_server = 'smtp.qq.com'
smtp_port = 25  # 默认端口号为25
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
# 剩下的代码和前面的一模一样:
server.set_debuglevel(1)   # 打印出和SMTP服务器交互的所有信息

以上就是关于Python发送邮件详细解析,希望对大家的学习有所帮助。

Python 相关文章推荐
python 合并文件的具体实例
Aug 08 Python
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
Feb 04 Python
python模拟鼠标拖动操作的方法
Mar 11 Python
浅谈python中的变量默认是什么类型
Sep 11 Python
详解python 模拟豆瓣登录(豆瓣6.0)
Apr 18 Python
python简单验证码识别的实现方法
May 10 Python
python Dijkstra算法实现最短路径问题的方法
Sep 19 Python
matplotlib 三维图表绘制方法简介
Sep 20 Python
python+openCV对视频进行截取的实现
Nov 27 Python
python 用pandas实现数据透视表功能
Dec 21 Python
python安装mysql的依赖包mysql-python操作
Jan 01 Python
Jupyter Notebook内使用argparse报错的解决方案
Jun 03 Python
python轻松查到删除自己的微信好友
Jan 10 #Python
如何处理Python3.4 使用pymssql 乱码问题
Jan 08 #Python
Python argv用法详解
Jan 08 #Python
详解Python爬虫的基本写法
Jan 08 #Python
黑科技 Python脚本帮你找出微信上删除你好友的人
Jan 07 #Python
星球大战与Python之间的那些事
Jan 07 #Python
python高手之路python处理excel文件(方法汇总)
Jan 07 #Python
You might like
phpinfo 系统查看参数函数代码
2009/06/05 PHP
php 多线程上下文中安全写文件实现代码
2009/12/28 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
PHP计算近1年的所有月份
2017/03/13 PHP
javascript之ESC(第二类混淆)
2007/05/06 Javascript
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
2013/01/10 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
AngularJS遍历获取数组元素的方法示例
2017/11/11 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
Angular7.2.7路由使用初体验
2019/03/01 Javascript
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
Python 实现链表实例代码
2017/04/07 Python
python 3.5下xadmin的使用及修复源码bug
2017/05/10 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
详解Pandas之容易让人混淆的行选择和列选择
2019/07/10 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
pytorch标签转onehot形式实例
2020/01/02 Python
python+requests接口压力测试500次,查看响应时间的实例
2020/04/30 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
美国大城市最热门旅游景点门票:CityPASS
2016/12/16 全球购物
Eyeko美国:屡获殊荣的睫毛膏、眼线笔和眉妆
2018/07/05 全球购物
HashMap和Hashtable的区别
2013/05/18 面试题
为什么UNION ALL比UNION快
2016/03/17 面试题
工业自动化专业毕业生推荐信
2013/11/18 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
法定代表人证明书
2014/11/28 职场文书
2015年女职工工作总结
2015/05/15 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
《哪吒之魔童降世》观后感:世上哪有随随便便的成功
2019/11/08 职场文书
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
2022/04/14 Python