3.13 练习题4:邮件发送(smtp)
3.13 练习题4:邮件发送(smtp)
前言
本篇总结了QQ邮箱和163邮箱发送邮件,邮件包含html中文和附件,可以发给多个收件人,专治各种不行,总之看完这篇麻麻再也不用担心我的邮件收不到了。
以下代码兼容python2和python3,运行无异常,放心大胆食用。
一、163邮箱
1.先导入smtplib库用来发送邮件,导入MIMEText库用来做纯文本的邮件模板
2.先准备几个跟发邮件相关的参数,每个邮箱的发件服务器都不一样,以163为例,百度搜到发件服务器为:smtp.163.com

3.接下来就是写邮件的主题和正文内容,正文这里用html格式的
4.最后调用SMTP发件服务

5.参考代码:

# coding:utf-8
import smtplib
from email.mime.text import MIMEText
# ----------1.跟发件相关的参数------
smtpserver = "smtp.163.com" # 发件服务器
port = 0 # 端口
sender = "yoyo@163.com" # 账号
psw = "**************" # 密码
receiver = "283340479@qq.com" # 接收人 # ----------2.编辑邮件的内容------
subject = "这个是主题163"
body = '<p>这个是发送的163邮件</p>' # 定义邮件正文为html格式
msg = MIMEText(body, "html", "utf-8")
msg['from'] = sender
msg['to'] = "283340479@qq.com"
msg['subject'] = subject
# ----------3.发送邮件------
smtp = smtplib.SMTP()
smtp.connect(smtpserver) # 连服务器
smtp.login(sender, psw) # 登录
smtp.sendmail(sender, receiver, msg.as_string()) # 发送
smtp.quit() # 关闭

二、QQ邮件
1.QQ邮箱是需要SSL认证的,这种邮箱跟上面的就有点不一样了。

2.找到QQ邮箱授权码,打开QQ邮箱-设置-账号-POP3开启服务-开启
(如果已经开启了,不知道授权码,就点温馨提示里面的‘生成授权码’)

3.发验证短信获取授权码,照着提示发个短信,如何点我已发送,就会收到授权码了。

4.收到授权码后复制,保存下来,这个就可以当QQ邮箱的密码了。

5.QQ邮箱发送邮件代码,跟163有点不一样,如下图红色框框:

6.参考代码:

# coding:utf-8
import smtplib
from email.mime.text import MIMEText
# ----------1.跟发件相关的参数------
# smtpserver = "smtp.163.com" # 发件服务器
smtpserver = "smtp.qq.com"
port = 465 # 端口
sender = "283340479@qq.com" # 账号
psw = "**************" # 密码
receiver = "283340479@qq.com" # 接收人 # ----------2.编辑邮件的内容------
subject = "这个是主题QQ"
body = '<p>这个是发送的QQ邮件</p>' # 定义邮件正文为html格式
msg = MIMEText(body, "html", "utf-8")
msg['from'] = sender
msg['to'] = "283340479@qq.com"
msg['subject'] = subject
# ----------3.发送邮件------
# smtp = smtplib.SMTP()
# smtp.connect(smtpserver) # 连服务器
smtp = smtplib.SMTP_SSL(smtpserver, port)
smtp.login(sender, psw) # 登录
smtp.sendmail(sender, receiver, msg.as_string()) # 发送
smtp.quit() # 关闭

三、兼容163和QQ邮箱
1.如果想兼容上面两种方式发送邮件,只需把第三块内容稍微改下,如下所示

四、发送带附件
1.上面的MIMEText只能发送正文,无法带附件,发送带附件的需要导入另外一个模块MIMEMultipart
2.先读取要发送文件的内容,file_path是路径的参数名
3.下图红色框框file_name参数是发送的附件重新命名

4.参考代码:

# coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# ----------1.跟发件相关的参数------
smtpserver = "smtp.163.com" # 发件服务器
port = 0 # 端口
sender = "yoyo@163.com" # 账号
psw = "***********" # 密码
receiver = "283340479@qq.com" # 接收人 # ----------2.编辑邮件的内容------
# 读文件
file_path = "result.html"
with open(file_path, "rb") as fp:
mail_body = fp.read()
msg = MIMEMultipart()
msg["from"] = sender # 发件人
msg["to"] = receiver # 收件人
msg["subject"] = "这个我的主题" # 主题
# 正文
body = MIMEText(mail_body, "html", "utf-8")
msg.attach(body)
# 附件
att = MIMEText(mail_body, "base64", "utf-8")
att["Content-Type"] = "application/octet-stream"
att["Content-Disposition"] = 'attachment; filename="test_report.html"'
msg.attach(att)
# ----------3.发送邮件------
try:
smtp = smtplib.SMTP()
smtp.connect(smtpserver) # 连服务器
smtp.login(sender, psw)
except:
smtp = smtplib.SMTP_SSL(smtpserver, port)
smtp.login(sender, psw) # 登录
smtp.sendmail(sender, receiver, msg.as_string()) # 发送
smtp.quit()

5.最后结果,有图有真相

五、发给多个收件人
1.上面都是发给一个收件人,那么如何一次发给多个收件人呢?只需改两个小地方
2.把receiver参数改成list对象,单个多个都是可以收到的
3.msg["to"]这个参数不能用list了,得先把receiver参数转化成字符串,如下图所示

4.参考代码:

# coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# ----------1.跟发件相关的参数------
smtpserver = "smtp.163.com" # 发件服务器
port = 0 # 端口
sender = "yoyo@163.com" # 账号
psw = "*********" # 密码
# receiver = ["xxxx@qq.com"] # 单个接收人也可以是list
receiver = ["xxxx@qq.com", "yoyo@qq.com"] # 多个收件人list对象 # ----------2.编辑邮件的内容------
# 读文件
file_path = "result.html"
with open(file_path, "rb") as fp:
mail_body = fp.read()
msg = MIMEMultipart()
msg["from"] = sender # 发件人
msg["to"] = ";".join(receiver) # 多个收件人list转str
msg["subject"] = "这个我的主题999" # 主题
# 正文
body = MIMEText(mail_body, "html", "utf-8")
msg.attach(body)
# 附件
att = MIMEText(mail_body, "base64", "utf-8")
att["Content-Type"] = "application/octet-stream"
att["Content-Disposition"] = 'attachment; filename="test_report.html"'
msg.attach(att)
# ----------3.发送邮件------
try:
smtp = smtplib.SMTP()
smtp.connect(smtpserver) # 连服务器
smtp.login(sender, psw)
except:
smtp = smtplib.SMTP_SSL(smtpserver, port)
smtp.login(sender, psw) # 登录
smtp.sendmail(sender, receiver, msg.as_string()) # 发送
smtp.quit() # 关闭

六:邮件收不到的几种原因:
1.Subject和正文内容不要用hello、hehe、test等单词
2.from(发件人)和to(收件人)不要为空,
(要不然会被认为是垃圾邮件)
3.找不到的话,先看下垃圾信箱,是不是跑到垃圾箱了
4.如果前几次可以收到,后来收不到了,需改下subject内容
(因为每次都是一个subject,系统也会拒收的,把subject内容设置为动态的是最好的)
5.部分邮箱是ssl加密了的,所以无法发送,如:qq邮箱
(用授权码去登录)
6.要是按照上面的步骤来报错了,说明代码抄错了,多检查几次。
(以上代码均在python2和python3上都测试通过了)
3.13 练习题4:邮件发送(smtp)的更多相关文章
- C#邮件发送(最坑爹的邮箱-QQ邮箱)---转发(SmallFlyElephant)
C#邮件发送(最坑爹的邮箱-QQ邮箱) 最近工作挺清闲的,有空的时候陪妹子出去玩玩,自己看看小说,看看电影,日子过的挺欢乐的,这个星期幡然悔悟,代码才是我的最爱,做点小东西,就写个邮件发送程序.说的邮 ...
- SMTP协议及POP3协议-邮件发送和接收原理(转)
本文转自https://blog.csdn.net/qq_15646957/article/details/52544099 感谢作者 一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 ...
- 使用phpmailer发送smtp邮件时提示 SMTP Error: Could not authenticate 错误
使用phpmailer发送smtp邮件时提示 SMTP Error: Could not authenticate 错误 这个错误是验证出现错误, $mail->Port = 25; //SMT ...
- python SMTP邮件发送(转载)
Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...
- C# SMTP邮件发送 分类: C# 2014-07-13 19:10 334人阅读 评论(1) 收藏
邮件发送在网站应用程序中经常会用到,包括您现在看到的博客,在添加评论后,系统会自动发送邮件通知到我邮箱的,把系统发送邮件的功能整理了下,做了一个客户端Demo,希望对有需要的童鞋有所帮助: 核心代码: ...
- C# SMTP邮件发送 分类: C# 2014-07-13 19:10 333人阅读 评论(1) 收藏
邮件发送在网站应用程序中经常会用到,包括您现在看到的博客,在添加评论后,系统会自动发送邮件通知到我邮箱的,把系统发送邮件的功能整理了下,做了一个客户端Demo,希望对有需要的童鞋有所帮助: 核心代码: ...
- java实现smtp邮件发送
一.准备工作 首先你需要已一个发送邮箱,一般的邮箱都有SMTP.POP3服务,比如QQ邮箱,登陆QQ邮箱开启SMTP服务,开启是服务器会提示你设置独立密码,这个密码是跟邮箱正常登陆的密码不同的,这个是 ...
- python学习笔记(SMTP邮件发送:带附件)
博主有段时间没有更新博客了 先整理一个之前整理过的SMTP邮件发送,这次是带附件的功能 #!/usr/bin/env python # -*- coding: utf_8 -*- from email ...
- C# 通过smtp服务器进行邮件发送 MailHelper
C# 通过smtp服务器进行邮件发送 MailHelper.cs using System; using System.Data; using System.Configuration; using ...
随机推荐
- 软件工程wc项目,基于py
###WC项目文件链接:https://github.com/ILTHEW/wc.git 个人项目:WC 实践是理论的基础和验证标准,希望读者贯彻"做中学"的思想,动手实现下面的项 ...
- hdu6415 记忆化搜索或找规律
Rikka with Nash Equilibrium Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Sub ...
- python 变量之小整数池跟大整数池
在python中定义变量会有:id,type,value.对于==比较的是value,对于is比较的是id. 因此,对于相同value的变量,它的type相同,但是它的id值可能不一样.对于相同id的 ...
- hdu1256
画横线总是一个字符粗,竖线随着总高度每增长6而增加1个字符宽.当总高度从5增加到6时,其竖线宽度从1增长到2.下圈高度不小于上圈高度,但应尽量接近上圈高度,且下圈的内径呈正方形.每画一个"8 ...
- day42-python消息队列一
消息队列”是在消息的传输过程中保存消息的容器.消息队列最经典的用法就是消费者和生成者之间通过消息管道来传递消息,消费者和生成者是不通的进程.生产者往管道中写消息,消费者从管道中读消息.操作系统提供了很 ...
- How to find out which version of tensorflow is installed in my pc? - 如何找出我的电脑中安装了哪个版本的 tensorflow?
I'm using tensorflow and have got some weired issues. I'm told it might be related to the version of ...
- git push后出错
参考链接: 1,https://blog.csdn.net/shiren1118/article/details/7761203 2,http://www.cnblogs.com/xwdreamer/ ...
- vue中几种常见技巧
1.校验延迟:点击进入页面不希望校验必填字段this.$nextTick(() => { this.$refs.formRules.clearValidate() })2.$on $emit $ ...
- java编写ID3决策树
说明:每个样本都会装入Data样本对象,决策树生成算法接收的是一个Array<Data>样本列表,所以构建测试数据时也要符合格式,最后生成的决策树是树的根节点,通过里面提供的showTre ...
- MySQL数据库--思维导图
MySQL数据库--思维导图