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源码分享
Dec 15 Python
python根据txt文本批量创建文件夹
Dec 08 Python
使用Python3内置文档高效学习以及官方中文文档
May 19 Python
了解不常见但是实用的Python技巧
May 23 Python
使用python list 查找所有匹配元素的位置实例
Jun 11 Python
Python 3.6 -win64环境安装PIL模块的教程
Jun 20 Python
python重要函数eval多种用法解析
Jan 14 Python
基于python实现简单C/S模式代码实例
Sep 14 Python
python集合的新增元素方法整理
Dec 07 Python
Flask处理Web表单的实现方法
Jan 31 Python
Python实现天气查询软件
Jun 07 Python
python实现会员信息管理系统(List)
Mar 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
用PHP查询搜索引擎排名位置的代码
2010/01/05 PHP
浅析php学习的路线图
2013/07/10 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
2016/07/01 PHP
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
2011/01/12 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
2011/11/05 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
JavaScript设计模式之工厂方法模式介绍
2014/12/28 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
jQuery实现仿百度帖吧头部固定导航效果
2015/08/07 Javascript
设置点击文本框或图片弹出日历控件的实现代码
2016/05/12 Javascript
jQuery解决$符号命名冲突
2016/06/18 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
2016/10/08 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
网页中的图片查看器viewjs使用方法
2017/07/11 Javascript
重新认识vue之事件阻止冒泡的实现
2018/08/02 Javascript
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
2020/10/30 Javascript
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
2020/11/04 Javascript
[02:11]2016国际邀请赛中国区预选赛最美TA采访现场玩家
2016/06/28 DOTA
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
Python Json数据文件操作原理解析
2020/05/09 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
Python 转移文件至云对象存储的方法
2021/02/07 Python
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
JSP&Servlet技术面试题
2015/05/21 面试题
学生会主席就职演讲稿
2014/01/14 职场文书
酒店秘书求职信范文
2014/02/17 职场文书
公司委托书格式
2014/08/01 职场文书
同志主要表现材料
2014/08/21 职场文书
《初涉尘世》读后感3篇
2020/01/10 职场文书