首页 > 编程语言 >python使用smtp发送邮件

python使用smtp发送邮件

时间:2024-10-15 09:21:50浏览次数:3  
标签:set python self smtp content def user 邮箱 邮件

python使用smtp发送邮件

一、概述

与发送邮件相关的 Python 模块:
smtplib
是关于 SMTP(简单邮件传输协议)的操作模块,在发送邮件的过程中起到服务器之间互相通信的作用。

email
简单来说,即服务器之间通信的信息,包括信息头、信息主体等等。
举个简单的例子,当你登录邮箱,写好邮件后点击发送,这部分是由 SMTP 接管;而写邮件、添加附件是由 email 模块控制。

二、开通电子邮箱的SMTP功能

在使用脚本发邮件之前,我们需要打开自己邮箱的 SMTP 功能,各家邮箱的设置方法就不一一讲述了,具体使用时可以百度一下,下面以 163 邮箱设置为例做一个简单的演示:
在这里插入图片描述

三、代码操作

class MailServer:
    def __init__(self, address, port):
        self.address = address
        self.port = port

class MailUser:
    def __init__(self, user, password):
        self.user = user
        self.password = password

class SMTPSender:
    """邮件通知"""
    _instance = None

    @classmethod
    def get_instance(cls):
        """单例模式"""
        if SMTPSender._instance is None:
            SMTPSender._instance = SMTPSender()
        return SMTPSender._instance

    def __init__(self):
        self.message = None
        self.client = None
        self.use_ssl = False
        self.server = None
        self.user = None

    def set_ssl(self, is_ssl):
        self.use_ssl = is_ssl

    def set_server(self, address, port):
        self.server = MailServer(address, port)

    def set_user(self, user, password):
        self.user = MailUser(user, password)

    def __del__(self):
        try:
            if self.client:
                self.client.quit()
                self.client = None
        except:
            pass

    def _connect(self):
        """连接服务器"""
        if self.use_ssl:
            self.client = smtplib.SMTP_SSL(self.server.address, self.server.port)
        else:
            self.client = smtplib.SMTP(self.server.address, self.server.port)

        try:
            # outlook 需要starttls 否则无法发送邮件  其他的不需要
            self.client.starttls()
        except:
            pass

    def login(self):
        """登录邮箱"""
        self.client.login(self.user.user, self.user.password)
        log.info("邮箱登录成功")

    def logout(self):
        if self.client:
            self.client.close()
            self.client = None

    def set_smtp_header(self, sender, receivers, subject, cc=[], bcc=[]):
        """设置协议头"""
        self.message['From'] = sender
        self.message['To'] = Header(','.join(receivers))
        self.message['Subject'] = Header(subject)
        self.message['Cc'] = Header(','.join(cc))
        self.message['Bcc'] = Header(','.join(bcc))

    def set_smtp_content(self, content, content_type, encoding):
        """设置正文内容"""
        alternative = MIMEMultipart('alternative')
        text_html = MIMEText(content, _subtype=content_type, _charset=encoding)
        alternative.attach(text_html)
        self.message.attach(alternative)

    def set_smtp_attachment(self, filepath, display_name=None):
        """设置单个附件"""
        attachment = MIMEApplication(open(filepath, 'rb').read())
        attachment.add_header("Content-Type", 'application/octet-stream')
        if display_name is None:
            display_name = os.path.basename(filepath)
        attachment.add_header('Content-Disposition', 'attachment', filename=Header(display_name).encode())
        self.message.attach(attachment)

    def set_smtp_attachments(self, filepaths, display_names=None):
        """设置附件"""
        for i in range(len(filepaths)):
            filepath = filepaths[i]
            display_name = display_names[i] if display_names else None
            self.set_smtp_attachment(filepath, display_name)

    def create_smtp_message(self,
                            receivers,
                            cc=[],
                            bcc=[],
                            subject="",
                            content=None,
                            content_type='utf-8',
                            file_paths=[],
                            display_names=[]):
        """构造邮箱报文"""
        self.message = MIMEMultipart('mixed')
        self.set_smtp_header(self.user.user, receivers, subject, cc, bcc)
        if content:
            self.set_smtp_content(content, 'html', content_type)
        if file_paths:
            self.set_smtp_attachments(file_paths, display_names)

    def send_mail(self, subject, content='', cc=[], bcc=[], receivers=[], filenames=[]):
        """发送 邮件  subject、recipient、content 属于必填项
            content:{
            'subject': '*标题',
            'recipient': ['*收件人邮箱1', '收件人邮箱2'],
            'cc': ['抄送邮箱1', ’抄送邮箱2‘],
            'bcc': ['密送邮箱1', '密送邮箱2'],
            'content': '*正文  支持html',
            'filenames': ['文件路径列表']
            }
        """

        assert self.server, '请设置邮箱服务器信息'
        assert self.user, '请设置user登录信息'
        if not self.client:
            self._connect()
            self.login()
        self.create_smtp_message(receivers=receivers,
                                 cc=cc,
                                 bcc=bcc,
                                 subject=subject,
                                 content=content,
                                 file_paths=filenames)
        self.client.sendmail(self.user.user, receivers + cc + bcc, self.message.as_string())




根据对应信息设置

instance = SMTPSender.get_instance()
instance.set_server(email_info.get("邮箱服务器地址"), int(email_info.get("邮箱服务器端口")))
instance.set_user(email_info.get("邮箱账号"), email_info.get("邮箱密码"))
instance.set_ssl(True)

SMTPSender.get_instance().logout()

标签:set,python,self,smtp,content,def,user,邮箱,邮件
From: https://blog.csdn.net/weixin_45014634/article/details/142917802

相关文章

  • 用python、JavaScript、JAVA等多种语言的实例代码演示教你如何免费获取股票数据(实时数
    ​近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据......
  • C#使用 MailKit 收发邮件
    目录获取QQ邮箱授权码安装MailKit配置邮件服务器信息实现邮件收发方法测试邮件收发参考文章获取QQ邮箱授权码打开QQ邮箱,进入设置->账号页面:在POP3/IMAP/SMTP中开启SMTP服务,然后点击授权码复制授权码:QQ邮箱服务器的参数如下,详细内容参考SMTP/IMAP服务:接收邮件服务器......
  • Python编程、机器学习与深度学习技术——建议收藏!附代码!
    原文链接:Python编程、机器学习与深度学习技术——建议收藏!附代码!https://mp.weixin.qq.com/s?__biz=MzUzNTczMDMxMg==&mid=2247622086&idx=4&sn=a2e310ea4b6e8a40de2fc683215e839b&chksm=fa825c21cdf5d537c8ef826df48d5e4791c48eda7bc53733a14dfaa67613dc76842db5da7104&token=......
  • Python中的pool.map函数:高效处理数据与计算任务
    在Python中,map()函数是一个非常实用的工具,它能对序列(如列表、元组等)进行映射操作,将一个函数作用于序列中的每个元素,并将结果组成一个新的序列返回。在一些大规模的数据处理和计算任务中,我们往往需要对大量数据进行高效的处理。这时,map()函数就显得尤为重要,而它的一个实现——pool.......
  • 针对不同类型的数据,哪些Python可视化库更适合处理时间序列数据?
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......
  • python中函数的定义和调用
    1.什么是函数?    函数是编程中的一种封装机制,用来将一组可重复使用的代码片段组织在一起,以便在不同的地方调用。函数可以接收输入(称为参数),执行特定的操作,并且可以返回输出(称为返回值)。函数的主要目的是提高代码的复用性、可读性和组织性。2.函数定义的语法:   ......
  • python中绘图的图表和曲线样式总结(GPT直出)
    在绘制图表时,常见的图标样式(marker)和曲线样式(linestyle)可以帮助我们通过图形区分不同的数据系列。以下是一些常用的图标和曲线样式,以及如何在代码中使用它们的方式:1.常见的图标样式(marker)在matplotlib中,图标样式通过marker参数指定,常见的图标样式如下:图标样式代码(ma......
  • Python数学建模算法与应用
    习题5.4importnumpyasnpfromscipy.optimizeimportminimizedefobjective_function(x):returnnp.sum(np.sqrt(x))deflinear_constraint(x):weights=np.arange(1,101)return1000-np.dot(x,weights)constraints=[{'type':'ineq',&......
  • python画图|三维动态柱状图绘制
    【1】引言前序已经学习了二维动态柱状图绘制教程,本次尝试探索三维动态柱状图绘制教程:【2】项目设计三维和二维的不同,要在一开始就定义。二维的定义简单粗暴,只需要一行代码:fig,ax=plt.subplots()#定义要画图到了三维则需要两行,一行说要画三维图,一行说这个图使用哪......
  • Python编程基础之变量与数据类型
    一、变量    在Python中,变量是用来存储数据值的标识符。变量的命名需要遵循一定的规则:1. 变量名只能包含字母、数字和下划线。2. 变量名不能以数字开头。3. 变量名不能是Python中的关键字(如if、else、for等)。    Python可以这样定义变量:my_variable=......