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

前言

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

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

1. 基本逻辑

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

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

开启之后记录下密码授权,这一串类似邮箱中的密码:(可拥有多个授权码,无需记住也不可泄露)
在这里插入图片描述
有了账号和密码还不够,不同的邮箱有不同的服务器授权(该博文使用的是qq,所以展示qq邮箱的规则)

类型名称地址非SSL端口SSL端口
发送SMTPsmtp.qq.com25465/587
接收POPpop.qq.com110995
接收IMAPimap.qq.com143993

故全局变量的属性如下:

MAIL = {
    "from": 'xxx@qq.com',
    "pwd": 'xxx',
    "smtp": 'smtp.qq.com',
}

除了发件人还需要一个接收人或者接收的群体:receiver_list = ['yyy@qq.com']

注意事项:

  • 发件人的邮箱要开通SMTP的功能
  • pwd为对应的授权码而不是账号密码
  • 需要填写该邮件服务器的smtp,如果涉及端口号也需要填写(此处的qq以及163 可不用端口号即可发送成功)

2. smtplib

2.1 发送邮件(暂定QQ 163 等)

邮件的包中主要通过如下: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": 'xxx@qq.com',
    "pwd": 'xxx',
    "smtp": 'smtp.qq.com',
}
receiver_list = ['yyy@qq.com']

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)

发送成功之后:
在这里插入图片描述
如果说是群发邮件,则邮件应该添加多个人的邮箱
而且处理每个人的时候需要加上分号分割:msg['To'] = ";".join(receiver_list)

2.2 发送邮件(公司邮箱服务器)

对于公司的邮箱服务器比较特殊,处理的方式和上面有些差异

默认的STMP是开启的,所以不需要找什么授权码,毕竟也无法打开:

在这里插入图片描述

对此上述的代码需要稍微小改下:

  • pwd为密码 而不是授权码
  • 对应的端口号可更改,毕竟默认25端口号比较危险!
  • 账号密码登录的时候,账号不需要到com,只需要填写账号即可
  • 公司的smtp服务器查看通过邮箱设置中查看!
# 注意此处不需要写具体到com,只需要填补账号信息即可
# server.login(MAIL['from'], MAIL['pwd'])

server.login("manongyanjiuseng", MAIL['pwd'])

可默认修改端口号:
(注意此处的发件服务器为smtp的服务器地址,前提一定要可以发送!)
在这里插入图片描述

类似的测试代码如下:(和上述代码一致,只不过为了好看而已)

import smtplib
from email.mime.text import MIMEText
from email.header import Header
if __name__ == "__main__":
    # 第三方 SMTP 服务
    mail_host = "mail.域名.com"  # 设置服务器
    mail_user = "manongyanjiuseng"  # 用户名
    mail_pass = "xx"  # 密码

    sender = 'manongyanjiuseng@xx.com'
    receivers = ['aini@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

    content = "测试邮件"
    message = MIMEText(content, 'plain', 'utf-8')
    message['From'] = Header("发送者", 'utf-8')
    message['To'] = Header("接收者", 'utf-8')

    subject = 'Python SMTP 邮件测试'
    message['Subject'] = Header(subject, 'utf-8')

    try:
        smtpObj = smtplib.SMTP()
        smtpObj.connect(mail_host, 25)  # 25 为 SMTP 端口号
        smtpObj.login(mail_user, mail_pass)
        smtpObj.sendmail(sender, receivers, message.as_string())
        print("邮件发送成功")
    except smtplib.SMTPException:
        print("Error: 无法发送邮件")

最终截图如下:

在这里插入图片描述

3. zmail

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

需要pip安装才可导入zmail包:pip install zmail
在这里插入图片描述

3.1 发送邮件

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

import zmail

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

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)

发送成功之后,通过查看邮件也可看到相关的附件:
在这里插入图片描述

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

在这里插入图片描述
有无附件通过定义有无这个值即可,'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": 'xxx@qq.com',
    "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  xxx@qq.com
To  xxx@qq.com
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函数
查看其原函数,其他参数可带如下内容筛选:
在这里插入图片描述
其函数参数如下:

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

示例代码如下:

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

截图如下:
在这里插入图片描述

4. yagmail

同样需要导入这个包:pip install yagmail
在这里插入图片描述
示例代码如下:

import yagmail

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


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)

结果如下:
在这里插入图片描述
补充:关于send函数的部分参数说明:
在这里插入图片描述

描述如下:

参数描述
to发件人
subject标题
contents内容
attachments附件
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用 Python 进行邮件的发送和接收,可以使用 `smtplib` 和 `imaplib` 库。下面是一个简单的发送邮件的示例代码: ```python import smtplib from email.mime.text import MIMEText from email.header import Header # 发件人邮箱和密码 sender = '[email protected]' password = 'your_password' # 收件人邮箱 receiver = '[email protected]' # 邮件主题和内容 subject = 'Python 发送邮件测试' message = '这是一封 Python 发送的邮件' # 创建邮件对象 msg = MIMEText(message, 'plain', 'utf-8') msg['From'] = Header(sender, 'utf-8') msg['To'] = Header(receiver, 'utf-8') msg['Subject'] = Header(subject, 'utf-8') # 发送邮件 try: smtpObj = smtplib.SMTP('smtp.example.com') smtpObj.login(sender, password) smtpObj.sendmail(sender, [receiver], msg.as_string()) print('邮件发送成功') except smtplib.SMTPException: print('邮件发送失败') ``` 要接收邮件,可以使用 `imaplib` 库。下面是一个简单的接收邮件的示例代码: ```python import imaplib import email # 邮箱账号和密码 username = '[email protected]' password = 'your_password' # 邮箱服务器 imap_server = 'imap.example.com' # 连接到邮箱服务器 imapObj = imaplib.IMAP4_SSL(imap_server) imapObj.login(username, password) # 选择收件箱 imapObj.select() # 搜索邮件 typ, data = imapObj.search(None, 'ALL') # 获取最新一封邮件 email_id = data[0].split()[-1] typ, msg_data = imapObj.fetch(email_id, '(RFC822)') # 解析邮件 msg = email.message_from_bytes(msg_data[0][1]) subject = msg['Subject'] from_addr = msg['From'] to_addr = msg['To'] body = msg.get_payload() # 关闭连接 imapObj.close() imapObj.logout() ``` 注意,以上示例代码仅供参考,实际使用时需要根据具体情况进行修改。同时,发送邮件和接收邮件的具体操作也会受到邮箱服务商的限制,需要根据具体邮箱服务商的文档进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值