python2.7实现邮件发送功能


Posted in Python onDecember 12, 2018

要想实现一个能够发送带有文本、图片、附件的python程序,首先要熟悉两大模块:

email以及smtplib

然后对于MIME(邮件扩展)要有一定认知,因为有了扩展才能发送附件以及图片这些媒体或者非文本信息

最后一个比较细节的方法就是MIMEMultipart,要理解其用法以及对应参数所实现的功能区别

发送邮件三部曲:

创建协议对象
连接邮件服务器
登陆并发送邮件

from email.header import Header
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
import mimetypes

from email.mime.multipart import MIMEMultipart
import os
import smtplib

from email import Encoders as email_encoders


class Message(object):
 def __init__(self, from_addr, to_addr, subject="", html="", text=None, cc_addr=[], attachment=[]):

  self.from_addr = from_addr
  self.subject = subject

  if to_addr:
   if isinstance(to_addr, list):
    self.to_addr = to_addr
   else:
    self.to_addr = [d for d in to_addr.split(',')]
  else:
   self.to_addr = []

  if cc_addr:
   if isinstance(cc_addr, list):
    self.cc_addr = cc_addr
   else:
    self.cc_addr = [d for d in cc_addr.split(',')]
  else:
   self.cc_addr = []

  if html is not None:
   self.body = html
   self.body_type = "html"
  else:
   self.body = text
   self.body_type = "plain"

  self.parts = []
  if isinstance(attachment, list):
   for file in attachment:
    self.add_attachment(file)

 def add_attachment(self, file_path, mimetype=None):
  """
   If *mimetype* is not specified an attempt to guess it is made. If nothing
   is guessed then `application/octet-stream` is used.
  """
  if not mimetype:
   mimetype, _ = mimetypes.guess_type(file_path)

  if mimetype is None:
   mimetype = 'application/octet-stream'

  type_maj, type_min = mimetype.split('/')
  with open(file_path, 'rb') as fh:
   part_data = fh.read()

   part = MIMEBase(type_maj, type_min)
   part.set_payload(part_data)
   email_encoders.encode_base64(part)

   part_filename = os.path.basename(file_path)
   part.add_header('Content-Disposition', 'attachment; filename="%s"'
       % part_filename)
   part.add_header('Content-ID', part_filename)

   self.parts.append(part)

 def __to_mime_message(self):
  """Returns the message as
  :py:class:`email.mime.multipart.MIMEMultipart`."""

  ## To get the message work in iOS, you need use multipart/related, not the multipart/alternative
  msg = MIMEMultipart('related')
  msg['Subject'] = self.subject
  msg['From'] = self.from_addr
  msg['To'] = ','.join(self.to_addr)

  if len(self.cc_addr) > 0:
   msg['CC'] = ','.join(self.cc_addr)

  body = MIMEText(self.body, self.body_type)
  msg.attach(body)

  # Add Attachment
  for part in self.parts:
   msg.attach(part)

  return msg

 def send(self, smtp_server='localhost'):

  smtp = smtplib.SMTP()
  smtp.connect(smtp_server)
  smtp.sendmail(from_addr=self.from_addr, to_addrs=self.to_addr + self.cc_addr, msg=self.__to_mime_message().as_string())
  smtp.close()

对于实际发送程序,要注意个参数的类型,比如from_addr是字符串,to_addr和cc_addr以及attachment都是列表

from mail_base import Message
import datetime
from_addr = 'xxx'
mail_to = 'xxx'


def send_go():
 time_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
 attach_files = ['testcsv.xlsm','test1.jpg','test2.jpg','test3.jpg']
 mail_msg = """
  <p>Hi Lockey:</p>
  <p><img src="cid:test1.jpg"></p>####要特别注意这里,正文插入图片的特殊格式!!!
  <hr/>
  <p style="text-indent:16px">Here is the latest paper link from The Economist, you can click <a href="https://lockeycheng.github.io/iooi/index.html" rel="external nofollow" >Go</a> for a full view!</p>
  <hr/>
  <p>Best Regards</p>
  <p>
   Any question please mail to <a href='mailto:iooiooi23@163.com'>Lockey23</a>.
  </p>
  <p>Sent at {} PST</p>
  """.format(time_now)
 subject = '[Halo] - ' + 'A new paper published!'
 msg = Message(from_addr=from_addr,
     to_addr=[mail_to],
     cc_addr=[mail_to],
     subject=subject,
     attachment=attach_files,
     html=mail_msg
     )
 msg.send()

if __name__ == '__main__':
 send_go()

对于测试程序我们命名为sendGo.py,运行测试程序

~$ python sendGo.py

python2.7实现邮件发送功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 装饰器功能以及函数参数使用介绍
Jan 27 Python
Python ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 Python
Python map和reduce函数用法示例
Feb 26 Python
在Django的session中使用User对象的方法
Jul 23 Python
python虚拟环境virualenv的安装与使用
Dec 18 Python
Python爬虫之xlml解析库(全面了解)
Aug 08 Python
浅谈Python中带_的变量或函数命名
Dec 04 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
Jan 03 Python
和孩子一起学习python之变量命名规则
May 27 Python
Python实现分段线性插值
Dec 17 Python
如何分离django中的媒体、静态文件和网页
Nov 12 Python
python-sys.stdout作为默认函数参数的实现
Feb 21 Python
对python csv模块配置分隔符和引用符详解
Dec 12 #Python
pandas读取csv文件,分隔符参数sep的实例
Dec 12 #Python
python使用xlsxwriter实现有向无环图到Excel的转换
Dec 12 #Python
解决Python pandas plot输出图形中显示中文乱码问题
Dec 12 #Python
在python中pandas读文件,有中文字符的方法
Dec 12 #Python
python处理两种分隔符的数据集方法
Dec 12 #Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
Dec 12 #Python
You might like
第十四节 命名空间 [14]
2006/10/09 PHP
开发大型PHP项目的方法
2006/10/09 PHP
PHP Session 变量的使用方法详解与实例代码
2013/09/11 PHP
3种php生成唯一id的方法
2015/11/23 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
2016/01/08 PHP
PHP中上传文件打印错误错误类型分析
2019/04/14 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
游戏人文件夹程序 ver 3.0
2006/07/14 Javascript
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
2016/11/18 Javascript
vue.js与element-ui实现菜单树形结构的解决方法
2018/04/21 Javascript
使用javascript函数编写简单银行取钱存钱流程
2018/05/26 Javascript
vue修改对象的属性值后页面不重新渲染的实例
2018/08/09 Javascript
[01:23:45]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第一场 1月22日
2021/03/11 DOTA
python操作摄像头截图实现远程监控的例子
2014/03/25 Python
python基于queue和threading实现多线程下载实例
2014/10/08 Python
在Python中使用模块的教程
2015/04/27 Python
Python实现自定义顺序、排列写入数据到Excel的方法
2018/04/23 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
Python对接六大主流数据库(只需三步)
2019/07/31 Python
Python实现密码薄文件读写操作
2019/12/16 Python
django为Form生成的label标签添加class方式
2020/05/20 Python
HTML5标签与HTML4标签的区别示例介绍
2013/07/18 HTML / CSS
手工制作的意大利皮革运动鞋:KOIO
2020/01/05 全球购物
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
销售实习自我鉴定
2013/12/07 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
实习科室评语
2015/01/04 职场文书
史上最牛的辞职信
2015/02/28 职场文书
2016年第29个世界无烟日宣传活动总结
2016/04/06 职场文书
Vue通过懒加载提升页面响应速度
2021/05/10 Vue.js
详解CSS伪元素的妙用单标签之美
2021/05/25 HTML / CSS