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使用urllib2实现发送带cookie的请求
Apr 28 Python
全面了解python中的类,对象,方法,属性
Sep 11 Python
python万年历实现代码 含运行结果
May 20 Python
在Python web中实现验证码图片代码分享
Nov 09 Python
python批量导入数据进Elasticsearch的实例
May 30 Python
TensorFlow打印tensor值的实现方法
Jul 27 Python
Django ImageFiled上传照片并显示的方法
Jul 28 Python
django 控制页面跳转的例子
Aug 06 Python
Pytorch中Tensor与各种图像格式的相互转化详解
Dec 26 Python
Django高并发负载均衡实现原理详解
Apr 04 Python
Python+kivy BoxLayout布局示例代码详解
Dec 28 Python
Python用requests库爬取返回为空的解决办法
Feb 21 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 输出双引号&quot;与单引号'的方法
2010/05/09 PHP
php导入csv文件碰到乱码问题的解决方法
2014/02/10 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
document.all还是document.getElementsByName?
2006/07/21 Javascript
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
六款帮助你实现惊艳视差滚动效果的jQuery插件
2012/09/14 Javascript
页面载入结束自动调用js函数示例
2013/09/23 Javascript
nodejs教程之制作一个简单的文章发布系统
2014/11/21 NodeJs
JavaScript中reduce()方法的使用详解
2015/06/09 Javascript
如何屏蔽防止别的网站嵌入框架代码
2015/08/24 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
vue父组件中获取子组件中的数据(实例讲解)
2017/09/27 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
小程序实现授权登陆的解决方案
2018/12/02 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
vue实现一拉到底的滑动验证
2019/07/25 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
2019/09/18 Javascript
使用JS来动态操作css的几种方法
2019/12/18 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
2020/02/05 Javascript
JS内置对象和Math对象知识点详解
2020/04/03 Javascript
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
python的exec、eval使用分析
2017/12/11 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
用html5的canvas画布绘制贝塞尔曲线完整代码
2013/08/14 HTML / CSS
我的大学生活职业生涯规划
2014/01/02 职场文书
销售员岗位职责
2014/06/09 职场文书
党支部组织生活会整改方案
2014/09/30 职场文书
2015年高中班级工作总结
2015/07/21 职场文书
《牧场之国》教学反思
2016/02/22 职场文书
Go语言编译原理之变量捕获
2022/08/05 Golang
华为HarmonyOS3.0强在哪? 看看鸿蒙3.0这7个小功能
2023/01/09 数码科技