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之入门(二)基本数据类型
May 25 Python
python中使用urllib2伪造HTTP报头的2个方法
Jul 07 Python
Python使用MD5加密字符串示例
Aug 22 Python
Python set集合类型操作总结
Nov 07 Python
Python编程中的异常处理教程
Aug 21 Python
Python使用tkinter库实现文本显示用户输入功能示例
May 30 Python
pygame游戏之旅 载入小车图片、更新窗口
Nov 20 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
Dec 13 Python
Ubuntu16安装Python3.9的实现步骤
Dec 15 Python
使用Python实现音频双通道分离
Dec 25 Python
Python 数据可视化之Seaborn详解
Nov 02 Python
全网非常详细的pytest配置文件
Jul 15 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
elgg 获取文件图标地址的方法
2010/03/20 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
2016/02/26 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
css3实现背景模糊的三种方式
2021/03/09 HTML / CSS
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
Prototype使用指南之selector.js说明
2008/10/26 Javascript
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
ext jquery 简单比较
2010/04/07 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
ES6新特性一: let和const命令详解
2017/04/20 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
2017/06/26 jQuery
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
详解处理Vue单页面应用SEO的另一种思路
2018/11/09 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
Python常用的内置序列结构(列表、元组、字典)学习笔记
2016/07/08 Python
python斐波那契数列的计算方法
2018/09/27 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
Python爬虫学习之翻译小程序
2019/07/30 Python
python 实现简单的FTP程序
2019/12/27 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
Swisse官方海外旗舰店:澳大利亚销量领先,自然健康品牌
2017/12/15 全球购物
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
UML设计模式笔试题
2014/06/07 面试题
学生会竞选自荐信
2013/10/12 职场文书
工程造价与管理专业应届生求职信
2013/11/23 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
银行优秀员工事迹材料
2014/05/29 职场文书
日语专业求职信
2014/07/04 职场文书
毕业实习感受与体会
2015/05/26 职场文书