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 15 Python
Python md5与sha1加密算法用法分析
Jul 14 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
Nov 29 Python
Python实现备份MySQL数据库的方法示例
Jan 11 Python
Numpy 将二维图像矩阵转换为一维向量的方法
Jun 05 Python
Python os.rename() 重命名目录和文件的示例
Oct 25 Python
pygame游戏之旅 添加icon和bgm音效的方法
Nov 21 Python
Python数据可视化教程之Matplotlib实现各种图表实例
Jan 13 Python
python在新的图片窗口显示图片(图像)的方法
Jul 11 Python
运用PyTorch动手搭建一个共享单车预测器
Aug 06 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
Python爬虫之Selenium多窗口切换的实现
Dec 04 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
PHP操作Memcache实例介绍
2013/06/14 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
php实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
PHP变量内存分配问题记录整理
2013/11/27 PHP
PHP实现变色验证码实例
2014/01/06 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
2014/06/30 PHP
PHP中Memcache操作类及用法实例
2014/12/12 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
基于Swoole实现PHP与websocket聊天室
2016/08/03 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
javascript第一课
2007/02/27 Javascript
JavaScript学习笔记(一) js基本语法
2011/10/25 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
js父页面与子页面不同时显示的方法
2014/10/16 Javascript
微信开发 微信授权详解
2016/10/21 Javascript
移动端js图片查看器
2016/11/17 Javascript
简单了解JS打开url的方法
2020/02/21 Javascript
WebStorm中如何将自己的代码上传到github示例详解
2020/10/28 Javascript
vue element el-transfer增加拖拽功能
2021/01/15 Vue.js
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
python中定义结构体的方法
2013/03/04 Python
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
python实现二维插值的三维显示
2018/12/17 Python
解决新django中的path不能使用正则表达式的问题
2018/12/18 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
2019/07/04 Python
python实现复制文件到指定目录
2019/10/16 Python
python和node.js生成当前时间戳的示例
2020/09/29 Python
PyCharm最新激活码(2020/10/27全网最新)
2020/10/27 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
市场营销专业个人自荐信格式
2013/09/21 职场文书
同学会邀请书大全
2014/01/12 职场文书
精神病医院见习报告
2014/11/03 职场文书
无锡灵山大佛导游词
2015/02/09 职场文书
2015年暑期社会实践报告
2015/07/13 职场文书