内容题要

  • SMTP_SSL()或者.starttls()进行与服务器的安全连接
  • 用python内置的smtplib 测试发送基本的邮件
  • 发送HTML格式的内容
  • 发送附件
  • 结合CSV文件发送匹配到人的文件信息
    • 比如名字,ID,等等
  • 使用Yagmail更方便的发送邮件(傻瓜式)

准备步骤

Python内置的smtplib模块使用的是SMTP协议(Simple Mail Transfer Protocol)。方便起见,我们就以QQ邮箱的SMTP设置来一步一步的讲解。

第一步,设置QQ邮箱。

  1. 点击左上角的【设置】选项

  1. 点击【账户】,然后拉到下面,看到如下设置

  • 保证SMTP服务处于开启状态。同时,点击生成授权码

  • 生成的授权码就是通过python登录邮箱的密码

老少爷们儿,上硬菜啦

为了保证零基础也能明白每个代码的作用,我会尽量把前戏做足,保证整个过程sweet and slow。毕竟九浅一深才是最好的教学。

当然,我也考虑到很多人并不想要教学,所以我会给大家推荐一个傻瓜式的插件Yagmail,非常的方便以及人性化。如果你不想看我BB原理,可以直接跳到Yagmail。

稍显复杂的办法

发送邮件之前

在发邮件之前,首先你得保证SMTP链接是加密的,为了安全,多层膜总是好的。SMTP有两种加密协议:

  • SSL (Secure Sockets Layer)
  • TLS (Transport Layer Security)

对应的在代码中的两种加密方式:

  • 在连接时就用SMTP_SSL()方法加密
  • 在连接后用.starttls()方法加密

具体怎么用后文会有代码讲解。

不过需要注意的是,我们在使用SSL加密的时候,还需要使用creat_default_context()正确的配置SSL的环境。说人话就是,有膜,也要戴紧。

使用SMTP_SSL()
import smtplib, sslemail_host = "smtp.qq.com"  # 邮箱服务器地址
port = 465  # QQ邮箱端口
account = "my@qq.com"  # 登录账号
password = ""  # 密码,即授权码# 配置SSL加密设置
context = ssl.create_default_context()with smtplib.SMTP_SSL(host=email_host, port=port, context=context) as server:server.login(account, password)# TODO: Send email here

这里使用with as是因为发送邮件后,我们希望它能自动关闭。with as本质上就是__enter____exit__的结合,同时它还可以重复循环。

有不理解的地方可以看我上传的资源和笔记。

使用.starttls()

如前文所说,我们除了在连接开始时就加密以外,也可以连接以后再进行加密。

我个人不是很推荐这种方式,不太方便,也容易出错。

注意,SSL和TLS的端口不一样。

import smtplib, sslemail_host = "smtp.qq.com"  # 邮箱服务器地址
port = 587  # QQ邮箱TLS端口
account = "my@qq.com"  # 登录账号
password = ""  # 密码,即授权码# 配置SSL加密设置
context = ssl.create_default_context()# 尝试登录和发送邮件
try:server = smtplib.SMTP(email_host, port)server.ehlo()  # 给服务器打个招呼,可以省略server.starttls(context = context)server.login(account, password)# TODO: Send email here
except Exception as e:# Print any error messages to stdoutprint(e)
finally:server.quit()

发送纯文字的邮件

发送邮件的命令需要三个最基本的参数设置,分别是:发件人,收件人,内容。这个不难理解吧?所以我们需要设置好这三个变量,然后调用.sendmail()方法。

sender_email = "my@qq.com"
receiver_email = "your@qq.com"
message = '''\Subject:greetings from ZaunerWelcome to Zaun, asshole'''server.sendmail(sender_email, receiver_email, message)

而实际使用中,文本类型为中文或者英文的设置是不同的,所以我会分开讲解。

英文内容

英文内容的话会相对简单一下,很多东西都是默认设置好的。跟着教程一步一步走的话,你现在的代码应该是这个样子

import smtplib, sslemail_host = "smtp.qq.com"  # 邮箱服务器地址
port = 465  # QQ邮箱端口
account = "my@qq.com"  # 登录账号
password = ""  # 密码,即授权码# 配置SSL加密设置
context = ssl.create_default_context()sender_email = "sender@qq.com"
receiver_email = "receiver@qq.com"
message = '''\Subject:greetings from ZaunerWelcome to Zaun, asshole'''with smtplib.SMTP_SSL(host=email_host, port=port, context=context) as server:server.login(account, password)server.sendmail(sender_email, receiver_email, message)print("sent...") #发送成功的终端提示
中文内容

中文内容,每个字符占据两个字节,所以我们如果要发中文内容的话,需要引入MIMEText模块

具体代码就是在原有代码的基础上加几行命令,大家对照着看。至于MIME是啥,下一小节会具体讲到。

from email.mime.text import MIMEText #添加引入模块message = MIMEText('''\Subject:来自祖安的问候欢迎来到祖安, asshole''',_charset="utf-8")
# 使用MIMEText封装文本,并标注charset为utf-8server.sendmail(sender_email, receiver_email, message.as_string())
# 在发送的消息后添加.as_string()方法

发送HTML格式和附件

发送HTML格式文件

相比于纯文本,HTML格式中我们可以附带文字格式以及图片链接或者视频链接,所以如果要发送HTML格式的内容,我们需要MIME模块。关于更详细的信息,可以查看MIME

注意:部分邮箱出于安全性考虑,会屏蔽掉HTML元素内容,而只显示纯文本。所以出于发送信息的考虑,我们最好可以有一个纯文本的备用内容。于此同时,邮箱对于内容的渲染顺序是先入后出(FILO),所以我们要确定把HTML的内容放在纯文本之后,这样就可以先渲染HTML的内容。

具体代码如下

import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipartsender_email = "my@qq.com"
receiver_email = "your@qq.com"
password = "*****" #别忘了是授权码# 创建两个版本格式的内容
message = MIMEMultipart("alternative")
message["Subject"] = "multipart test" #邮件主题,title
message["From"] = sender_email # 这里可以是名字,没必要是邮箱地址
message["To"] = receiver_email # 收件人地址# 创建两个版本格式的内容
text = """\
Hi,
How are you?"""
html = """\
<html><body><p>Hi,<br>How are you?<br></p></body>
</html>
"""# 封装信息
part1 = MIMEText(text, "plain")
part2 = MIMEText(html, "html")# 把封装后的信息通过attach()命令加入到message里
# 记得前面说过的,先入后出的顺序
message.attach(part1)
message.attach(part2)# 发送
context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.qq.com", 465, context=context) as server:server.login(sender_email, password)server.sendmail(sender_email, receiver_email, message.as_string())print("sent...")

实际操作中,如果把HTML的代码直接写进PY文件里,就非常的冗长不利于观看,所以我们可以选择调用写好的HTML文档。

在通过邮箱发送非文字格式的内容的时候,我们第一步需要把这些文件转译为二进制的数据。在这一步,我们可以使用base64模块。

基本逻辑和前文一样包持不变,只是在原有的基础上加几行代码

from email import encoders # 引入转译模块
from email.mime.base import MIMEBase #引入basefilename = "测试.pdf"
# 注:这个文件在当前脚本的文件夹里
# 如果需要其他文件夹里的文件,需要输入完整路径# 转译PDF文件为二进制
with open(filename, "rb") as attachment:# 添加PDF文件为application/octet-stream格式# 把新生成的文件加入part变量里part = MIMEBase("application", "octet-stream")part.set_payload(attachment.read())# 以ASCII字符封装文件(ASCII字符是email服务器可接受的字符种类)
encoders.encode_base64(part)# 添加头部信息
part.add_header("Content-Disposition",f"attachment; filename= {filename}"
)# 添加完成后的附件文件到邮件文档里
message.attach(part)# 把邮件文档转为字符串,这个在发中文邮件那里有用过
text = message.as_string()

完成后代码如下

import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email import encoders # 引入转译模块
from email.mime.base import MIMEBase #引入basesender_email = "my@qq.com"
receiver_email = "your@qq.com"
password = "*****" #别忘了是授权码message = MIMEMultipart()
message["Subject"] = "multipart test" #邮件主题,title
message["From"] = sender_email # 这里可以是名字,没必要是邮箱地址
message["To"] = receiver_email # 收件人地址# 添加本地文件
# 如果需要其他文件夹里的文件,需要输入完整路径
filename = "测试.pdf" # 转译PDF文件为二进制
with open(filename, "rb") as attachment:# 添加PDF文件为application/octet-stream格式# 不理解没关系,记住就行了# 把新生成的文件加入part变量里part = MIMEBase("application", "octet-stream")part.set_payload(attachment.read())# 以ASCII字符封装文件(ASCII字符是email服务器可接受的字符种类)
encoders.encode_base64(part)# 添加头部信息
part.add_header("Content-Disposition",f"attachment; filename= {filename}"
)# 添加完成后的附件文件到邮件文档里
message.attach(part)# 把邮件文档转为字符串,这个在发中文邮件那里有用过
text = message.as_string()# 发送
context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.qq.com", 465, context=context) as server:server.login(sender_email, password)server.sendmail(sender_email, receiver_email, text)print("sent...")
小结

两个部分的内容可以结合一起用,具体我就不细说了。

用CSV文件实现循环发送针对性的关键信息

如果你想给不同的客户或者学生发送信息,里面要有他们各自的姓名以及对应的私人信息,那么下面这些内容就是你需要的。

这个真的是超级实用而且超级简单。

CSV文件

CSV(comma separate value)从字面上来解释,就是用逗号作为分隔符的数据文件。

创建CSV文件也很简单,用excel里的数据直接另存为就有CSV选项。

当你用文本工具打开CSV文件的时候,你会发现CSV文件都是用逗号分隔的。

开始

首先,在PYTHON文件夹下创建一个名为test.csv的文件,示例内容如下

我也没测试这个邮箱是不是真的存在。。。推荐大家还是用自己的邮箱来测试

邮箱地址 姓名 绰号
zhangsan20200513@qq.com 张三 法外狂徒
lisi20200513@qq.com 李四 对张三宝具

读取CSV文件的信息的代码如下

import csvwith open("test.csv") as file:reader = csv.reader(file)next(reader)  # 忽略第一行(标题行)信息for email, name, nickname in reader:print(f"Sending email to {name}...")# TODO:send email

补充:如果你的CSV文件的两头存在无用的空格,可以用.strip()方法来自动删除

那么,现在就又扯回到一个问题,中英文编码。

英文

如果是英文,那相对就比较简单

思路就是在发送邮件的时候,配合CSV文件进行循环输出即可

import csv, smtplib, sslmessage = """Subject: Your gradeHi {name}, your grade is {grade}"""
from_address = "my@qq.com"
password = ""context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.qq.com", 465, context=context) as server:server.login(from_address, password)with open("test.csv") as file:reader = csv.reader(file)next(reader)  # Skip header rowfor name, email, grade in reader:server.sendmail(from_address,email,message.format(name=name,grade=grade),)
中文

中文的话,因为需要通过MIMEText进行编码后发送,所以需要在编码前配合CSV进行循环输出,说白了,我们先把内容循环以后,再封装发送。

import csv
import smtplib
import ssl
from email.mime.text import MIMETextsender_email = "my@qq.com"
password = ""  # 密码,即授权码context = ssl.create_default_context()
email_template = """主题:拜帖你好,{name}。 久闻{nickname}大名,幸会幸会。"""with open("test.csv", "r", encoding="utf-8") as file:reader = csv.reader(file)next(reader)for email_address, name, nickname in reader:text = email_template.format(name=name, nickname=nickname)message = MIMEText(text, "plain", _charset="utf-8")with smtplib.SMTP_SSL("smtp.qq.com", 465, context=context) as server:server.login(sender_email, password)server.sendmail(sender_email, email_address, message.as_string())

Yagmail——简单的办法

一句话,非常的人性化。 其他邮箱行不行我不确定,但是QQ邮箱是可以的。
安装ygamail的命令是在终端输入以下命令(windows)
pip install yagmail

import yagmailreceiver = "my@qq.com"
sender = "your@qq.com"
password = "******"
subject = "Greetings from lovissy" # 主题
content = "How are you, bro." # 正文内容
attachment = "test.jpg" # 附件yag = yagmail.SMTP(sender, password, host="smtp.qq.com")
yag.send(receiver, subject, content, attachment)

【LoVissy学习笔记】用Python3.82自动发送邮件。QQ邮箱相关推荐

  1. python基础代码事例-学习笔记:python3,代码。小例子习作(2017)

    http://www.cnblogs.com/qq21270/p/7634025.html 学习笔记:python3,一些基本语句(一些基础语法的代码,被挪到这里了) 日期和时间操作 http://b ...

  2. CAS学习笔记五:SpringBoot自动/手动配置方式集成CAS单点登出

    本文目标 基于SpringBoot + Maven 分别使用自动配置与手动配置过滤器方式实现CAS客户端登出及单点登出. 本文基于<CAS学习笔记三:SpringBoot自动/手动配置方式集成C ...

  3. python搞笑语句_云计算开发学习笔记:Python3 import语句

    原标题:云计算开发学习笔记:Python3 import语句 想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下: 当解释器遇到 import 语句,如果模块在当前的 ...

  4. python基础编程:selenium+python实现自动登陆QQ邮箱并发送邮件功能

    本期做一个selenium详细实例,会把我在元素定位中遇到的一些阻塞和经验分享给大家. (浏览器为Chrome) (如果只需要最终的完整代码,请直接跳转到文章最后) 浏览器打开QQ邮箱登录网址 QQ邮 ...

  5. python自动登录qq邮箱_selenium+python实现自动登陆QQ邮箱并发送邮件功能

    本期做一个selenium详细实例,会把我在元素定位中遇到的一些阻塞和经验分享给大家. (浏览器为Chrome) (如果只需要最终的完整代码,请直接跳转到文章最后) 浏览器打开QQ邮箱登录网址 fro ...

  6. python3自动读取QQ邮箱的附件 脚本

    python3自动读取QQ邮箱的附件 脚本 环境 python3 实现,QQ 邮箱,开启SMTP /POP 服务 注意 账号密码:密码 不是账号密码,而是认证码.需要开启服务获取. 参考 https: ...

  7. python实现自动登录QQ邮箱

    python 和selenium实现自动登录QQ邮箱 selenium需要先导入,pip install selenium 或者在pycharm里面点击file–settings–Project–Pr ...

  8. WordPress怎么实现评论自动填写QQ邮箱与昵称?

    WordPress评论自动填写QQ邮箱与昵称这个功能很鸡肋呀,以至于我虽然留了位置,但没写功能.不过最近有人问了这个事,还是写篇教程出来吧.功能实现主要是通过腾讯的查询接口实现的,不过在2018年7月 ...

  9. python3实现自动发送邮件

    1 电子邮件协议 图来自计算机网络谢希仁一书 SMTP,用于用户向邮件服务器发送邮件或在邮件服务器之间发送邮件. POP3,用于用户从邮件服务器读取邮件,在客户端的操作(如移动邮件.标记已读等),不会 ...

最新文章

  1. python免费试听-哈尔滨Python人工智能课程免费试听
  2. 【Kaggle-MNIST之路】CNN+改进过的损失函数(三)
  3. 每天一个Linux命令之date
  4. PAT1054 求平均值 (20 分)【从非法输入字符串中获取合法输入 cin.putback()】
  5. 设备翻转时viewController调用的方法
  6. UiPath: Selectors repair 选择器的修复,即被选择的按钮发生改变如何选择第二按钮...
  7. c++ 每半个小时打印一次_有了3D打印机,后期该如何维护呢
  8. (转)VS.NET使用
  9. 【Python3网络爬虫开发实战】1.4.1-MySQL的安装
  10. (组合数学笔记)格点路径问题分析求解
  11. android高德天气api,天气预报-天气预报-示例中心-JS API 2.0 示例 | 高德地图API
  12. innovus停止当前命令_从命令行停止node.js程序
  13. 虚拟机安装BackTrack 5 的教程详解!
  14. 使用python做一个翻译工具
  15. [BScroll warn]: Can not resolve the wrapper DOM. Vue better-scroll
  16. VS2015社区版MFC安装
  17. 计算机函数sun怎么用,excel函数怎么使用
  18. 华三H3C交换机路由器如何配置dhcp中继(dhcp relay)
  19. BTTCOJ 问题 C: 逃离机场 广度优先搜索
  20. [Pytorch系列-24]:神经网络基础 - 单个无激活函数的神经元实现简单线性回归 - 1

热门文章

  1. lammps教程:薄膜渗透模拟(3)--不同孔隙率对过滤效果的影响
  2. 使用easypoi导出注解添加序号,无须重写ExcelExportUtil类
  3. Javaweb8==未实现前后端分离的列表展示、新增、删除、修改功能。 servlet(逻辑处理,封装数据进域对象,转发到jsp)+jsp(el表达式获取域对象中的数据+JSTL替换if for)。
  4. MSVC编译器-C2001 常量中有换行符错误解决方法
  5. 成都拓嘉启远电商:拼多多账号异常怎么回事
  6. 再论”核高基“培育”外国种“,歪名传四方
  7. 新学期,新气象,新旅程
  8. 用Java写微信红包实现模拟微信发红包
  9. 基于Tempo大数据分析平台的智慧博物馆大数据中心
  10. [JAVA]数字摘要算法工具类——(Hamc)MD5/SHA1/SHA256/SHA512/PBKDF2