首页 > 编程语言 >Python - 详情介绍Zmail发送邮件(支持普通&企业邮箱,163、QQ、gmail...)

Python - 详情介绍Zmail发送邮件(支持普通&企业邮箱,163、QQ、gmail...)

时间:2024-08-14 15:24:06浏览次数:11  
标签:QQ ... None server mail 企业邮箱 com zmail 邮件

Python - 详情介绍Zmail发送邮件

为了满足在python项目中收发邮件给其他人,可利用自己的邮箱账号结合Zmail来完成。Zmail 使得在python3中发送和接受邮件变得更简单。你不需要手动添加服务器地址、端口以及适合的协议。Zmail 仅支持python3,不需要任何外部依赖. 不支持python2.

功能特点:

  • 自动寻找服务器地址以及端口
  • 自动使用可靠的链接协议
  • 自动将一个python字典映射成MIME对象(带有附件的)
  • 自动添加头文件以及localhostname来避免服务器拒收你的邮件
  • 轻松自定义你的头文件
  • 支持使用HTML作为邮件内容
  • 仅需python>=3.5,你可以将其嵌入你的项目而无需其他的依赖

使用之前:

  • 确保项目是Python3
  • 开启对应邮箱的POP3和SMTP功能(163、qq、gmail都需要设置应用专用密码,并保存记录下来)
  • 如果其他邮箱不在下列中,请不要担心,目前尚未发现不支持的邮箱
服务商地址发送邮件取回邮件备注
@163.com需要应用专用密码
@qq.com需要应用专用密码
@126.com
@yeah.net
@gmail.com需要应用专用密码
@sina.com
@outlook需要应用专用密码

支持的企业邮箱:

名称使用示例
腾讯企业邮箱zmail.server(‘username’,‘psw’,config=‘qq’)
阿里企业邮箱zmail.server(‘username’,‘psw’,config=‘ali’)
网易企业邮箱zmail.server(‘username’,‘psw’,config=‘163’)
谷歌企业邮箱zmail.server(‘username’,‘psw’,config=‘google’)

一、开启POP3和SMTP功能:

在邮箱设置中设置该功能,举例说明163、QQ和gmail,记得保存开启后的应用密码!

163:

在这里插入图片描述
QQ:

在这里插入图片描述
gmail(全程搭梯子,不然进不去页面):

谷歌邮箱的应用密码,需要在谷歌浏览器中的管理您的谷歌Google账号中去设置二步验证先,然后点击链接去创建应用密码,把密码保存下来。后续发送邮件操作,记得按时看下gmail邮箱中的警告邮件,确定该操作属于本人操作。

1.开启POP和IMAP:

在这里插入图片描述

2.点击谷歌浏览器右上角,选择管理您的Google账号(下列步骤,移动端谷歌浏览器也能操作):

在这里插入图片描述
3.开启二步验证:

在这里插入图片描述
4.点击跳转应用密码页面,创建谷歌应用密码:

在这里插入图片描述

二、检测POP3和SMTP功能:

import zmail

server = zmail.server('[email protected]', 'xxxxxxxxxxxx') # 邮箱账号和应用专用密码

if server.smtp_able():
    print(True)
    # SMTP function.
if server.pop_able():
    print(True)
    # POP function.

在这里插入图片描述

三、发送邮件:

import zmail

mail = {
    'subject': 'Python - Zmail!',  # 邮件标题
    'content_text': 'This message from zmail!',  # 邮件内容
    'attachments': [],  # 本地文件的绝对路径
}

server = zmail.server('[email protected]', 'xxxxxxxxxxxx')

server.send_mail('[email protected]', mail)

在这里插入图片描述

  • 给列表中的收件人发件:
server.send_mail(['[email protected]','[email protected]'], mail)

还可为收件人定义别名(元组,第一参数是别名,第二参数是邮箱地址)

server.send_mail([('同事-老王','[email protected]'),('老板','[email protected]')], mail)
  • 发送HTML作为邮件内容(content_html):
mail = {
    'subject': 'Python - Zmail!',  # 邮件标题
    'content_html': ['HTML CONTENT'],  # 邮件内容
    'attachments': [],  # 本地文件的绝对路径
}

server.send_mail('[email protected]', mail)

或者读取html文件内容

with open('C:/Users/Shinelon/Desktop/font/demo.html','r') as f:
    content_html = f.read()
    
mail = {
    'subject': 'Python - Zmail!',  # 邮件标题
    'content_html': content_html,  # 邮件内容
    'attachments': [],  # 本地文件的绝对路径
}

server.send_mail('[email protected]', mail)
  • 使用抄送功能:
server.send_mail(['[email protected]','[email protected]'], mail,cc=['[email protected]'])

还可为收件人定义别名(元组,第一参数是别名,第二参数是邮箱地址)

server.send_mail(['[email protected]','[email protected]'], mail, cc=[('同事-小美','[email protected]')])
  • 自定义你的server配置:
server = zmail.server('username', 'password', smtp_host='smtp.163.com', smtp_port=994, smtp_ssl=True, pop_host='pop.163.com', pop_port=995, pop_tls=True)

四、取回邮件:

  • 获取最新的邮件:
mail = server.get_latest()

print(mail)

在这里插入图片描述

  • 依据id取回邮件:
mail = server.get_mail(3)

print(mail)

在这里插入图片描述

  • 依据指定范围取回邮件(标题,开始结束时间,开始结束下标,发送人):
mail = server.get_mails(subject='Zmail',start_time='2024-1-1',end_time='2024-8-12',start_index=1,end_index=10,sender='[email protected]')
  • 得到邮箱的信息:
mailbox_info = server.stat()  返回元组: (邮件的数量, 邮箱的大小)

在这里插入图片描述

五、解析邮件:

  • 通过访问python字典的形式来访问邮件信息:
mail = server.get_mail(2)

subject = mail['subject'] # 标题

print(subject)

在这里插入图片描述

  • 打印获取的邮件,使用 zmail.show():
mail = server.get_mail(2)

zmail.show(mail)

在这里插入图片描述

  • 查看邮件的所有内容:
mail = server.get_mail(2)

for k,v in mail.items():
	print(k,v)

在这里插入图片描述

六、相关API介绍:

zmail.server(username,password,smtp_host,smtp_port,smtp_ssl,smtp_tls,pop_host,pop_port,pop_ssl,pop_tls,config,timeout=60, debug=False, log=None,auto_add_from=True, auto_add_to=True)
返回 MailServer 实例, 它实现了所有SMTP和POP的功能

参数名类型描述
usernamestr邮箱地址
passwordstr应用专用密码
smtp_hoststrSMTP主机
smtp_portintSMTP端口
smtp_sslSMTP SSL加密方式
smtp_tlsSMTP TLS加密方式
pop_hoststrPOP主机
pop_portintPOP端口
pop_sslPOP SSL加密方式
pop_tlsPOP TLS加密方式
config使用企业邮箱的便捷方法,如果被指定,企业邮箱的配置将会取代所有自动生成的配置
timeoutint、float指定了最长的等待时长(秒)
debugbool如果为True,server将会打开调试模式,并且显示调试信息
logNone、logging.logger的实例如果为None,将会使用zmail默认的日志记录器,你可以通过logging.getLogger(‘zmail’)来访问默认的日志记录器
auto_add_tobool如果为True,当键’to’(不区分大小写)不在发送的邮件中时,默认的’to’将会自动添加到邮件中
auto_add_frombool如果为True,当键’from’(不区分大小写)不在发送的邮件中时,默认的’from’将会自动添加到邮件中

MailServer.send_mail(recipients, mail, timeout=None,auto_add_from=False, auto_add_to=False)
成功发送时返回True

参数名类型描述
recipientsstr、list收件邮箱
maildict、CaseInsensitiveDict(通常是接收到的邮件)
timeoutint、float如果不为None,它将会取代server的超时时间
auto_add_frombool如果不为None,它将会取代server的auto_add_from
auto_add_tobool如果不为None,它将会取代server的auto_add_to

MailServer.stat()
获取邮箱状态. 返回值是两个整型组成的元组: (邮件数量, 邮件大小).

MailServer.get_mail(which)
返回 Mail,同样将邮件设置为已读

参数名类型描述
whichint代表了邮件在邮箱中的位置。必须位于1至邮件数量(从MailServer.stat()返回)的范围内

MailServer.get_mails(subject=None,start_time=None,end_time=None,sender=None,start_index=None,end_index=None)
返回 一个由Mail组成的列表,同时会将所有取出的邮件置为已读

参数名类型描述
subjectNone、int如果不为None,每个邮件的subject都必须包含subject
start_timeNone、str、datetime对象如果为字符串,它的结构为"年-月-日 时:分:秒"(例如 “2018-1-1 10:10:20”) ,如果不为None,每个邮件的时间必须大于start_time
end_timeNone、str、datetime对象
senderNone、str如果不为None,每个邮件的’from’头部必须包含sender
start_indexNone、int如果为None或者小于1,将会被置为1。如果大于邮件数量(从MailServer.stat()返回),将会被置为邮件数量。
end_indexNone、int选择的邮件范围将会被设置为start_index到end_index之间

MailServer.get_latest()
返回最新的邮件。等同于MailServer.get_mail(message_count)。message_count从MailServer.stat()中可得到,同时会将邮件置为已读。

MailServer.get_headers(start_index=None,end_index=None)
返回一个由邮件头部组成的列表(一个CaseInsensitiveDict组成的列表),取回邮件头的范围将会被限制在start_index至end_index。和它们在MailServer.get_mails()中的表现形式相同

MailServer.delete(which)
which 表明了那封邮件应该被删除

MailServer.smtp_able()
返回True如果SMTP工作正常否则返回False

MailServer.pop_able()
返回True如果POP工作正常否则返回False

zmail.show(mails)
你可以是用这个函数来打印一个或多个邮件

zmail.save_attachment(mail,target_path=None,overwrite=False)
将邮件的附件存储到target_path。如果不指定,target_path将会是当前目录。如果overwrite为True,写入过程将会覆盖可能存在的同名文件

zmail.save(mail,name=None,target_path=None,overwrite=False)
保存邮件

zmail.read(file_path,SEP=b’\r\n’)
读取邮件

七、Mail 结构

Mail (用于发送),可为dict或者CaseInsensitiveDict(一般从get_mail or get_mails获得)

字段名描述
subject邮件的标题
from'from’头部,表明了邮件的来源
to (不在使用)你可以使用一个元组(name,address)来指定接收人的名字,适用于抄送和发送。
content_text邮件的文本内容,可为字符串或者一个由字符串组成的列表
content_html邮件的HTML内容,可为字符串或者一个由字符串组成的列表
attachments包含了所有附件。可为 字符串 或者 一个由字符串组成的列表 或者 一个由元组组成的列表。
headers如果你想要为邮件添加额外的头文件,你可以在这指定。必须为dict。

Mail(从 get_mail 或 get_mails获得)

字段名描述
subject邮件的标题
from'from’头部,表明了邮件的来源
to'to’头部,表明了邮件的目的地
content_text邮件的文本内容,可为字符串或者一个由字符串组成的列表
content_html邮件的HTML内容,可为字符串或者一个由字符串组成的列表
attachments包含了所有附件。(例如[‘1.txt’,b’…'])
raw_headers包含了所有原生头部键值对
headers包含了所有解析过的头部(为大小写不敏感字典)
charsets包含了所有编码类型
date邮件时间
id邮件的id。用于定位在邮箱中位置
raw原始的邮件信息。由bytes组成的列表

八、问题反馈:

  1. 发送或者接受失败:
    • 检查是否开启了SMTP和POP3功能
    • 根据服务器SMTP或者POP3地址的端口填写server(没有填写的将会为默认值)
    • SMTP:server = zmail.server(‘user’,‘psw’,smtp_host = ‘xxx’,smtp_port = ‘yyyyy’,smtp_ssl=True)
    • POP3:server = zmail.server(‘user’,‘psw’,pop_host = ‘xxx’,pop_port = ‘yyyyy’,pop_ssl=True)
  2. 应用专用密码错误或者忘记:
    • 重新关闭POP3和SMTP功能,再开启,或删除已有密码再重新创建
  3. 如果出现连接主机超时返回错误:
    • 特别是gmail邮箱,感觉还是需要搭梯子或者设置代理,不然国内网络无法访问外网

标签:QQ,...,None,server,mail,企业邮箱,com,zmail,邮件
From: https://blog.csdn.net/miaomiaowins/article/details/141054430

相关文章

  • 8.13扣...(我以后必定不是狗)
    publicclasskmp{staticbooleanflag=true;publicstaticvoidmain(String[]args){Stringhaystack="loloqwlololhlklllellllo";Stringneedle="ol";chararr1[]=haystack.toCharArray();ch......
  • node.js文件上传(图片等等...)——利用connect-multiparty中间件
    一.概念步骤讲解1.安装和引入中间件安装:通过npm安装connect-multiparty:npminstallconnect-multiparty--save。引入:在项目中引入connect-multiparty:varmultipart=require('connect-multiparty');2.基本设置配置上传目录:指定上传文件的临时存储位置,例如:app.us......
  • 【算法】求1+2+3+...+n
    1.概述地址:JZ64求1+2+3+…+n描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。数据范围:0<n≤2000<n\le2000<n......
  • MySQL常用命令增删改查select,update,alter...
    MySQL常用命令增删改查select,update,alter…文章目录MySQL常用命令增删改查select,update,alter...MySQL修改用户密码MySQL删除用户命令MySQL修改用户密码查看MySQL的用户及hostselectuser,hostfrommysql.user;备注host分别代表的连接方式user@‘localh......
  • Linux Centos通过mail向QQ邮箱发邮件
    1.配置1.1如果是配置全局文件,则编辑/etc/mail.rc1.2如果是配置当前用户,则编辑~/.mailrc2.配置文件内容#这里填入smtp地址,这里的xxx为qq或者163等,如果用的云服务器,安全组策略要开放465/25端口,入站和出站都要开放该端口setsmtp=smtp.qq.com:587#设置发信人邮箱和昵称(......
  • 免费qq号码估价的工具和软件
    目前有多种qq号码估价的工具和软件。例如,晒号网的QQ估价器可以根据QQ号码等级、QQ号码资深度、QQ号码年限、活跃时间等进行准确的QQ号码估价。此外,还有其他一些相关的估价软件和平台,如QQ号码估价2.0全新玩法,利用快手/抖音直播QQ号码价值估算,半小时最高收益10......
  • 使用API Monitor探测QQ安装包在创建桌面快捷方式时都调用了哪些API及COM接口,去解决C++
    目录1、通过代码制作安装包程序,不再使用专用的打包工具2、问题说明3、为啥路径中包含环境变量%ProgramFiles%会报找不到路径呢?4、使用APIMonitor监测QQ安装包在创建桌面快捷方式时都调用哪些COM组件的接口5、同时勾选IShelllinkDatalist接口类的接口,重新开启监测6、最后......
  • 使用条件语句登录QQ(Pythonn实验实训项目)
    实验目的1、掌握变量的创建方法及变量赋值运算的使用方法;2、掌握的掌握if-elif--else条件语句和循环语句的嵌套使用;3、掌握比较运算符的应用;4、掌握输入语句的使用方法;5、掌握continue和break语句的用法。二、实验内容使用条件语句实现QQ登录:若用户名和密码都输入正确,则......
  • 瞎猫碰到死耗子,安卓nt_qq数据库密钥算法
    这个我实际上弄了很久了,一开始更新的时候,发现数据库操作都是在so里,那时候是在libkernel.so里直接hooksqlcipher的密钥函数拿到的密钥,32位字符串,很容易让人联想到md5,但是没有找到在哪里计算的最近又想着做一下,这时打开数据库的so就变了,这是easyFrida的sofileopen插件hook出来的......
  • PC端文字过多展开收起跟在...后面(可自定义行数)
    话不多说直接上代码,可直接复制根据需求修改TextMore.vue<template> <div>  <divclass="yuanqu-con":style="{'--beforeHeight':beforeHeight}">   <div:style="{'-webkit-line-clamp':row}"clas......