Python实现自动发送邮件(详解)

Python实现自动发送邮件

1.开启SMTP服务

为了实现自动发送邮件的目的,我们需要在邮箱中开启SMTP服务:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这点很关键,别忘了去开启SMTP, 别忘了去开启SMTP,否则邮件是无法发送成功的 。然后你还需要点击下面生成授权码,这个授权码才是使用Python发送邮件时的真正密码
在这里插入图片描述

2.python发邮件需要掌握两个模块

smtplib和email,这俩模块是python自带的,只需import即可使用。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。

smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。

email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。

代码说明:
1)smtplib模块

smtplib.SMTP() :实例化SMTP()

login(user,password):
user:登录邮箱的用户名。
password:登录邮箱的密码,像笔者用的是网易邮箱,网易邮箱一般是网页版,需要用到客户端密码,需要在网页版的网易邮箱中设置授权码,该授权码即为客户端密码。

sendmail(from_addr,to_addrs,msg,…):
from_addr:邮件发送者地址
to_addrs:邮件接收者地址。字符串列表[‘接收地址1’,‘接收地址2’,‘接收地址3’,…]或’接收地址’
msg:发送消息:邮件内容。一般是msg.as_string():as_string()是将msg(MIMEText对象或者MIMEMultipart对象)变为str。

quit():用于结束SMTP会话。

2)email模块

email模块下有mime包,mime英文全称为“Multipurpose Internet Mail Extensions”,即多用途互联网邮件扩展,是目前互联网电子邮件普遍遵循的邮件技术规范。

该mime包下常用的有三个模块:text,image,multpart。
导入方法如下:

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

构造一个邮件对象就是一个Message对象,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:

Message
+- MIMEBase+- MIMEMultipart+- MIMENonMultipart+- MIMEMessage+- MIMEText+- MIMEImage

1、自动发送普通的文字邮件代码实现如下:

from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header# smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。
# email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。host_server = 'smtp.qq.com'  #qq邮箱smtp服务器
sender_qq = '9156393@qq.com' #发件人邮箱
pwd = '你的授权码'
receiver = ['910393@qq.com','824864@qq.com' ]#收件人邮箱
#receiver = '913@qq.com'
mail_title = 'Python自动发送的邮件' #邮件标题
mail_content = "您好,这是使用python登录QQ邮箱发送邮件的测试——zep" #邮件正文内容
# 初始化一个邮件主体
msg = MIMEMultipart()
msg["Subject"] = Header(mail_title,'utf-8')
msg["From"] = sender_qq
# msg["To"] = Header("测试邮箱",'utf-8')
msg['To'] = ";".join(receiver)
# 邮件正文内容
msg.attach(MIMEText(mail_content,'plain','utf-8'))smtp = SMTP_SSL(host_server) # ssl登录# login(user,password):
# user:登录邮箱的用户名。
# password:登录邮箱的密码,像笔者用的是网易邮箱,网易邮箱一般是网页版,需要用到客户端密码,需要在网页版的网易邮箱中设置授权码,该授权码即为客户端密码。
smtp.login(sender_qq,pwd)# sendmail(from_addr,to_addrs,msg,...):
# from_addr:邮件发送者地址
# to_addrs:邮件接收者地址。字符串列表['接收地址1','接收地址2','接收地址3',...]或'接收地址'
# msg:发送消息:邮件内容。一般是msg.as_string():as_string()是将msg(MIMEText对象或者MIMEMultipart对象)变为str。
smtp.sendmail(sender_qq,receiver,msg.as_string())# quit():用于结束SMTP会话。
smtp.quit()

在这里插入图片描述
2、发送html格式邮件

import smtplib
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Headerhost_server = 'smtp.qq.com'  #qq邮箱smtp服务器
sender_qq = '91693@qq.com' #发件人邮箱
pwd = '你的授权码'
receiver = '96393@qq.com'
mail_title = 'Python自动发送html格式的邮件' #邮件标题#邮件正文内容
mail_content = "您好,<p>这是使用python登录QQ邮箱发送HTNL格式邮件的测试:</p> <p><a href='https://blog.csdn.net/weixin_44827418?spm=1000.2115.3001.5113'>CSDN个人主页</a></p>"msg = MIMEMultipart()
msg["Subject"] = Header(mail_title,'utf-8')
msg["From"] = sender_qq
msg["To"] = Header("测试邮箱","utf-8")msg.attach(MIMEText(mail_content,'html'))try:smtp = SMTP_SSL(host_server) # ssl登录连接到邮件服务器smtp.set_debuglevel(1) # 0是关闭,1是开启debugsmtp.ehlo(host_server) # 跟服务器打招呼,告诉它我们准备连接,最好加上这行代码smtp.login(sender_qq,pwd)smtp.sendmail(sender_qq,receiver,msg.as_string())smtp.quit()print("邮件发送成功")
except smtplib.SMTPException:print("无法发送邮件")

在这里插入图片描述

3、发送带附件的邮件

import smtplib
import string
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.application import MIMEApplication # 用于添加附件host_server = 'smtp.qq.com'  #qq邮箱smtp服务器
sender_qq = '91393@qq.com' #发件人邮箱
pwd = '你的授权码'
receiver = '9193@qq.com'
mail_title = 'Python自动发送html格式的邮件' #邮件标题#邮件正文内容
mail_content = "您好,<p>这是使用python登录QQ邮箱发送HTNL格式邮件的测试:</p> <p><a href='https://blog.csdn.net/weixin_44827418?spm=1000.2115.3001.5113'>CSDN个人主页</a></p>"msg = MIMEMultipart()
msg["Subject"] = Header(mail_title,'utf-8')
msg["From"] = sender_qq
msg["To"] = Header("测试邮箱","utf-8")msg.attach(MIMEText(mail_content,'html'))
attachment = MIMEApplication(open('./test.xlsx','rb').read())
attachment["Content-Type"] = 'application/octet-stream'
# 给附件重命名
basename = "test.xlsx"
attachment.add_header('Content-Dispositon','attachment',filename=('utf-8', '', basename))#注意:此处basename要转换为gbk编码,否则中文会有乱码。
msg.attach(attachment)try:smtp = SMTP_SSL(host_server) # ssl登录连接到邮件服务器smtp.set_debuglevel(1) # 0是关闭,1是开启debugsmtp.ehlo(host_server) # 跟服务器打招呼,告诉它我们准备连接,最好加上这行代码smtp.login(sender_qq,pwd)smtp.sendmail(sender_qq,receiver,msg.as_string())smtp.quit()print("邮件发送成功")
except smtplib.SMTPException:print("无法发送邮件")

在这里插入图片描述

3.使用zmail模块读取邮件

首先需要在cmd命令行安装zmail模块,输入pip install zmail安装即可
在这里插入图片描述

import zmailserver = zmail.server('9193@qq.com','你的授权码')
mail = server.get_latest()
zmail.show(mail)

在这里插入图片描述

import zmailserver = zmail.server('993@qq.com','你的授权码')
mail = server.get_latest()
# zmail.show(mail)
print(mail['subject'])
print(mail['id'])
print(mail['from'])
print(mail['to'])
print(mail['content_text'])
print(mail['content_html'])# 用来保存附件
# target_path为None则默认保存在当前目录下
# overwrite=True 是指如果出现同名文件则进行覆盖
zmail.save_attachment(mail,target_path=None,overwrite=True)

在这里插入图片描述

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

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

相关文章

unity 常用函数

GameObject.FindGameObjectByTag(); anim.SetFloat("speed",Mathf.Abs(h)); Physics2D.lineCast2D(transform.position,groundCheck.position,1<<LayerMask.NameToLay("ground")); AddForce(); 转载于:https://www.cnblogs.com/yufenghou/p/5325092.…

React 组件:计时器例子

文章目录1. 将应用程序分解为组件2. 构建应用静态版本3. 哪些组件是有状态的4. 每个 state 应该在哪个组件里5. 硬编码初始化state6. 添加反向数据流7. 添加服务器通信learn from 《React全家桶&#xff1a;前端开发与实例详解》https://zh-hans.reactjs.org/tutorial/tutorial…

一、快速开始一个 MyBatis项目(详解)

1.0 概述 1.三层架构 界面层&#xff1a; 和用户打交道的&#xff0c; 接收用户的请求参数&#xff0c; 显示处理结果的。&#xff08;jsp &#xff0c;html &#xff0c;servlet&#xff09; 业务逻辑层&#xff1a; 接收了界面层传递的数据&#xff0c;计算逻辑&#xff0c;…

2013 ACM区域赛长沙 K Pocket Cube hdu 4801

题意:给了一个2*2的魔方..每步操作可以将任意一面翻转90度..现在问在N(<7)步内.最多能翻出几面相同的. 直接打表模拟每种翻转情况 1 #include<cstdio>2 #include<cstring>3 #include<algorithm>4 #include<iostream>5 using namespace std;6 7 int …

React 组件和服务器

文章目录1. 请求服务器数据2. 发送开始停止请求3. 发送创建、删除、更新请求learn from 《React全家桶&#xff1a;前端开发与实例详解》https://zh-hans.reactjs.org/tutorial/tutorial.htmlhttps://zh-hans.reactjs.org/docs/create-a-new-react-app.html#create-react-app服…

二、MyBatis常用对象分析 封装工具类

1.0 MyBatis 对象分析 &#xff08;1&#xff09; Resources 类 Resources 类&#xff0c;顾名思义就是资源&#xff0c;用于读取资源文件。其有很多方法通过加载并解析资源文件&#xff0c;返回不同类型的 IO 流对象。 &#xff08;2&#xff09; SqlSessionFactoryBuilder…

Java的几个同步辅助类

Java为我们提供了一些同步辅助类&#xff0c;利用这些辅助类我们可以在多线程编程中&#xff0c;灵活地把握线程的状态。 CountDownLatch CountDownLatch一个同步辅助类&#xff0c;在完成一组正在其他线程中执行的操作之前&#xff0c;它允许一个或多个线程一直等待。 再Count…

iOS图片拉伸技巧

纵观移动市场&#xff0c;一款移动app&#xff0c;要想长期在移动市场立足&#xff0c;最起码要包含以下几个要素&#xff1a;实用的功能、极强的用户体验、华丽简洁的外观。华丽外观的背后&#xff0c;少不了美工的辛苦设计&#xff0c;但如果开发人员不懂得怎么合理展示这些设…

LeetCode 2341. 数组能形成多少数对

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums 选出 两个 相等的 整数从 nums 中移除这两个整数&#xff0c;形成一个 数对 请你在 nums 上多次执行此操作直到无法继续执行。 返…

三、MyBatis 使用传统 Dao 开发方式

1.0 使用 Dao 的实现类,操作数据库 1.0.1 Dao 开发 &#xff08;0&#xff09;定义接口StudentDao 及创建接口的映射文件StudentDao .xm package com.zep.dao;import com.zep.domain.Student;import java.util.List;public interface StudentDao {List<Student> selec…

Spring MVC控制器用@ResponseBody声明返回json数据报406的问题

本打算今天早点下班&#xff0c;结果下午测试调试程序发现一个问题纠结到晚上才解决&#xff0c;现在写一篇博客来总结下。 是这样的&#xff0c;本人在Spring mvc控制层用到了ResponseBody标注&#xff0c;以便返回的数据为json格式的数据&#xff0c;到前端JS中用。 问题来了…

LeetCode 2347. 最好的扑克手牌

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 ranks 和一个字符数组 suit 。你有 5 张扑克牌&#xff0c;第 i 张牌大小为 ranks[i] &#xff0c;花色为 suits[i] 。 下述是从好到坏你可能持有的 手牌类型 &#xff1a; "Flush"&#xff1a;同花&#xff0c;五…

四、MyBatis 框架 Dao 动态代理

1.1 步骤 &#xff08;1&#xff09; 去掉 之前编写的Dao 接口实现类 &#xff08;2&#xff09; getMapper 获取代理对象 只需调用 SqlSession 的 getMapper()方法&#xff0c;即可获取指定接口的实现类对象。该方法的参数为指定 Dao接口类的 class 值。 不使用工具类&…

C++中的常量折叠

先看例子&#xff1a; #include <iostream> using namespace std; int main() { const int a 10; int * p (int *)(&a); *p 20; cout<<"a "<<a<<", *p "<<*p<<endl; return 0; } 输出&#xff1a;a 10&…

五、深入理解Mybatis中的参数parameterType (传递一个简单参数,传递多个参数:@Param、使用自定义对象、按位置、使用Map)

1.1 parameterType parameterType: 接口中方法参数的类型&#xff0c; 类型的完全限定名或别名。这个属性是可选的&#xff0c;因为 MyBatis可以推断出具体传入语句的参数&#xff0c;默认值为未设置&#xff08;unset&#xff09;。接口中方法的参数从 java 代码传入到mapper…

React: JSX 、虚拟 DOM、组件配置(props、state、PropTypes、createContext、props.children)

文章目录1. 虚拟 DOM2. JSX3. ReactComponent4. props 是参数5. PropTypes6. getDefaultProps() 获取默认 props7. 上下文8. 多个上下文9. state在setState中使用函数&#xff0c;而不是对象10. 无状态组件11. 使用 props.children 与子组件对话learn from 《React全家桶&#…

android客户端在多个界面切换时保持socket的链接的实例

鉴于自己的痛苦&#xff0c;研究一个socket在多个界面切换时保持链接的问题&#xff0c;令我纠结很久&#xff0c;现在我提供客户端的源码给有需要的人参考。 1、ApplicationUtil类&#xff1a; import java.io.DataInputStream; import java.io.DataOutputStream; import java…

六、封装 MyBatis 输出结果resultType、resultMap 以及 数据库表中列名和返回对象属性名不一致的2种解决方案(详解)

1.1 resultType resultType: 执行 sql 得到 ResultSet 转换的类型&#xff0c;使用类型的完全限定名或别名。 注意&#xff1a;如果返回的是集合&#xff0c;那应该设置为集合包含的类型&#xff0c;而不是集合本身。resultType 和 resultMap&#xff0c;不能同时使用。 A、…

API 接口批量测试

ApiPost 创建接口 导入要测试的数据 测试结果 ApiFox 创建接口 导入接口 导入测试数据&#xff0c;可以直接编辑&#xff0c;粘贴进来 测试结果

LeetCode 2342. 数位和相等数对的最大和

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的数组 nums &#xff0c;数组中的元素都是 正 整数。请你选出两个下标 i 和 j&#xff08;i ! j&#xff09;&#xff0c;且 nums[i] 的数位和 与 nums[j] 的数位和相等。 请你找出所有满足条件的下标 i 和 j &#xff…