python 实现邮件发送详细解析 附代码(全)

目录

  • 前言
  • 1. 基本逻辑
  • 2. smtplib
    • 2.1 发送邮件
  • 3. zmail
    • 3.1 发送邮件
    • 3.2 获取邮件内容
  • 4. yagmail

前言

统计某个统计量超过一定的阈值或者设置一个定时任务等,触发发送邮件相关信息来告警,甚至可以用这个功能来做一个发送邮件简单功能,而不是人为发送

以下文章都是针对发送邮件这个功能进行详细阐述

1. 基本逻辑

类似登录服务器需要账号密码端口号
映射一个功能需要映射一个端口号入口或者接口
所以发送邮件 同样需要账号密码的授权以及端口号甚至是这个邮件SMTP或者POP3服务器的授权

具体授权方式通过登录邮件,进入邮件设置中,找到开启的服务(类似服务器开启端口号映射)
以下是qq浏览器,其他浏览器同理,开启POP3的SMTP服务器授权:
在这里插入图片描述

开启之后记录下密码授权,这一串类似邮箱中的密码:(可拥有多个授权码,无需记住也不可泄露)
python 实现邮件发送详细解析 附代码(全)_第1张图片
有了账号和密码还不够,不同的邮箱有不同的服务器授权(该博文使用的是qq,所以展示qq邮箱的规则)

类型 名称 地址 非SSL端口 SSL端口
发送 SMTP smtp.qq.com 25 465/587
接收 POP pop.qq.com 110 995
接收 IMAP imap.qq.com 143 993

故全局变量的属性如下:

MAIL = {
    "from": '[email protected]',
    "pwd": 'xxx',
    "smtp": 'smtp.qq.com',
}

除了发件人还需要一个接收人或者接收的群体:receiver_list = ['[email protected]']

2. smtplib

2.1 发送邮件

邮件的包中主要通过如下:pip install py-emails

单发邮件:

# -*- coding: utf-8 -*-
# !/user/bin/env python
# -*- coding:utf-8 -*-

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

MAIL = {
    "from": '[email protected]',
    "pwd": 'xxx',
    "smtp": 'smtp.qq.com',
}
receiver_list = ['[email protected]']

if __name__ == "__main__":
    msg = MIMEMultipart('alternative')
    msg['Subject'] = Header('码农研究僧', 'utf-8')  # 标题
    msg['From'] = MAIL['from']  # 发件人
    msg['To'] = receiver_list[0]  # 收件人

    # 内容
    content = "你好,感谢你的观看"
    # 此正文消息,参数为内容、编码格式(plain纯文本)、编码方式
    html_message = MIMEText(content, 'plain ', 'utf-8')  # 正文
    html_message["Accept-Language"] = "zh-CN"
    html_message["Accept-Charset"] = "ISO-8859-1,utf-8"

    msg.attach(html_message)
    try:
        # 非SSL,如果为SSL则看下面
        server = smtplib.SMTP(MAIL['smtp'])

        # 如果是ssl,需要加多一个端口号映射
        # server = smtplib.SMTP_SSL()
        # server.connect(MAIL['smtp'],MAIL['port'])

        # 登陆邮箱发送邮件
        server.login(MAIL['from'], MAIL['pwd'])
        server.sendmail(MAIL['from'], receiver_list, msg.as_string())
	    print('发送成功')

    except Exception as e:
        print('error', e)

发送成功之后:
python 实现邮件发送详细解析 附代码(全)_第2张图片
如果说是群发邮件,则邮件应该添加多个人的邮箱
而且处理每个人的时候需要加上分号分割:msg['To'] = ";".join(receiver_list)

3. zmail

zmail的版本是python3以上,该包不需要引入邮件服务器端口号(会自动寻找)

需要pip安装才可导入zmail包:pip install zmail
python 实现邮件发送详细解析 附代码(全)_第3张图片

3.1 发送邮件

具体发送邮件的相关代码如下:
单发和群发的区别在于接收的人数多与少,通过";".join(receiver_list)即可实现

import zmail

MAIL = {
    "from": '[email protected]',
    "pwd": 'xxx'
}
receiver_list = ['[email protected]']

MAIL_CONTENT = {
    'subject':"码农研究僧",
    'content_text':'这是 邮件相关代码',
    'attachments':r'B:\python\mail.py'
}
if __name__ == "__main__":
    try:
        # 登录邮箱
        server = zmail.server(MAIL['from'],MAIL['pwd'])
        # 发送邮件
        server.send_mail(receiver_list[0], MAIL_CONTENT)
        
        print('发送成功')

    except Exception as e:
        print('error', e)

发送成功之后,通过查看邮件也可看到相关的附件:
python 实现邮件发送详细解析 附代码(全)_第4张图片

对比具体附件的相关信息(验证正确):

python 实现邮件发送详细解析 附代码(全)_第5张图片
有无附件通过定义有无这个值即可,'attachments':

如果邮件内容中有附件,也可对应获取邮件附件内容:

mail = server.get_latest()
# 附件别名省略,则自带默认的邮件名获取
zmail.get_attachment(mail,'附件别名') 

如果有端口号或者服务器的限制,请加上

server = zmail.server(MAIL['from'],MAIL['pwd'],smtp_host=MAIL['smtp'],smtp_port=MAIL['port'])

3.2 获取邮件内容

通过这个包也可进行接收邮件:

import zmail

MAIL = {
    "from": '[email protected]',
    "pwd": 'xxx'
}

if __name__ == "__main__":
    try:
        server = zmail.server(MAIL['from'],MAIL['pwd'])
        mail = server.get_latest()
        zmail.show(mail)
        print('获取成功')

    except Exception as e:
        print('error', e)

成功执行之后会获得最新邮件的信息:server.get_latest(),这是详细信息
具体信息如下:

-------------------------
Subject  码农研究僧
Id  56
From  [email protected]
To  [email protected]
Date  None
Content_text  ['你好,感谢你的观看']
Content_html  []
Attachments  
发送成功

也可通过这些信息可筛选出邮件内容:
比如通过获取邮件的subject,或者通过邮件的id或者这封邮件的具体信息:

mail = server.get_mail(56)
print (mail)

具体内容如下:

{'content_text': ['你好,感谢你的观看'], 'content_html': [], 'attachments': [], 'headers': {'Received': 'from [ip地址] ([[ip地址])by 。。。
发送成功

如果获取邮件的简述信息(邮件id数、邮件大小),通过server.stat()

mail = server.stat()
print (mail)

如果获取特定邮件的内容,甚至是按照时间点获取,可以通过get_mails函数
查看其原函数,其他参数可带如下内容筛选:
python 实现邮件发送详细解析 附代码(全)_第6张图片
其函数参数如下:

参数 描述
subject 邮件主题
start_time 开始时间
end_time 结束时间
sender 发送者
start_index 开始id
end_index 结束id

示例代码如下:

mails = server.get_mails(subject='码农研究僧')
for mail in mails:
    zmail.show(mails)

截图如下:
python 实现邮件发送详细解析 附代码(全)_第7张图片

4. yagmail

同样需要导入这个包:pip install yagmail
python 实现邮件发送详细解析 附代码(全)_第8张图片
示例代码如下:

import yagmail

MAIL = {
    "from": '[email protected]',
    "pwd": 'xxx',
    "smtp": 'smtp.qq.com',
}
receiver_list = ['[email protected]']


MAIL_CONTENT = {
    'subject':"码农研究僧",
    'content_text':'这是 邮件相关代码',
    'attachments':r'B:\python\mail.py'
}
if __name__ == "__main__":
    try:
        # 登录邮箱
        server = yagmail.SMTP(MAIL['from'],MAIL['pwd'],MAIL['smtp'])
        
        # 发送邮件
        server.send(receiver_list[0],MAIL_CONTENT['subject'],MAIL_CONTENT['content_text'],MAIL_CONTENT['attachments'])
        server.close()

        print('发送成功')

    except Exception as e:
        print('error', e)

结果如下:
python 实现邮件发送详细解析 附代码(全)_第9张图片
补充:关于send函数的部分参数说明:
python 实现邮件发送详细解析 附代码(全)_第10张图片

描述如下:

参数 描述
to 发件人
subject 标题
contents 内容
attachments 附件

你可能感兴趣的:(python,项目功能,python,开发语言,服务器)