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.hqwc.cn/news/106457.html

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

相关文章

前端中的事件委托

前端小知识 事 件 委 托 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/132819265 【介绍】&#xff1…

T2I-Adapter:增强文本到图像生成的控制能力

链接&#xff1a;GitHub - TencentARC/T2I-Adapter: T2I-Adapter 文本到图像生成 (T2I) 是人工智能领域的一个重要研究方向。近年来&#xff0c;随着深度学习技术的发展&#xff0c;T2I 技术取得了显著进展&#xff0c;生成的图像在视觉效果上已经与真实图像难以区分。 然而&…

解决nbsp;不生效的问题

代码块 {{title}} title:附 \xa0\xa0\xa0件,//或者 <span v-html"title"></span> title:附 件&#xff1a;,效果图

机器学习(10)---特征选择

文章目录 一、概述二、Filter过滤法2.1 过滤法说明2.2 方差过滤2.3 方差过滤对模型影响 三、相关性过滤3.1 卡方过滤3.2 F检验3.3 互信息法3.4 过滤法总结 四、Embedded嵌入法4.1 嵌入法说明4.2 以随机森林为例的嵌入法 五、Wrapper包装法5.1 包装法说明5.2 以随机森林为例的包…

Sql注入详解(原理篇)

一、简介 SQL 注入漏洞非常复杂&#xff0c;区分各种数据库类型&#xff0c;提交方法&#xff0c;数据类型等注入&#xff0c;同样此类漏洞是WEB安全中严重的安全漏洞&#xff0c;学习如何利用&#xff0c;挖掘&#xff0c;修复也是很重要的 二、SQL注入原理 1、什么是SQL注…

蓝桥杯官网练习题(纸牌三角形)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 A,2,3,4,5,6,7,8,9 共 99 张纸牌排成一个正三角形&#xff08;A 按 1 计算&#xff09;。要求每个边的和相等。 下图就是一种排法。 这样的排法可能会有很多。 如果…

RK3399平台开发系列讲解(内核调试篇)USB摄像头快速测试

🚀返回专栏总目录 文章目录 一、检测设备二、安装必要的库三、 mjpeg-stream 安装四、实时预览沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇介绍如何快速测试 USB 摄像头。 一、检测设备 将 USB 摄像头插上,查看是否找到设备,输入指令:v4l2-ctl --list-d…

数据结构:线性表之-循环双向链表(万字详解)

目录 基本概念 1&#xff0c;什么是双向链表 2&#xff0c;与单向链表的区别 双向链表详解 功能展示&#xff1a; 1. 定义链表 2&#xff0c;创建双向链表 3&#xff0c;初始化链表 4,尾插 5&#xff0c;头插 6&#xff0c;尾删 判断链表是否被删空 尾删代码 7&a…

.net 7 隐藏swagger的api

1.写一个隐藏接口特性表示 using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen;using System.Web.Http.Description;namespace JiaTongInterface.Filter {public class SwaggerApi : Swashbuckle.AspNet…

JavaScript Promise 的真正工作原理

Promise 是处理异步代码的一种技术,也称为脱离回调地狱的头等舱门票。 3 承诺状态 待定状态 已解决状态 拒绝状态 理解 JavaScript Promis 什么是承诺? 通常,承诺被定义为最终可用的值的代理。 Promise 多年来一直是 JavaScript 的一部分(在 ES2015 中标准化并引入)。最…

青骨申报|CSC管理信息平台使用指南

2023年青年骨干教师出国研修项目于9月10-25日网上报名&#xff0c;为此知识人网小编特转载最新版本的国家留学基金委&#xff08;CSC&#xff09;国家公派留学管理信息平台使用指南&#xff08;国内申请访学类&#xff09;&#xff0c;以方便申报者查阅。 提示&#xff1a;国家…

【算法专题突破】双指针 - 最大连续1的个数 III(11)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;1004. 最大连续1的个数 III - 力扣&#xff08;Leetcode&#xff09; 这道题不难理解&#xff0c;其实就是求出最长的连续是1的子数组&#xff0c; 但是&#xff0c;他支…