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 自动安装 Rising 杀毒软件
Apr 24 Python
python检测lvs real server状态
Jan 22 Python
Python使用新浪微博API发送微博的例子
Apr 10 Python
Python3基础之输入和输出实例分析
Aug 18 Python
Python随机生成彩票号码的方法
Mar 05 Python
Python常用的文件及文件路径、目录操作方法汇总介绍
May 21 Python
python编程之requests在网络请求中添加cookies参数方法详解
Oct 25 Python
Python使用pandas处理CSV文件的实例讲解
Jun 22 Python
python实现textrank关键词提取
Jun 22 Python
Python使用pickle模块实现序列化功能示例
Jul 13 Python
python求最大公约数和最小公倍数的简单方法
Feb 13 Python
Python通过Tesseract库实现文字识别
Mar 05 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遍历数组的方法分享
2012/03/22 PHP
php对图像的各种处理函数代码小结
2013/07/08 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
完美利用Yii2微信后台开发的系列总结
2016/07/18 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
JavaScript通过元素索引号删除数组中对应元素的方法
2015/03/18 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
使用jQuery获取data-的自定义属性
2015/11/10 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
浅析Angular2子模块以及异步加载
2017/04/24 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
ajax请求+vue.js渲染+页面加载的示例
2018/02/11 Javascript
详解使用angular框架离线你的应用(pwa指南)
2019/01/31 Javascript
vue-cli3+typescript新建一个项目的思路分析
2019/08/06 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
python线程池的实现实例
2013/11/18 Python
pycham查看程序执行的时间方法
2018/11/29 Python
python有序查找算法 二分法实例解析
2020/02/18 Python
详解CSS3媒体查询响应式布局bootstrap 框架原理实战(推荐)
2020/11/16 HTML / CSS
《会变的花树叶》教学反思
2014/02/10 职场文书
暑期培训班策划方案
2014/08/26 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
市场营销计划书范文
2015/01/16 职场文书
求职自我评价参考范文
2019/05/16 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL
Win11应用商店打开闪退怎么解决? win11应用商店打不开的多种解决办法
2022/04/05 数码科技
详细介绍MySQL中limit和offset的用法
2022/05/06 MySQL
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript
使用CSS实现百叶窗效果示例代码
2023/05/07 HTML / CSS