一,利用python自带的库 smtplib简单高效

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
import smtplib
from django.conf import settings mail_host = settings.EMAIL_HOST
mail_user = settings.EMAIL_HOST_USER
mail_pass = settings.EMAIL_HOST_PASSWORD
subject = subject
sender = settings.EMAIL_FROM
receiver = settings.TEST_EMAIL_TO msg = MIMEMultipart()
part = MIMEText(str(data), 'html')
msg.attach(part) msg['from'] = Header('标题,也可以写邮箱账号', 'utf-8')
msg['Subject'] = Header(subject, 'utf-8')
msg["Accept-Language"] = "zh-CN"
msg["Accept-Charset"] = "ISO-8859-1,utf-8" try:
server = smtplib.SMTP()
server.connect(mail_host)
server.login(mail_user, mail_pass)
server.sendmail(sender, receiver, msg.as_string())
server.quit()
except Exception:
logger.error(msg=traceback.format_exc())

二,django邮件功能的使用

#settings.py:
# qq IMAP/SMTP 配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 25 # 或者 465/587是设置了 SSL 加密方式
# 发送邮件的邮箱
EMAIL_HOST_USER = ‘你的邮箱’
# 在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = ‘你的IMAP授权码’ # 如果重新设置了新的授权码,直接使用最新的授权码即可
EMAIL_USE_TLS = True # 这里必须是 True,否则发送不成功
# 收件人看到的发件人, 必须是一直且有效的
EMAIL_FROM = ‘Tencent<你的邮箱>'
"""
# qq POP3/SMTP 配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 110 # 或者 995是设置了 SSL 加密方式
#发送邮件的邮箱
EMAIL_HOST_USER = '你的qq邮箱'
#在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = '你的pop3授权码' # 如果重新设置了新的授权码,直接使用最新的授权码即可
EMAIL_USE_TLS = True # 这里必须是 True,否则发送不成功
#收件人看到的发件人
EMAIL_FROM = ‘Tencent<xxx@qq.com>’
""" from django.core.mail import send_mail
from django.core.mail import EmailMultiAlternatives
#send mail
def send_email(file_path, total, typical, dts):
html_content = loader.render_to_string(
'email.html',
{
'dts': dts,
'total': total,
'typical': typical
})
email = EmailMultiAlternatives('title', html_content, settings.EMAIL_FROM, settings.EMAIL_TO)
email.attach_file(file_path)
email.content_subtype = "html"
email.send()

三、发送带图片和附件的邮件

 import os
import datetime
import smtplib
import logging
import traceback
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.header import Header def send_img_mail(data, subject, recivers, attach_file=None):
base_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
mail_host = settings.EMAIL_HOST
mail_user = settings.EMAIL_HOST_USER
mail_pass = settings.EMAIL_HOST_PASSWORD
subject = subject
sender = settings.EMAIL_FROM
receiver = recivers msg = MIMEMultipart()
msg.attach(MIMEText(str(data), 'html')) with open(os.path.join(base_dir, 'dist/static/img/zk_header.png'), 'rb') as f:
msgImage = MIMEImage(f.read())
msgImage.add_header('Content-ID', '<image1>')
msg.attach(msgImage) with open(os.path.join(base_dir, 'dist/static/img/zk_footer.jpg'), 'rb') as f:
msgImage = MIMEImage(f.read())
msgImage.add_header('Content-ID', '<image2>')
msg.attach(msgImage) if attach_file:
last_month = datetime.datetime.today() - relativedelta(months=1)
attachment = MIMEText(open(attach_file, 'rb').read(), 'base64', 'gb2312')
attachment["Content-Type"] = 'application/octet-stream'
attachment["Content-Disposition"] = 'attachment; filename="XXX产品{0}月新增XX问题.xls"'. \
format(last_month.month)
msg.attach(attachment) msg['from'] = Header('XXXXXX', 'utf-8')
msg['Subject'] = Header(subject, 'utf-8')
msg["Accept-Language"] = "zh-CN"
msg["Accept-Charset"] = "ISO-8859-1,utf-8" try:
server = smtplib.SMTP()
server.connect(mail_host)
server.login(mail_user, mail_pass)
server.sendmail(sender, receiver, msg.as_string())
server.quit()
except Exception:
logger.error(msg=traceback.format_exc())

html文件格式:

<img src="cid:image1">
<img src="cid:image2">

python 发送邮件的两种方式【终极篇】的更多相关文章

  1. 最全总结!聊聊 Python 发送邮件的几种方式

    1. 前言 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大 ...

  2. Python自动化测试发送邮件太麻烦?!一起聊一聊 Python 发送邮件的3种方式

    1. 前言 发送邮件,我们在平时工作中经用到,做为测试人员,在自动化测试中用的也比较多,需要发送邮件给某领导 SMTP是Python默认的邮件模块,可以发送纯文本.富文本.HTML 等格式的邮件 今天 ...

  3. 基础知识:编程语言介绍、Python介绍、Python解释器安装、运行Python解释器的两种方式、变量、数据类型基本使用

    2018年3月19日 今日学习内容: 1.编程语言的介绍 2.Python介绍 3.安装Python解释器(多版本共存) 4.运行Python解释器程序两种方式.(交互式与命令行式)(♥♥♥♥♥) 5 ...

  4. 周一02.3运行python程序的两种方式

    一.运行python程序的两种方式 方法一:交互式:                     优点:输入一行代码立刻返回结果                      缺点:无法永久保存代码 方法二: ...

  5. 执行python解释器的两种方式

    执行python解释器的两种方式 1.交互式 python是高级语言,是解释型语言,逐行翻译,写一句翻译一句 print ('hello world') 2.命令行式 python和python解释器 ...

  6. 操作系统+编程语言的分类+执行python程序的两种方式+变量

    1.什么是操作系统? 操作系统就是一个协调\管理\控制计算机硬件资源与软件资源的一个控制程序. 2.为何要操作系统? a.把复杂的硬件操作封装成简单的功能\接口用来给用户或者程序来使用(文件) b.把 ...

  7. day05-1 执行Python程序的两种方式

    目录 执行Python程序的两种方式 第一种:交互式 第二种:命令行式 三个步骤 两种方式的区别 执行Python程序的两种方式 第一种:交互式 在cmd中运行 优点:直接给出结果,执行效率高,及时报 ...

  8. Python字符串的两种方式——百分号方式,format的方式

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  9. 使用Python和AWK两种方式实现文本处理的长拼接案例

    最近由于业务系统新需求的需要,我们平台需要将供应商G提供一类数据转换格式后提供给客户K.比较头疼是供应商G提供的数据都是在Windows下使用Excel存储的,而客户K先前与我们相关对接人员商定的数据 ...

随机推荐

  1. Unity里面的自动寻路(一)

    来自:http://www.narkii.com/club/forum.php?mod=viewthread&tid=269146&highlight=Unity%E9%87%8C%E ...

  2. Android Asynchronous Http Client 中文教程

    本文为译文,原文链接https://loopj.com/android-async-http/ 安卓异步httpclient 概述 这是一个异步的基于回调的Android http客户端,构建于Apa ...

  3. Python_Select解析

    selcet(等待I/O完成)的介绍: select同时监控多个socket,select()的机制提供了fd_set的数据结构,实际是long类型的数组,优点是跨平台性,select的缺点在于单个进 ...

  4. react-native AsyncStorage 数据持久化方案

    1,AsyncStorage介绍 AsyncStorage 是一个简单的.异步的.持久化的 Key-Value 存储系统,它对于 App 来说是全局性的.它用来代替 LocalStorage. 由于它 ...

  5. react 打包后,项目部署完毕,刷新页面报错(404)

    原因解析: 之所以你在浏览器内可以由首页跳转到其他路由地址,是因为这是由前端自行渲染的,你在React Router定义了对应的路由,脚本并没有刷新网页访问后台,是JS动态更改了location. 当 ...

  6. scrapy框架爬取豆瓣读书(1)

    1.scrapy框架 Scrapy,Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试 ...

  7. SpringMVC 学习笔记(十一) SpirngMVC执行流程

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTY3NDc0NTA2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  8. Ubuntu安装CodeBlocks

    访问 https://launchpad.net/~damien-moore/+archive/ubuntu/codeblocks-stable,找到页面上加粗的那一段英文(以“ppa:”开头),如“ ...

  9. Atitit.面向接口的web 原理与设计重写 路由启动绑定配置url router rewriting urlpage  mvc mvp的 java c#.net php js

    Atitit.面向接口的web 原理与设计重写 路由启动绑定配置url router rewriting urlpage  mvc mvp的 java c#.net php js 原理 通过vm带入启 ...

  10. Springboot Maven 多模块项目中 @Service跨模块引用失败的问题

    子模块中引用另一个子模块中的Service, @Autowired失败. 添加了模块之间的依赖没解决. 组以后在启动类上加上 @SpringBootApplication(scanBasePackag ...