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中的进程、线程、协程
Mar 18 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
May 16 Python
python中如何使用正则表达式的集合字符示例
Oct 09 Python
利用python库在局域网内传输文件的方法
Jun 04 Python
Python3.6使用tesseract-ocr的正确方法
Oct 17 Python
Python之使用adb shell命令启动应用的方法详解
Jan 07 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
Jul 28 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
Sep 07 Python
python如何进入交互模式
Jul 06 Python
python实现图像外边界跟踪操作
Jul 13 Python
Python在后台自动解压各种压缩文件的实现方法
Nov 10 Python
如何在向量化NumPy数组上进行移动窗口
May 18 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
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
Laravel框架Auth用户认证操作实例分析
2019/09/29 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
javascript脚本编程解决考试分数统计问题
2008/10/18 Javascript
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
jQuery EasyUI API 中文文档 - Documentation 文档
2011/09/29 Javascript
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
javascript检测页面是否缩放的小例子
2013/05/16 Javascript
jquery实现多屏多图焦点图切换特效的方法
2015/05/04 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
jQuery防止重复绑定事件的解决方法
2016/05/14 Javascript
JS hashMap实例详解
2016/05/26 Javascript
通过BootStrap-select插件 js jQuery控制select属性变化
2017/01/03 Javascript
Vue+axios+WebApi+NPOI导出Excel文件实例方法
2019/06/05 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
js模拟实现百度搜索
2020/06/28 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
[44:40]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
Python实现数据库编程方法详解
2015/06/09 Python
python实现识别相似图片小结
2016/02/22 Python
Python 多线程抓取图片效率对比
2016/02/27 Python
Python2和Python3中print的用法示例总结
2017/10/25 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
Python QQBot库的QQ聊天机器人
2019/06/19 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
2020/01/19 Python
摄影展策划方案
2014/06/02 职场文书
学习党代会心得体会
2014/09/05 职场文书
2014超市收银员工作总结
2014/11/13 职场文书
2015年党员创先争优承诺书
2015/01/22 职场文书
泰山导游词
2015/02/02 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
检察院起诉书
2015/05/20 职场文书
新年晚会主持词开场白
2015/05/28 职场文书