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中使用dom模块生成XML文件示例
Apr 05 Python
python中的装饰器详解
Apr 13 Python
python中argparse模块用法实例详解
Jun 03 Python
python实现文件路径和url相互转换的方法
Jul 06 Python
Windows上使用virtualenv搭建Python+Flask开发环境
Jun 07 Python
Python爬虫框架Scrapy常用命令总结
Jul 26 Python
python实现ID3决策树算法
Aug 29 Python
python将视频转换为全字符视频
Apr 26 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
Dec 26 Python
使用Python对Dicom文件进行读取与写入的实现
Apr 20 Python
浅析python 动态库m.so.1.0错误问题
May 09 Python
python xlwt模块的使用解析
Apr 13 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
基于mysql的论坛(4)
2006/10/09 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
php简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
jquery div 居中技巧应用介绍
2012/11/24 Javascript
javascript如何动态加载表格与动态添加表格行
2013/11/27 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
2016/08/09 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
Node.js爬取豆瓣数据实例分析
2018/03/05 Javascript
详解element-ui中form验证杂记
2019/03/04 Javascript
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
使用Vant完成通知栏Notify的提示操作
2020/11/11 Javascript
浅析Python中的join()方法的使用
2015/05/19 Python
Python常用小技巧总结
2015/06/01 Python
python 实现对文件夹内的文件排序编号
2018/04/12 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
python3对接mysql数据库实例详解
2019/04/30 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
Python 静态方法和类方法实例分析
2019/11/21 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
美国领先的家庭健康检测试剂盒提供商:LetsGetChecked
2019/03/18 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
电气自动化大学生求职信
2013/10/16 职场文书
大学生实习证明范本
2014/01/15 职场文书
项目考察欢迎辞
2014/01/17 职场文书
小学毕业寄语大全
2014/04/03 职场文书
部门经理迟到检讨书
2015/02/16 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
活动宣传稿范文
2015/07/23 职场文书
加强党性修养心得体会
2016/01/21 职场文书
创业计划书之DIY自助厨房
2019/09/06 职场文书
pyqt5打包成exe可执行文件的方法
2021/05/14 Python