python 学习笔记(5)——SMTP 使用QQ邮箱发送邮件

目录

发送邮件

1、准备工作:

2、发送纯文本信息内容:

3、发送 HTML 格式的内容:

4、发送带附件的邮件:

5、群发(一个邮件,发给多个人):


发送邮件

        以下都 以 QQ邮箱 为发送方举例;

 

1、准备工作:

         使用 QQ邮箱发送邮件,需要到 “设置”=>“账号” 中 开启 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

        开启服务后,点击 管理服务

        然后会跳转到账号与安全页面,点击生成授权码以生成授权码,并记录下授权码:

参考:

https://wx.mail.qq.com/list/readtemplate?name=app_intro.html#/agreement/authorizationCode

2、发送纯文本信息内容:

import smtplib
import time
from email.mime.text import MIMETextdef send_QQ_email_plain():sender = user = 'sender@qq.com'    # 发送方的邮箱账号passwd = 'abcdefgxxxxx'            # 授权码receiver = 'receiver@qq.com'        # 接收方的邮箱账号,不一定是QQ邮箱# 纯文本内容 msg = MIMEText(f'Python 邮件发送测试 {time.time()}', 'plain', 'utf-8')# From 的内容是有要求的,前面的abc为自己定义的 nickname,如果是ASCII格式,则可以直接写msg['From'] = f'abc <sender@qq.com>' msg['To'] = receivermsg['Subject'] = 'Python SMTP 邮件测试'         # 点开详情后的标题try:# 建立 SMTP 、SSL 的连接,连接发送方的邮箱服务器smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)# 登录发送方的邮箱账号smtp.login(user, passwd)# 发送邮件 发送方,接收方,发送的内容smtp.sendmail(sender, receiver, msg.as_string())print('邮件发送成功')smtp.quit()except Exception as e:print(e)print('发送邮件失败')

        对于 msg['Form'] 的要求:

 

        如果自定义的 nickname 是非 ASCII 字符,则直接写会报错,如:

msg['From'] = f'好 <sender@qq.com>'

 

        正确的格式为:

msg['From'] = f'=?UTF-8?B?{base64.b64encode("好".encode()).decode()}?= <sender@qq.com>'

        如果接收方是 QQ 邮箱,则前面的 nickname 会显示在该位置:

        如果不需要自己定义 nickname,也可以直接使用邮箱账号:

msg['From'] = '12345@qq.com'

        则会显示邮箱账号:

 

         点开邮件查看详情:

 

3、发送 HTML 格式的内容:

import base64
import smtplib
import time
from email.mime.text import MIMETextdef send_QQ_mail_HTML():user = 'sender@qq.com'passwd = 'abcdefxxxx'receiver = 'receiver@qq.com'# 直接写# html_content = '''#     <h1>这个是邮件的内容</h1># '''# 读入 html 文件的内容with open('./for_email.html', mode='r', encoding='utf-8') as f:html_content = f.read()# 指定类型是 htmlmsg = MIMEText(html_content, 'html', 'utf-8')msg['From'] = usermsg['To'] = receivermsg['Subject'] = '测试发送 HTML 内容'try:smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)smtp.login(user, passwd)smtp.sendmail(user, receiver, msg.as_string())print('发送成功')except:print('发送失败')

        for_email.html 的内容:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>h1{color: brown;}p{margin: 5px;color: purple;}</style>
</head>
<body><h1>这是一个邮件内容的标头</h1><img src="https://img1.baidu.com/it/u=1890390320,3399874998&fm=253&fmt=auto&app=120&f=JPEG?w=1422&h=800"><div><h3>From合法性检查</h3><p>一、根据RFC5322协议,邮件标头中需要包含'From'信息。</p><p>二、根据RFC2047, RFC822协议,邮件标头中的'From'形式为:</p><p>1. 邮箱地址形式:prefix@domain, 如 'abc@qq.com'。</p><p>2. 昵称+空格+&lt;邮箱地址&gt;形式:nickname &lt;prefix@domain&gt;,其中,nickname为ASCII字符集中字符组合或编码文本:</p><p>(1)如果昵称全为ASCII字符,如'ABC',邮箱地址为'abc@qq.com',则标头中的'From'为'ABC &lt;abc@qq.com&gt;'。注意'ABC'和'&lt;abc@qq.com&gt;'之间用空格隔开;</p><p>(2)如果昵称包含非ASCII字符,如中文,则请使用base64对昵称进行编码。nickname最终的形式为:"=?" charset "?" encoding "?" encoded-text "?="。其中,charset为字符集;encoding为编码方式,'B'代表base64;encoded-text为编码后的文本。例如,昵称为'QQ邮箱昵称示例',邮箱地址为'abc@qq.com',则对昵称进行base64编码,字符集使用UTF-8,则nickname为 '=?UTF-8?B?UVHpgq7nrrHmmLXnp7DnpLrkvos=?=',最终邮件标头中的'From'为'"=?utf-8?B?UVHpgq7nrrHmmLXnp7DnpLrkvos=?=" &lt;abc@qq.com&gt;'。注意编码文本和邮件地址间用空格隔开。</p></div>
</body>
</html>

 

        该html中含有引用了外链的img图片,如果接收方为QQ邮箱,则默认不会显示图片:

        如果是其他的邮箱,图片有可能可以显示(如企业微信的邮箱),html 的样式也可能会丢失不奏效。

4、发送带附件的邮件:

import base64
import smtplib
import time
from email.mime.application import MIMEApplication
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipartdef send_QQ_email_mul():sender = user = 'sender@qq.com'passwd = 'abcdefghijk'         # 不是密码,是生成的 授权码receiver = 'receiver@qq.com'content = MIMEMultipart()           # 创建一个包含多个部分的内容content['From'] = usercontent['To'] = receivercontent['Subject'] = 'Test Email'# 添加文本内容# text = MIMEText('this is a test email.', 'plain', 'utf-8')# content.attach(text)# 添加html内容with open('./for_email.html', mode='r', encoding='utf-8') as f:html_content = f.read()msg = MIMEText(html_content, 'html', 'utf-8')content.attach(msg)# 添加附件with open('./data.xlsx', 'rb') as f:attachment = MIMEApplication(f.read())    # 读取为附件attachment.add_header('Content-Disposition', 'attachment', filename='data.xlsx')content.attach(attachment)try:smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)smtp.login(user, passwd)smtp.sendmail(sender, receiver, content.as_string())print('邮件发送成功')except Exception as e:print(e)print('发送邮件失败')

5、群发(一个邮件,发给多个人):

        将 receiver 写成每个人的邮箱账号数组即可

import base64
import smtplib
import time
from email.mime.text import MIMETextdef send_QQ_mail():sender = user = '12345@qq.com'passwd = 'ABCD'# 写成数组,将发给这三者receiver = ['abcdef@qq.com','aaa@xxx.edu.cn','abcd@gmail.com']msg = MIMEText(f'Python 邮件发送测试 {time.time()}', 'plain', 'utf-8')msg['From'] = f'=?UTF-8?B?{base64.b64encode("好".encode()).decode()}?= <sender@qq.com>'msg['To'] = 'you'            # 每个人都会看到这个内容msg['Subject'] = 'Python SMTP 邮件测试'         # 点开详情后的标题try:# 建立 SMTP 、SSL 的连接smtp = smtplib.SMTP_SSL('smtp.qq.com', 465)# 登录smtp.login(user, passwd)# 发送邮件 发送方,接收方,发送的内容smtp.sendmail(sender, receiver, msg.as_string())print('邮件发送成功')smtp.quit()except Exception as e:print(e)print('发送邮件失败')

 

 

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

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

相关文章

Nginx+Tomcat(多实例)实现动静分离和负载均衡

一、Tomcat 多实例部署 1.在安装好jdk环境后&#xff0c;添加两例tomcat服务 #解压安装包 cd /opt tar zxvf apache-tomcat-9.0.16.tar.gz#移动并复制一例 mkdir /usr/local/tomcat mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1 cp -a /usr/local/tomcat/tomcat1 /usr…

记录一次开机内存分析的全过程

作者&#xff1a;zzy的学习笔记 记录一次开机内存分析的全过程&#xff0c;尽量详尽的介绍常用内存分析工具和命令行的使用&#xff0c;结合具体问题探讨开机内存分析的实践经验。通过这篇文章我会介绍开机内存的常用测试分析工具的基本使用方法&#xff0c;以及如何通过抓取出…

在Ubuntu上建立博客网站,利用Cpolar+Inis快速实现专业写作

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总…

springboot+redis

1.pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 2.yml配置 # redis 配置redis:host: 127.0.0.1#超时连接timeout: 1000msjedis:pool:#最大连…

盲打键盘的正确指法指南

简介 很多打字初学者&#xff0c;并不了解打字的正确指法规范&#xff0c;很容易出现只用两根手指交替按压键盘的“二指禅”情况。虽然这样也能实现打字&#xff0c;但是效率极低。本文将简单介绍盲打键盘的正确指法&#xff0c;以便大家在后续的学习和工作中能够提高工作效率…

Pytorch Advanced(三) Neural Style Transfer

神经风格迁移在之前的博客中已经用keras实现过了&#xff0c;比较复杂&#xff0c;keras版本。 这里用pytorch重新实现一次&#xff0c;原理图如下&#xff1a; from __future__ import division from torchvision import models from torchvision import transforms from PIL…

2024年java面试--mysql(2)

系列文章目录 2024年java面试&#xff08;一&#xff09;–spring篇2024年java面试&#xff08;二&#xff09;–spring篇2024年java面试&#xff08;三&#xff09;–spring篇2024年java面试&#xff08;四&#xff09;–spring篇2024年java面试–集合篇2024年java面试–redi…

FPGA实战小项目3

基于FPGA的波形发生器 基于FPGA的波形发生器 基于FPGA的beep音乐播放器设计 基于FPGA的beep音乐播放器设计 基于FPGA的cordic算法实现DDS sin和cosine波形的产生 基于FPGA的cordic算法实现DDS sin和cosine波形的产生

iframe 实现跨域,两页面之间的通信

一、 背景 一个项目为vue2&#xff0c;一个项目为vue3&#xff0c;两个不同的项目实现iframe嵌入&#xff0c;并实现通信 二、方案 iframe跨域时&#xff0c;iframe组件之间常用的通信&#xff0c;主要是H5的possmessage方法 三、案例代码 父页面-vue2&#xff08;端口号为…

JWT 使用教程 授权 认证

JWT 1.什么是JWT JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally s…

轻松搭建本地知识库的ChatGLM2-6B

近期发现了一个项目&#xff0c;它的前身是ChatGLM&#xff0c;在我之前的博客中有关于ChatGLM的部署过程&#xff0c;本项目在前者基础上进行了优化&#xff0c;可以基于当前主流的LLM模型和庞大的知识库&#xff0c;实现本地部署自己的ChatGPT&#xff0c;并可结合自己的知识…

Zabbix登录绕过漏洞复现(CVE-2022-23131)

0x00 前言 最近在复现zabbix的漏洞&#xff08;CVE-2022-23131&#xff09;&#xff0c;偶然间拿到了国外某公司zabbix服务器。Zabbix Sia Zabbix是拉脱维亚Zabbix SIA&#xff08;Zabbix Sia&#xff09;公司的一套开源的监控系统。该系统支持网络监控、服务器监控、云监控和…

C# Winform 简单排期实现(DevExpress TreeList)

排期的需求在很多任务安排的系统中都有相应的需求&#xff0c;原生的Winform控件并未提供相应的控件&#xff0c;一般都是利用DataGridViewTreeView组合完成相应的需求&#xff0c;实现起来比较麻烦。用过DevExpress控件集的开发者应该知道&#xff0c;DevExpress WinForm提供了…

每日一博 - CRUD system VS Event sourcing design

文章目录 概念Arch Overview小结 概念 CRUD 系统和事件溯源设计是两种不同的软件架构方法&#xff0c;用于处理数据和应用程序的状态。以下是它们的区别以及各自适用的场景&#xff1a; CRUD 系统&#xff1a; CRUD 代表 Create&#xff08;创建&#xff09;、Read&#xff08…

Android Studio实机同WIFI调试

1.点击Pair using Wi-Fi 2.手机扫描跳出来的二维码 小米手机可搜索无线调试进行adb 调试

模态分析的概念。C++减振器设计。

一、说明 模态分析是工程和物理学中用于研究系统或结构动态特性的技术。它涉及分析系统的振动或振荡的自然模式以及相应的频率、阻尼系数和振型。 在模态分析中&#xff0c;所研究的系统通常表示为一组质量、刚度和阻尼元件&#xff08;在下面的文章中忽略了阻尼&#xff09;。…

单链表(Single Link Table)——单文件实现

一、单链表前言 上篇文章我们讲述了顺序表&#xff0c;认真学习我们会发现顺序表优缺点。 缺点1&#xff1a;头部和中部的插入删除效率都不行&#xff0c;时间和空间复杂度都为O(N); 缺点2&#xff1a;空间不够了扩容有一定的消耗(尤其是realloc的异地扩容)&#xff1b; 缺…

Docker-namespace

Docker-namespace namespace基础命令dd 命令mkfsdfmountunshare pid 隔离试验mount 隔离 namespace namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源&#xff0c;而另外一些进程也只能看到与它们自己相关的资源…

【Unity编辑器扩展】| 顶部菜单栏扩展 MenuItem

前言【Unity编辑器扩展】 | 顶部菜单栏扩展 MenuItem一、创建多级菜单二、创建可使用快捷键的菜单项三、调节菜单显示顺序和可选择性四、创建可被勾选的菜单项五、右键菜单扩展5.1 Hierarchy 右键菜单5.2 Project 右键菜单5.3 Inspector 组件右键菜单六、AddComponentMenu 特性…

MediaBox助力企业一站式获取音视频能力

以一只音视频百宝箱&#xff0c;应对「千行千面」。 洪炳峰、楚佩斯&#xff5c;作者 大家好&#xff0c;今天我分享的主题是MediaBox——行业音视频数字化再加速。 根据权威数据表明&#xff0c;65%的行业数字化信息来自视频&#xff0c;基于此&#xff0c;音视频技术对于行…