[PY3]——发送邮件
一些概念
MUA:Mail User Agent——邮件用户代理,例如OutLook、Foxmail
MTA:Mail Transfer Agent——邮件传输代理,例如163.com、sina.com这些Email服务提供商
MDA:Mail Delivery Agent——邮件投递代理,邮件投递的最终目的地、就像一个存储有点的数据库一样
邮件收发过程
send@163.com -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- receive@sina.com
1. 写邮件:通过MUA这样的软件完成,并由MUA负责发送
2. 传输过程:自己的电子邮件是@163.com,所以会首先被投递给网易提供的MTA,再由网易的MTA发送给新浪的MTA,中间可能还会经过别的MTA
3. 投递到最终目的地:最终新浪的MTA会把Email投递到MDA中,就相当于发送到了receive@sina.com这个电子邮箱中了,这封Email内容被放到了新浪的某个服务器(数据库)上
4. 收件人看到邮件内容:Email之所以不会直接到达对方的电脑,就因为对方电脑不一定开机,开机也不一定联网,那最终收件人提取邮件时,是通过MUA从MDA上获取的
协议
发邮件时:
MUA通过SMTP协议将Email发送到MTA
发邮件时需要先配置SMTP服务器,例如163提供的SMTP服务器地址:smtp.163.com
为了证明你是163.com用户,MTA需要验证SMTP服务器地址、邮箱地址、口令
收邮件时:
MUA从MDA收邮件使用的协议有两种:POP3 / IMAP(IMAP不但能读取邮件还能直接操作MDA上存储的邮件)
为了防止你冒充他人收邮件,MDA需要验证POP3/IMAP服务器地址、邮箱地址、口令
发送普通文本邮件
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr,formataddr
import smtplib mail_send='******@163.com'
mail_passwd='******' #这是授权口令密码,不是邮箱登录密码
mail_smtp='smtp.163.com'
main_to=['******@**.com','******@163.com'] def _format_addr(s):
name,addr=parseaddr(s)
return formataddr((Header(name,'utf-8').encode(),addr)) '''Python2应该这这么写
def _format_addr(s):
name,addr=parseaddr(s)
return formataddr(( Header(name, 'utf-8').encode(), addr.encode('utf-8') if isinstance(addr, unicode) else addr))
''' def send_mail(to_list,subject,content):
msg=MIMEText(content,'plain','utf-8')
msg['Subject']=Header(subject,'utf-8')
msg['From']=_format_addr("我是发件人 <{}>".format(mail_send)) # Python2: msg['From']=_format_addr('我是发件人 <%s>' % mail_send) #
msg['To']=",".join(to_list)
try:
server=smtplib.SMTP()
server.connect(mail_smtp)
server.login(mail_send,mail_passwd)
server.sendmail(mail_send,to_list,msg.as_string())
server.close()
except Exception:
print("Error") send_mail(main_to,"发送测试","邮件发送文本成功")
发送带附件的邮件
def send_mail_accessory(to_list,subject,content,filename):
msg=MIMEMultipart()
msg['Subject']=Header(subject,'utf-8')
msg['From']=_format_addr("我是发件人 <{}>".format(mail_send))
msg['To']=",".join(to_list)
msg.attach(MIMEText(content,'plain','utf-8')) with open(filename,mode='rb') as f:
mime=MIMEBase('excel','xlsx',filename=filename.split('/')[2])
mime.add_header('content-disposition','attachment', filename=filename.split('/')[2])
mime.add_header('Content-ID', '<0>')
mime.add_header('X-Attachment-Id', '')
mime.set_payload(f.read())
encoders.encode_base64(mime)
msg.attach(mime) server=smtplib.SMTP()
server.connect(mail_smtp)
server.login(mail_send,mail_passwd)
server.sendmail(mail_send,to_list,msg.as_string())
server.close() send_mail_accessory(mail_to,"发附件测试","给你发了一个文件","/py3/xxx.xlsx")
[PY3]——发送邮件的更多相关文章
- python模块之lib2to3(py2转py3自动化工具)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之lib2to3(py2转py3自动化工具) #http://tieba.baidu.com ...
- python3发送邮件
import smtplib from email.mime.text import MIMEText from email.utils import formataddr import psutil ...
- 利用SQLServer数据库发送邮件
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 这个应用案例很多,一般都是预警,比如异常连接的时候,或者数据库报错的时候.等等,,, 先 ...
- C# 多种方式发送邮件(附帮助类)
因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...
- JavaMail发送邮件
发送邮件包含的内容有: from字段 --用于指明发件人 to字段 --用于指明收件人 subject字段 --用于说明邮件主题 cc字段 -- 抄送,将邮件发送给收件人的同时抄 ...
- 技术笔记:Indy控件发送邮件
工作中有个需求需要发送邮件,因为使用的delphi6,所以自然就选择了indy组件,想想这事挺简单的.实现的过程倒是简单,看着Indy的demo很快就完了,毕竟也不是很复杂的功能. 功能要求: 1.压 ...
- mono中发送邮件并保存本次收件人的地址
在ios端mono开发中,发送邮件可以选择调用ios原生email程序.有两种方式实现这种功能,一是程序跳转到ipad中email程序,另外一种是将发送邮件的界面在自己应用里弹出. 首先第一种方式的代 ...
- Azure 上通过 SendGrid 发送邮件
SendGrid 是什么? SendGrid 是架构在云端的电子邮件服务,它能提供基于事务的可靠的电子邮件传递. 并且具有可扩充性和实时分析的能力.常见的用例有: 自动回复用户的邮件 定期发送信息给用 ...
- 使用nodemailer发送邮件
今天闲来无事,一时兴起看了下如果使用javascript来发送邮件.经过调研发现,nodeJs可以实现这个功能. 具体的步骤如下: 1.安装依赖 npm install nodemailer -g ( ...
随机推荐
- Intellij Idea 14编译golang 插件
最近项目实在太赶了,很久没有写过博文了. 公司新配了一台笔记本电脑,原装win8的.于是又从linux回到了windows.不想用win命令行来搞go了,win下太折腾了.还是用一直使用的idea. ...
- [ACM_数据结构] Color the ball [线段树水题][数组开大]
Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次 ...
- javascript快速排序的思考
还记得三个月前,学习过快速排序,示例所讲的python快速排序十分易于理解,然而网上学习的c#的快速排序当时就懵逼的,现在已经全忘了,大概记得个思路 在学习完了一些高级的js方法后,今天用js模拟了p ...
- asp.net core 使用identityServer4的密码模式来进行身份认证(一)
IdentityServer4是ASP.NET Core的一个包含OpenID和OAuth 2.0协议的框架.具体Oauth 2.0和openId请百度. 前言本博文适用于前后端分离或者为移动产品来后 ...
- mySql数据库 C#使用guid
CHAR(36) 如果某列设置为CHAR(36),则MySQL官方的连接器会将其当成 GUID 类型.实际上,有时候 某个字段碰巧设为可CHAR(36), 但是我们的本意并非当它是GUID. varc ...
- php CI框架log写入
1.首先,打开application下的config.php文件,将log配置打开如下 /* |---------------------------------------------------- ...
- Kettle 使用入门
Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定. 本文介绍一个入门例子:使用Kettle从动态指定的文件名对应的文本文件里抽取 ...
- CRUD组件的高阶使用
1.list页面自定列显示: class PermissionConfig(sites.AryaConfig): def dabo(self, obj=None, is_header=Fa ...
- 使用过Memcache缓存吗?如果使用过,能够简单描述下其工作原理吗?
Memcache是把所有数据保存在内存中,采用hash表的方式,每条数据由key和value组成,每个key独一无二的.Memcache采用LRU算法逐渐把过期数据清除掉.
- window主机和centos主机之间相互传送文件
命令实现linux和window文件传送 一:下载配置pscp软件从http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html下载p ...