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 datetime时间格式化去掉前导0
Jul 31 Python
python开发之tkinter实现图形随鼠标移动的方法
Nov 11 Python
python字典DICT类型合并详解
Aug 17 Python
python实现Dijkstra静态寻路算法
Jan 17 Python
如何基于Python制作有道翻译小工具
Dec 16 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
Jan 08 Python
python opencv根据颜色进行目标检测的方法示例
Jan 15 Python
Django choices下拉列表绑定实例
Mar 13 Python
Python count函数使用方法实例解析
Mar 23 Python
Python自动重新加载模块详解(autoreload module)
Apr 01 Python
python argparse模块通过后台传递参数实例
Apr 20 Python
Jupyter Notebook安装及使用方法解析
Nov 12 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/04 无线电
PHP新手上路(十四)
2006/10/09 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
laravel 修改.htaccess文件 重定向public的解决方法
2019/10/12 PHP
重定向实现代码
2006/11/20 Javascript
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
js创建元素(节点)示例
2014/01/02 Javascript
node.js中的fs.unlink方法使用说明
2014/12/15 Javascript
jquery实现submit提交表单
2015/02/03 Javascript
javascript实现捕捉键盘上按下的键
2015/05/05 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
JavaScript中windows.open()、windows.close()方法详解
2016/07/28 Javascript
Javascript实现汉字和拼音互转的终极方案
2016/10/19 Javascript
vue.js单页面应用实例的简单实现
2017/04/10 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
浅谈vue.use()方法从源码到使用
2019/05/12 Javascript
一张图带我们入门Python基础教程
2017/02/05 Python
Python判断有效的数独算法示例
2019/02/23 Python
详解Pandas之容易让人混淆的行选择和列选择
2019/07/10 Python
python批量修改ssh密码的实现
2019/08/08 Python
Python列表的切片实例讲解
2019/08/20 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
HelloFresh奥地利:立即订购烹饪盒
2019/02/22 全球购物
历史学专业毕业生求职信
2013/09/27 职场文书
日语专业毕业生求职信
2013/12/04 职场文书
财务会计专业个人求职信范本
2014/01/08 职场文书
自我鉴定 电子商务专业
2014/01/30 职场文书
电大毕业自我鉴定
2014/02/03 职场文书
春游踏青活动方案
2014/08/14 职场文书
作文评语怎么写
2014/12/25 职场文书
2015年民主评议党员工作总结
2015/05/19 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
Python基础数据类型tuple元组的概念与用法
2021/08/02 Python