python 发送邮件的两种方式【终极篇】

python 发送邮件的两种方式【终极篇】

一,利用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 settingsmail_host = settings.EMAIL_HOSTmail_user = settings.EMAIL_HOST_USERmail_pass = settings.EMAIL_HOST_PASSWORDsubject = subjectsender = settings.EMAIL_FROMreceiver = settings.TEST_EMAIL_TOmsg = 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()

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

 1 import os
 2 import datetime
 3 import smtplib
 4 import logging
 5 import traceback
 6 from email.mime.multipart import MIMEMultipart
 7 from email.mime.image import MIMEImage
 8 from email.mime.text import MIMEText
 9 from email.header import Header
10 
11 def send_img_mail(data, subject, recivers, attach_file=None):
12     base_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
13     mail_host = settings.EMAIL_HOST
14     mail_user = settings.EMAIL_HOST_USER
15     mail_pass = settings.EMAIL_HOST_PASSWORD
16     subject = subject
17     sender = settings.EMAIL_FROM
18     receiver = recivers
19 
20     msg = MIMEMultipart()
21     msg.attach(MIMEText(str(data), 'html'))
22 
23     with open(os.path.join(base_dir, 'dist/static/img/zk_header.png'), 'rb') as f:
24         msgImage = MIMEImage(f.read())
25     msgImage.add_header('Content-ID', '<image1>')
26     msg.attach(msgImage)
27 
28     with open(os.path.join(base_dir, 'dist/static/img/zk_footer.jpg'), 'rb') as f:
29         msgImage = MIMEImage(f.read())
30     msgImage.add_header('Content-ID', '<image2>')
31     msg.attach(msgImage)
32 
33     if attach_file:
34         last_month = datetime.datetime.today() - relativedelta(months=1)
35         attachment = MIMEText(open(attach_file, 'rb').read(), 'base64', 'gb2312')
36         attachment["Content-Type"] = 'application/octet-stream'
37         attachment["Content-Disposition"] = 'attachment; filename="XXX产品{0}月新增XX问题.xls"'. \
38             format(last_month.month)
39         msg.attach(attachment)
40 
41     msg['from'] = Header('XXXXXX', 'utf-8')
42     msg['Subject'] = Header(subject, 'utf-8')
43     msg["Accept-Language"] = "zh-CN"
44     msg["Accept-Charset"] = "ISO-8859-1,utf-8"
45 
46     try:
47         server = smtplib.SMTP()
48         server.connect(mail_host)
49         server.login(mail_user, mail_pass)
50         server.sendmail(sender, receiver, msg.as_string())
51         server.quit()
52     except Exception:
53         logger.error(msg=traceback.format_exc())

html文件格式:

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

 

posted on 2018-07-05 15:28 _潜行者 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/wangwei916797941/p/9268561.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络爬虫--2.HTTP和HTTPS

文章目录一.简介二.HTTP的请求与响应三.客户端HTTP请求1.格式2.请求方法四.常用的请求报头1.Host (主机和端口号)2.Connection (链接类型)3.Upgrade-Insecure-Requests (升级为HTTPS请求)4. User-Agent (浏览器名称)5. Accept (传输文件类型)6.Referer (页面跳转处)7.Accept-En…

解决win7的outlook打不开的问题

outlook打不开&#xff0c;一直显示正在处理 解决方法&#xff1a; 1. 按住Ctrl,双击打开组件&#xff0c;会提示是否进入安全模式&#xff0c; 进入安全模式 2. 单击Outlook中的文件-选项-加载项- 左下角的“COM加载项“ 旁边的“转到”&#xff0c;将所有加载项前面的勾都去掉…

IBM王阳:软件是凝聚创新力的最佳平台

导读&#xff1a;在IBM全球副总裁兼IBM中国开发中心总经理王阳博士看来&#xff0c;IBM百年不衰的根本原因在于将创新力凝结成软件然后进行合适的传播&#xff0c;其间最重要的是成功打造出了一个吸引人才、培养研发人才并激发出人才创新力的环境和氛围。而保持创新领导力的关键…

数据库的规范化

在关系数据库中&#xff0c;对关系模式的基本要求是满足第一范式。 规范化程度过低的关系不一定能够很好地描述现实世界 可能存在插入异常、删除异常、修改复杂、数据冗余等问题 解决方法就是对其进行规范化&#xff0c;转换成高级范式 一个低一级范式的关系模式&#xff0c;通…

Jquery 多行拖拽图片排序 jq优化

<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>jQuery图片拖动排序代码</title><style type"text/css">.item_container{position:relative;height:auto;overflow:hidden;} .item_content ul{li…

应该把script标签放在哪里

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 概述&#xff1a; 如果在页面中写JS的话&#xff0c;那必然会用到script标签&#xff0c;理论上script标签放在哪里都是可以的&#xff…

网络爬虫--3.str和bytes的区别

文章目录一.bytes二.str和bytes相互转换三.bytearray一.bytes bytes对象只负责以二进制字节序列的形式记录所需记录的对象&#xff0c;至于该对象到底表示什么&#xff08;比如到底是什么字符&#xff09;则由相应的编码格式解码所决定。 bytes是Python 3中特有的&#xff0c…

git使用问题

1、错误&#xff1a;The following untracked working tree files would be overwritten by checkout 。后面跟了几个文件 场景&#xff1a;需要从一个分支切换到另一个分支时报错 方法&#xff1a;git clean -d -fx "" 原因&#xff1a;之前修改了.gitignore文件&am…

jdbc写入和读取过程

[jdbc写操作] Class.forName("com.mysql.jdbc.Driver"); Connection conn DriverManager.getConnection("jdbc:mysql://localhost:3306/big","root","root"); ppst conn.preparedStatement("insert into test(id,name,age) val…

分享11款主流的开源编程工具

导读&#xff1a;有了开源编程工具&#xff0c;在基于开源许可证的情况下您可以轻松学习、修改、提高代码的质量&#xff0c;本文收集了11款最主流的且有价值的开源编程工具。或许会给您带来一丝惊喜。一起来看下吧。 NO.1 Rhomobile Rhodes Ruby或许是Github上第二大流行语言…

数据库触发器

触发器是一种特殊类型的存储过程&#xff0c;它在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。触发器可以查询其它表&#xff0c;并可以包含复杂的Transact-SQL语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待…

jQuery中ready与load事件的区别

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 jQuery中ready与load事件的区别 概述&#xff1a; 大家在工作中用jQuery的时候一定会在使用之前这样&#xff1a;12345678//document rea…

网络爬虫--4.requests的简单实用

文章目录一.简介二.基本GET请求1.最基本的GET请求--直接用get方法2.添加 headers 和查询参数parmas3.通过requests获取网络上图片的大小三.基本POST请求1.传入data数据四.代理&#xff08;proxies参数&#xff09;五.私密代理六.web客户端验证七.Cookies 和 Sission1.Cookies2.…

编程各类资源大放送

小编的公众号[编程软文]一直在运营着&#xff0c;但是我的公众号只是发一些技术类文章&#xff0c;没有特地为自己的公众号如何添粉去操作&#xff0c;目前公众号关注度比较低。看着其他人的公众号粉丝越来越多&#xff0c;小编也需要为自己做些事。为了提高自己公众号的关注度…

使用Spring框架能带来那些好处?

1、Dependency Injection(DI)方法使得构造器和JavaBean properties文件中的依赖关系一目了然。2、与EJB容器相比较&#xff0c;Ioc容器更加趋向于轻量级。这样一来Ioc容器在邮箱的内存和CPU资源的情况下进行应用程序的开发和发布就变得十分有利。3、Spring并没有闭门造车&#…

谁在告谁?移动专利混战图

移动领域激战正酣&#xff0c;同样是没有永远的朋友&#xff0c;只有永远的利益。 苹果刚刚起诉三星的Galaxy手机和平板电脑山寨了苹果的产品&#xff0c;而此前两家并没有过节。再比如微软和亚马逊以及HTC之间的授权协议争端。移动领域的争端如此之多&#xff0c;以至于看客无…

java中list()和listfile()

File fnew File("c:\\");String[] f1f.list();File[] f2f.listFiles();① list() 返回一个字符串数组&#xff0c;这些字符串指定此抽象路径名表示的目录中的文件和目录。 以C盘为例&#xff0c;返回的是c盘下文件夹名字的字符串数组,如[TEMP, Windows]②listFile…

光棍节程序员闯关秀过关全攻略

maven/java/web/bootstrapQQ群&#xff1a;566862629。希望更多人一起帮助我学习。 光棍节程序员闯关秀过关全攻略。程序员的寂寞谁能懂?"SF光棍节程序员闯关秀"智力挑战小游戏火热上线&#xff0c;看看你能闯到第几关&#xff1f; 游戏地址: http://segmentfault…

jekins搭建

2019独角兽企业重金招聘Python工程师标准>>> 转自 https://www.cnblogs.com/hdwang/p/6081994.html &#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xf…

网络爬虫--5.urllib库的基本使用(1)

文章目录一. 前言二. urlopen三. Request四. User-Agent五. 添加更多的Header信息1. 添加一个特定的header2. 随机添加/修改User-Agent一. 前言 所谓网页抓取&#xff0c;就是把URL地址中指定的网络资源从网络流中读取出来&#xff0c;保存到本地。 在Python中有很多库可以用来…