Python如何实现邮件的发送

python笔记- 发送邮件

依赖:

Python代码实现发送邮件,使用的模块是smtplib、MIMEText,实现代码之前需要导入包:

import smtplib
from email.mime.text import MIMEText

使用163邮件发送邮件,具体代码实现如下:

import smtplib
from email.mime.text import MIMEText
'''
发送邮件函数,默认使用163smtp
:param mail_host: 邮箱服务器,16邮箱host: smtp.163.com
:param port: 端口号,163邮箱的默认端口是 25
:param username: 邮箱账号 xx@163.com
:param passwd: 邮箱密码(不是邮箱的登录密码,是邮箱的授权码)
:param recv: 邮箱接收人地址,多个账号以逗号隔开
:param title: 邮件标题
:param content: 邮件内容
:return:
'''
def send_mail(username, passwd, recv, title, content, mail_host='smtp.163.com', port=25):
    msg = MIMEText(content)    # 邮件内容
    msg['Subject'] = title     # 邮件主题
    msg['From'] = username     # 发送者账号
    msg['To'] = recv           # 接收者账号列表
    smtp = smtplib.SMTP(mail_host, port=port)      # 连接邮箱,传入邮箱地址,和端口号,smtp的端口号是25
    smtp.login(username, passwd)                   # 登录发送者的邮箱账号,密码
    # 参数分别是 发送者,接收者,第三个是把上面的发送邮件的 内容变成字符串
    smtp.sendmail(username, recv, msg.as_string())
    smtp.quit()  # 发送完毕后退出smtp
    print('email send success.')
if __name__ == '__main__':
    email_user = 'xxxx@163.com'  # 发送者账号
    email_pwd = 'xxxxx'  # 发送者密码,授权码
    maillist = 'xxxx@qq.com'
    title = '测试邮件标题'
    content = '这里是邮件内容'
    send_mail(email_user, email_pwd, maillist, title, content)

163邮箱的授权码获取方法如下:

1. 登录163邮箱,点击设置-POP3/SMTP/IMAP,如下:

2. 开启SMTP服务且可以查询SMTP的host地址:

3. 点击客户端授权密码,可以重置授权码:

使用QQ邮件发送邮件,具体代码实现如下:

import smtplib
from email.mime.text import MIMEText
'''
发送邮件函数,默认使用163smtp
:param mail_host: 邮箱服务器,qq邮箱host:  smtp.qq.com
:param port: 端口号,qq邮箱的默认端口是: 456
:param username: 邮箱账号 xx@163.com
:param passwd: 邮箱密码(不是邮箱的登录密码,是邮箱的授权码)
:param recv: 邮箱接收人地址,多个账号以逗号隔开
:param title: 邮件标题
:param content: 邮件内容
:return:
'''
#qq邮箱发送邮件
def send_mail(username, passwd, recv, title, content, mail_host='smtp.qq.com', port=456):
    msg = MIMEText(content)    # 邮件内容
    msg['Subject'] = title     # 邮件主题
    msg['From'] = username     # 发送者账号
    msg['To'] = recv           # 接收者账号列表
    smtp = smtplib.SMTP_SSL(mail_host, port=port)      # 连接邮箱,传入邮箱地址,和端口号,smtp的端口号是25
    smtp.login(username, passwd)                   # 登录发送者的邮箱账号,密码
    # 参数分别是 发送者,接收者,第三个是把上面的发送邮件的 内容变成字符串
    smtp.sendmail(username, recv, msg.as_string())
    smtp.quit()  # 发送完毕后退出smtp
    print('email send success.')
if __name__ == '__main__':
    email_user = 'xxx@qq.com'  # 发送者账号
    email_pwd = 'WOSHINIGE123'  # 发送者密码,授权码
    maillist = 'xxxx@qq.com'
    title = '测试邮件标题'
    content = '这里是邮件内容'
    send_mail(email_user, email_pwd, maillist, title, content)

多个收件人且带附件:

# import smtplib
# from email.mime.text import MIMEText
# '''
# 发送邮件函数,默认使用163smtp
# :param mail_host: 邮箱服务器,qq邮箱host:  smtp.163.com
# :param port: 端口号,qq邮箱的默认端口是: 25
# :param username: 邮箱账号 xx@163.com
# :param passwd: 邮箱密码(不是邮箱的登录密码,是邮箱的授权码)
# :param recv: 邮箱接收人地址,多个账号以逗号隔开
# :param title: 邮件标题
# :param content: 邮件内容
# :return:
# '''
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
#邮箱服务器地址
email_host = 'smtp.163.com'
#发送者
email_user = 'xxxx@163.com'
#授权码
email_pwd = 'WOSHINIGE123'
#多个收件人,使用分号分隔
maillist ='xxxx@qq.com;aaaa@qq.com'
#对多个收件人进行分割,以;为标准,返回结果是list['xxxx@qq.com','aaaa@qq.com']
email_info = maillist.split(';')
#构造一个发附件的邮件内容对象
new_msg = MIMEMultipart()
#邮件正文内容
new_msg.attach(MIMEText('test email.....'))
#邮件主题
new_msg['Subject'] = 'test email'
#邮件发送者
new_msg['From'] = email_user
#邮件接收者,多个收件人的账号使用,连接,传入类型是str
new_msg['To'] = ','.join(email_info)
#打开a.txt读取文本内容
att = MIMEText(open('a.txt').read())
att["Content-Type"] = 'application/octet-stream'
# 发送附件就得这么写,固定格式,filename指定附件的名字
att["Content-Disposition"] = 'attachment; filename="haha.txt"'
new_msg.attach(att)
# 连接邮箱,传入邮箱地址,和端口号,smtp的端口号是25
smtp = smtplib.SMTP(email_host, port=25)
# 发送者的邮箱账号,密码,先登录
smtp.login(email_user, email_pwd)
smtp.sendmail(email_user, email_info, new_msg.as_string())
smtp.quit()
print('email send success.')

多个收件人时账号之间使用分号;分割,进行smtp.sendmail(传入的多个收件人类型是list);new_msg['TO'] = recv,接收的类型是str。

使用类实现邮件的发送,即可发送多人也可发送附件:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
class SendMail(object):
    def __init__(self, username, passwd, recv, title, content, file=None, email_host='smtp.163.com', port=25):
        self.username = username
        self.passwd = passwd
        self.recv = recv
        self.title = title
        self.content = content
        self.file = file
        self.email_host = email_host
        self.port = port
    def send_mail(self):
        msg = MIMEMultipart()
        #发送内容的对象
        if self.file:#处理附件的
            att = MIMEText(open(self.file, encoding='utf-8').read())
            att["Content-Type"] = 'application/octet-stream'
            att["Content-Disposition"] = 'attachment; filename="%s"'%self.file
            msg.attach(att)
        msg.attach(MIMEText(self.content))#邮件正文的内容
        msg['Subject'] = self.title  # 邮件主题
        msg['From'] = self.username  # 发送者账号
        #将多个账号'aaa.@qq.com;bbbb@163.com' 以分号分割,分割为list
        self.recv = self.recv.split(';')
        if isinstance(self.recv, list):
            msg['To'] = ','.join(self.recv)
        else:
            msg['To'] = self.recv  # 接收者账号列表
        if self.username.endswith('qq.com'):  #如果发送者是qq邮箱
            self.smtp = smtplib.SMTP_SSL(self.email_host, port=self.port)
        else:
            self.smtp = smtplib.SMTP(self.email_host, port=self.port)
        #发送邮件服务器的对象
        self.smtp.login(self.username, self.passwd)
        try:
            self.smtp.sendmail(self.username, self.recv, msg.as_string())
        except Exception as e:
            print('出错了。。', e)
        else:
            print('发送成功!')
        self.smtp.quit()
if __name__ == '__main__':
    m = SendMail(
        username='zzzzz@163.com', passwd='xxxxxxx',file='a.txt', recv='xxxxxx@qq.com;xxxxxx@qq.com',
        title='多个收件人', content='哈哈哈啊哈哈哈哈', email_host='smtp.163.com', port=25
    )
    m.send_ma

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计选题推荐,ssm诗词打卡微信小程序 44669(赠送源码数据库 )上万套实战教程手把手教学JAVA、PHP,node.js,C++、python、数据可视化等

诗词打卡微信小程序 摘要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,诗词打卡微信小程序被用户普遍使用&…

Cron介绍,以及常见的cron表达式

目录 一.cron介绍 1.什么是Cron? 2.Cron语法 时间字段的取值范围如下: 时间字段支持以下特殊字符: 下面是一些示例: 3.虚拟机安装cron(centos7展示) 二.常见的cron表达式 一.cron介绍 1.什么是Cron? Cron是一个…

视频物体对象追踪AI技术模型——Tracking Any Object Amodally

项目地址:https://tao-amodal.github.io 论文:https://arxiv.org/abs/2312.12433 GitHub:GitHub - WesleyHsieh0806/TAO-Amodal: Official Code for Tracking Any Object Amodally AIGC专区:aigc 更多消息:AI人工智能行…

Linux之vim编辑器

目录 vim编辑器 vim编辑器指令 命令模式指令 光标相关 移动光标相关 文本操作 底行模式指令 插入模式 vim配置 vimforcpp 面试官:小伙子,你是用什么环境编写代码的? 小明:vs2019 面试官:小伙子&#xff0c…

亚马逊云科技 re:Invent 2023 产品体验:亚马逊云科技产品应用实践 王炸产品 Amazon Q,你的 AI 助手

意料之中 2023年9月25日,亚马逊宣布与 Anthropic 正式展开战略合作,结合双方在更安全的生成式 AI 领域的先进技术和专业知识,加速 Anthropic 未来基础模型的开发,并将其广泛提供给亚马逊云科技的客户使用。 亚马逊云科技开发者社…

工业信息采集平台的五大核心优势

关键字:工业信息采集平台,蓝鹏数据采集系统,蓝鹏测控系统, 生产管控系统, 生产数据处理平台,MES系统数据采集, 蓝鹏数据采集平台通过实现和构成其他工业数据信息平台的一级设备进行通讯,从而完成平台之间的无缝对接。这里我们采用的最多的方式是和PLC进行…

vue3 vue-cropper实现图片裁剪+上传功能(组件封装使用)

效果(CV即用) 1.安装引入vue-cropper(官网)官网地址 npm install vue-croppernextimport vue-cropper/dist/index.cssimport { VueCropper } from "vue-cropper";2. 全局引入 import VueCropper from vue-cropper; i…

链接世界与中国时尚文化,积萨伯爵国际时尚品牌在中国大放异彩

时尚的历史是一部文化发展的历史。从中国古代到现代西方,每个时代的时尚都有其独特的文化背景和历史意义。自丝绸之路开启了古代中国与罗马帝国之间的贸易,时尚的不断创新和变革,是文化变迁和时代精神的反映。时尚的变化,也引领着…

关于Axios发送Get请求无法添加Content-Type

在拦截器中尝试给headers添加Content-Type: request.interceptors.request.use(config > {if (!config.headers[Content-Type]) {config.headers[Content-Type] application/json;}return config;},error > {return Promise.reject(error)} )如果是GET请求&…

nuc980开发板使用Agile Modbus软件包-基于 rs485 通讯

一、nuc980开发板电路 打开 nuc980-eth2p 开发板原理图,如下: 将JP1跳线帽连接到rs485。使用rs485转usb连接到电脑即可。 除了收发引脚,多了一个控制引脚。 linux内核使能串口4 二、Agile Modbus软件包 1、软件包的获取 下载网址 选择…

SQLite 安装与使用

SQLite 安装与使用 文章目录 SQLite 安装与使用1.什么是 SQLite?2.为什么要用 SQLite?3 安装3.1 在 Windows 上安装 SQLite3.2 安装路径3.3 接下来需要配置环境变量3.4 配置完变量测试成功3.5 创建数据库成功3.6 图形化界面操作3.7 数据表的增删改查新增…

代码随想录算法训练营Day10 | 239.滑动窗口的最大值、347.前K个高频元素

LeetCode 239 滑动窗口的最大值 本题思路: 采用单调队列来完成,单调队列就是队列里的元素顺序,是单调递减/递增的情况。 那么我们应该如何维护这个单调队列呢,此处既然是最大值,那么采用的是单调递减的队列。让队列的出口处是当前…

基于JSP+Servlet+Mysql的宠物管理系统(简单增删改查)

基于JSPServletMysql的宠物管理系统_简单增删改查 一、系统介绍二、功能展示1.主页2.增加3.修改4.查询5.删除 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称:基于JSPServletMysql的宠物管理系统(简单增删改查) 项目架构:B/S架构 开发语言…

链表的详细介绍

目录 链表的简单定义: 链表的分类 单项带头非循环 单向不带头循环链表 实现单向非循环无头链表 定义链表: 实现链表方法 打印链表 头插法: 尾插法: 指定插入: 通过对应值删除节点: 删除所有对应…

业财一体化是什么意思?有哪些好用的业财一体化软件?

你所在的企业是否为这些问题所困扰? 数据割裂:系统之间的数据不互通,财务数据与业务数据分离,数据统计口径不一致,缺乏关联性,管理统筹难度大。数据滞后:企业管理层获取数据信息的时效性低&…

绝缘电阻测试仪档位的选择技巧有哪些?这么一看就明白了!

电子绝缘电阻测试仪是电力检测领域的一款重要设备,他对于那些电力检测人员来说,是工作的设备之一,虽然它的使用频率相对较高,但是在使用绝缘电阻测试仪时,该如何选择合适的档位是一个关键问题。下面我们就来说说电子绝…

中国社科大与新加坡新跃社科联合培养博士—金融学和经济学差别

经济学和金融学是两个紧密联系的学科,但两者在研究问题上的侧重点有所不同。我在通过中国社科大与新加坡新跃社科联合培养博士项目课堂上,彻底分清了金融学和经济学差别。 经济学通常被归为社会科学,主要着眼于研究宏观上的生产、消费、以及…

谷歌大裁员,3 万员工面临被 AI 取代;网易、暴雪疑似「复合」!丨 RTE 开发者日报 Vol.113

开发者朋友们大家好: 这里是**「RTE 开发者日报」**,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE (Real Time Engagement) 领域内「有话题的 新闻 」 、「有态度的 观点 」、「有意思的 数据 」、「…

Redis缓存穿透、缓存击穿、缓存雪崩介绍

一、Redis的缓存穿透 1.什么是缓存穿透? 缓存穿透是指:客户端请求的数据在缓存中和数据库中都不存在,这时缓存就永远不会生效,这些请求都打到数据库从而导致数据库压力过大。 2.出现缓存穿透的解决方案,以下是常用的两…