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获取指定文件夹下的文件名的方法
Feb 06 Python
Python3之手动创建迭代器的实例代码
May 22 Python
pycharm新建一个python工程步骤
Jul 16 Python
django表单的Widgets使用详解
Jul 22 Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 Python
Python 正则表达式爬虫使用案例解析
Sep 23 Python
TensorFlow tensor的拼接实例
Jan 19 Python
Python3 assert断言实现原理解析
Mar 02 Python
10款最佳Python开发工具推荐,每一款都是神器
Oct 15 Python
python 爬虫网页登陆的简单实现
Nov 30 Python
python 使用cycle构造无限循环迭代器
Dec 02 Python
如何编写python的daemon程序
Jan 07 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
咖啡豆分级制度 咖啡豆等级分类 咖啡豆是按口感分类的吗?
2021/03/05 新手入门
php上传文件的增强函数
2010/07/21 PHP
PHP sprintf()函数用例解析
2011/05/18 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
浅谈PHP解析URL函数parse_url和parse_str
2014/11/11 PHP
解决PHP程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
JS处理VBArray的函数使用说明
2008/05/11 Javascript
JS 事件绑定函数代码
2010/04/28 Javascript
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
javascript实现动态模态绑定grid过程代码
2014/09/22 Javascript
JS中dom0级事件和dom2级事件的区别介绍
2016/05/05 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
js读取本地文件的实例
2017/12/22 Javascript
深入浅出理解JavaScript闭包的功能与用法
2018/08/01 Javascript
jQuery each和js forEach用法比较
2019/02/27 jQuery
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
在vue中axios设置timeout超时的操作
2020/09/04 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
elementui实现预览图片组件二次封装
2020/12/29 Javascript
基于python编写的微博应用
2014/10/17 Python
Python内置函数dir详解
2015/04/14 Python
浅谈tensorflow中几个随机函数的用法
2018/07/27 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
Django项目之Elasticsearch搜索引擎的实例
2019/08/21 Python
基于python2.7实现图形密码生成器的实例代码
2019/11/05 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
阿根廷旅游网站:almundo阿根廷
2018/02/12 全球购物
业务主管岗位职责范本
2013/12/25 职场文书
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
秋天的怀念教学反思
2014/04/28 职场文书
小学生大队委竞选稿
2015/11/20 职场文书