[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 ( ...
随机推荐
- Linux 安装PAE内核
客户软件是部署在32位的CentOS5服务器当中,CentOS5目前只能识别4G内存,需要安装PAE内核,让系统支持PAE物理地址扩展. 1.安装PAE内核 yum -y install kern ...
- Python: 读写Excel(openpyxl / win32com.client)
项目周报汇报的时候要做数据汇总,总是要从不同的excel文件中去获取数据最后汇总到一个excel表里面,所以决定用python直接写个自动化脚本来自动执行. 用python来读写excel,目前找了2 ...
- .NET Core 和 .NET .Framework 速度比较
废话不多说! 一下是 .NET core 和 .NET framework 速度对比. 两者使用最慢的冒泡排序算法: 排序10万条数据 次数 .NET CORE(耗时) .NET framework ...
- Sorted方法排序用法
listA = [3,4,5,3,2,1,] print(sorted(listA)) # [1, 2, 3, 3, 4, 5] listB =["a","z" ...
- Day 28面向对象的进阶-内置函数(__new__,__del__)
元类 创造 类 所有类的type 都是他的元类 类创造 对象 具体创造对象的方法 __new__方法 class 类名(classmata = type)#默认是 class 类名(class ...
- SPOJ Longest Common Substring II
题目连接:戳我 题目大意:求n个字符串的最长公共子串. 它的简化版--这里 当然我们可以用SA写qwq,也可以用广义SAM写qwq 这里介绍纯SAM的写法...就是对其中一个建立后缀自动机,然后剩下的 ...
- poj2488 A Knight's Journey
http://poj.org/problem?id=2488 题目大意:骑士厌倦了一遍又一遍地看到同样的黑白方块,于是决定去旅行. 世界各地.当一个骑士移动时,他走的是“日”字.骑士的世界是他赖以生存 ...
- 转载-浅谈Ddos攻击攻击与防御
EMail: jianxin#80sec.comSite: http://www.80sec.comDate: 2011-2-10From: http://www.80sec.com/ [ 目录 ]一 ...
- Elasticsearch批量操作API用法介绍
Elasticsearch的Bulk API允许批量提交index和delete请求,有如下两种用法: 用法1 BulkRequestBuilder requestBuilder = client.p ...
- linux系统上内网ip和和外网ip的关系
1.不同服务之间的访问需要使用公网IP+端口才能访问 2.服务器上一般都是域名访问,服务器会把ip+端口映射成固定的域名,所以如果想访问服务器上其他应用,就必须的放开应用限制 问题,在服务器上放开对某 ...