IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Python系列 之 email模块 - 发送邮件 -> 正文阅读

[网络协议]Python系列 之 email模块 - 发送邮件

SMTP协议客户端

smtplib 模块定义了一个 SMTP 客户端会话对象:

import smtplib
smtplib.SMTP(host='', port=0, local_hostname=None, [timeout, ]source_address=None)

163邮箱的host 和 port:

host:smtp.163.com
port:25

实例化一个SMTP对象:

self.HOST = "smtp.163.com"
self.PORT = 25
self.smtp = smtplib.SMTP(self.HOST, self.PORT)

下文主要用到SMTP对象的login和send_message方法:

# login方法
# SMTP.login(user, password, *, initial_response_ok=True)
# user 是163的邮箱账号;
# password是163的授权码:需要开启你账号的smtp协议
# 163的邮箱账号
self.MAILID = "123456789**@163.com"
# 163的授权码
self.AUTHCODE = "0123456789101112"
# 登录
self.smtp.login(self.MAILID, self.AUTHCODE)
# send_message方法
# SMTP.send_message(msg, from_addr=None, to_addrs=None, mail_options=(), rcpt_options=())
# msg就是EmailMessage类的实例对象
# from_addr和 to_addrs 指定发送和接收的信息;如果为None就会从EmailMessage对象中查找字段 
self.msg = EmailMessage()
self.smtp.send_message(self.msg)

EmailMessage 邮件信息对象

# email.message.EmailMessage(policy=default)
# policy表示策略对象 默认default策略
self.msg = EmailMessage()
# 设置消息头 和 负载(就是 内容 )
# 主题
self.msg["Subject"] = "Subject"
# 发送邮箱地址
self.msg["From"] = self.MAILID
# 接收邮箱地址 用逗号分隔可以群发
self.msg["To"] = "**@***.com,**@***.com"
# 邮件内容
self.msg.set_content("Hello World!")

# 效果同上 parsestr方法将字符串以\n分隔 返回EmailMessage对象
# 利用Parser(policy=default).parsestr(str)方法 返回消息对象
# self.msg = Parser().parsestr(f'From: {self.MAILID}\n'
#                              'To: **@***.com,**@***.com\n'
#                              'Subject: Subject\n'
#                              '\n'
#                              'Hello World!\n')

关于:email.policy: 策略对象

上面只是发送了简单的文字 下面的方法可以添加附件:

# add_attachment方法
# EmailMessage().add_attachment(*args, content_manager=None, **kw)

# 同目录下data文件夹内的所有文件将被添加到附件
attch_dir = "data"
# logger.debug(os.listdir(data_path))
filenames = os.listdir(attch_dir)
for filename in filenames:
    file_path = os.path.join(attch_dir, filename)
    ctype, encoding = mimetypes.guess_type(file_path)
    if ctype is None:
        ctype = "application/octet-stream"
    maintype, subtype = ctype.split("/")
    with open(file_path, "rb") as r:
        self.msg.add_attachment(
            r.read(), maintype=maintype, subtype=subtype, filename=filename)

完整实例代码:

import logging
import os
import smtplib
import mimetypes
from email.message import EmailMessage
from email.parser import Parser


logging.basicConfig(level=logging.DEBUG,
                    format="%(asctime)s>%(message)s", datefmt="%Y-%m-%d %H:%M:%S")
logger = logging.getLogger(__name__)


class EmailClass(object):
    """docstring for EmailClass"""

    def __init__(self):
        self.HOST = "smtp.163.com"
        self.PORT = 25
        self.MAILID = "123456789**@163.com"
        self.AUTHCODE = "0123456789101112"
        self.smtp = smtplib.SMTP(self.HOST, self.PORT)
        self.msg = EmailMessage()

    def send_Email(self):
        self.set_msg()
        with self.smtp:
            try:
                self.smtp.login(self.MAILID, self.AUTHCODE)
            except smtplib.SMTPAuthenticationError as e:
                logger.error("登录失败:%s", e.args)
            else:
                self.smtp.send_message(self.msg)
                logger.info("发送成功")

    def set_msg(self):
        """设置邮件信息对象"""
        # 直接赋值
        self.msg["Subject"] = "Subject"
        self.msg["From"] = self.MAILID
        self.msg["To"] = "**@***.com,**@***.com"
        self.msg.set_content("Hello World!")

        # 利用Parser(policy=default).parsestr(str)方法 返回消息对象
        # self.msg = Parser().parsestr(f'From: {self.MAILID}\n'
        #                              'To: **@***.com,**@***.com\n'
        #                              'Subject: Subject\n'
        #                              '\n'
        #                              'Hello World!\n')
        self.add_attch()

    def add_attch(self):
        """
        给邮件信息对象添加附件
        同目录下data文件夹内的所有文件将被添加到附件
        """
        attch_dir = "data"
        # logger.debug(os.listdir(data_path))
        filenames = os.listdir(attch_dir)
        for filename in filenames:
            file_path = os.path.join(attch_dir, filename)
            ctype, encoding = mimetypes.guess_type(file_path)
            if ctype is None:
                ctype = "application/octet-stream"
            maintype, subtype = ctype.split("/")
            with open(file_path, "rb") as r:
                self.msg.add_attachment(
                    r.read(), maintype=maintype, subtype=subtype, filename=filename)


if __name__ == "__main__":
    EmailClass().send_Email()

注意:一定要开启发送邮件账号的smtp协议,并用正确的授权码进行测试。
以上就是关于 Python email模块发送邮件的学习;
如果有什么不对的地方,欢迎指正!

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-12-26 22:36:04  更:2021-12-26 22:36:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:42:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码