首页 > 编程语言 >python 发邮件,简单版本

python 发邮件,简单版本

时间:2023-11-15 16:36:17浏览次数:38  
标签:发邮件 python self smtp filename attachment 版本 address message

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


class Template(object):
    html = """
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{Title}</title>
</head>
<body>
    <div style="color: red; font-size: 16px;">{Content}</div>
    <div>bye bye</div>
</body>
</html>
    """

    def __init__(self, **kwargs):
        self.kwargs = kwargs

    def simple_render(self):
        return self.html.format(**self.kwargs)


class EmailSender(object):

    def __init__(self, from_address, password, smtp_host, smtp_port, ssl=False, template:Template=None):

        self.address = from_address
        self.password = password
        self.smtp_host = smtp_host
        self.smtp_port = smtp_port
        self.ssl = ssl
        self.connected = False
        self.template = template
        self.init_client()

    def create_attachment(self, filename=None, filepath=None, stream=None, charset='utf-8'):
        """
        创建附件
        :param filename:
        :param filepath:
        :param stream:
        :param charset:
        :return:
        """
        assert any((filepath, stream)), "attachment must provide filepath or file"
        assert filename, "filename can not be None"
        if filepath:
            f = open(filepath, 'rb')
            stream = f.read()
            f.close()
        attachment = MIMEText(stream, 'base64', charset)
        attachment["Content-Type"] = "application/octet-stream"
        attachment["Content-Disposition"] = f"attachment; filename={filename}"
        return attachment

    def init_client(self):
        """
        初始化客户端
        :return:
        """
        if self.ssl:
            self.client = smtplib.SMTP_SSL()
        else:
            self.client = smtplib.SMTP()
        try:
            self.client.connect(self.smtp_host, self.smtp_port)
            self.client.login(self.address, self.password)
            self.connected = True
        except smtplib.SMTPAuthenticationError:
            print("username or password wrong.")
        except smtplib.SMTPHeloError:
            print("server didnt reply.")
        except smtplib.SMTPException as e:
            print(e)

    def create_text_or_html(self, text, is_html=True, charset=None):
        """
        创建email信件内容
        :param text:
        :param is_html:
        :param charset:
        :return:
        """
        sub_type = "html" if is_html else "plain"
        message = MIMEText(text, sub_type, charset)
        return message

    def send_with_attachment(self, Subject, attachment, sender, receiver, to_address):
        """
        attachment: {"filename": filename,
                     "stream": file stream,
                     "filepath": file path}
                     must provide at least one of filepath & stream
        """
        message = MIMEMultipart()
        message["From"] = sender
        message["To"] = receiver
        message["Subject"] = Subject
        message.attach(self.create_text_or_html(self.template.simple_render()))
        message.attach(self.create_attachment(**attachment))
        self.client.sendmail(self.address, to_address, message.as_string())


if __name__ == '__main__':
    my_address = "[email protected]"
    password = "PASSWORD"
    to_address = "[email protected]"
    email_smtp = "smtp.126.com"
    context = "一对测试的内容"

    template = Template(Content="测试内容,传递一个附件", Title="测试")
    sender = EmailSender(my_address, password, email_smtp, 25, template=template)
    sender.send_with_attachment('邮件测试',
                                {"filename": "example.xls", "filepath": r"C:\Users\Haiton\Desktop\name_list.xls"},
                                "126.com", "qq.com", to_address)

标签:发邮件,python,self,smtp,filename,attachment,版本,address,message
From: https://www.cnblogs.com/haiton/p/17081890.html

相关文章

  • Python3 协程 await async 相关的用法和笔记
    想要提供可以进行协程切换的awaitable,可以使用下面的方法:1任务taskasyncdeffunc():print("yesWait")task=asyncio.create_task(func())awaittask2协程对象,可以使asyncdef定义的协程函数(是否能触发切换不一定,要看函数内容)函数内可以利用asyncio.sl......
  • 软件测试|使用python绘制等高线密度图
    简介等高线密度图(ContourDensityPlot)是一种可视化数据分布的有效方式,特别适用于显示二维数据的密度分布情况。Python提供了丰富的工具和库,使得创建等高线密度图变得相对容易。在本文中,我们将介绍如何使用Python和Matplotlib库创建等高线密度图,并提供一个示例来演示整个过程。步骤......
  • 软件测试|使用Python提取出语句中的人名
    简介在自然语言处理(NLP)中,提取文本中的人名是一项常见的任务。Python作为一种流行的编程语言,拥有强大的NLP库和工具,使我们能够轻松地进行这项任务。在本文中,我们将使用Python示例来演示如何提取文本中的人名。环境准备我们将使用以下Python库来执行人名提取任务:spaCy:一个流行的NLP库......
  • 使用gnvm管理node版本 (win)
    问题描述由于项目原因之前安装了nodev10.15.1这个版本,现在另一个项目需要更高版本的node,于是想使用gnvm控制不同node版本。问题分析直接下载gnvm.exe放在之前nodejs文件夹中,和node.exe同一层级即可。然后使用管理员运行命令行。gnvm下载地址:https://sourceforge.net/projects......
  • 在python开发过程中常见的异常错误
    下面这些也是常见的异常错误,在报错的时候不要害怕,记住这些常见的单词。AttributeError尝试访问未知的对象属性EOFError用户输入文件末尾标志EOF(Ctrl+d)FloatingPointError浮点计算错误GeneratorExitgenerator.close()方法被调用的时候ImportError导入模块失败的时候KeyboardInte......
  • 为什么要学习python技术??
    大家好,随着大数据时代的到来,相信大家对新时代的认知达到了一个新的高度,我们可以仔细观察我们的生活,似乎每一年都会发生较大的变化。我记得我刚上大学的时候,移动支付才刚开始普及,短短几年,出门只需要一部手机便能行走天下,其中计算机编程起到了重要作用。 我们为什么要学习编......
  • 推荐一个Node.js多版本管理的可视化工具
    关于Node.js的开发者来说,在开发机器上管理多个不同版本的Node.js是一个常见痛点。之前在开发者安全大全专栏中,提到过解决方法:使用nvm,如果对于nvm还不了解的话,可以前往了解。对于TJ来说,因为习惯敲命令了,所以nvm其实已经够用了。但是,有的小伙伴还是更喜欢可视化的管理工具。所以,今......
  • Python3
    importnumpyasnpx=np.array([1.0,2.0,3.0,4.0])y=x+2Ans:array([3.,4.,5.,6.])y=x>2.0Ans:array([False,False,True,True]) A.SyntaxError-alsoknownasparsingerror.Pythondoesnotlikeyourstructure.ItislikeDrFasks......
  • mojo编程语言:编译后的mojo二进制执行文件调用python库报错——设置MOJO_PYTHON_LIBRAR
    代码:frompythonimportPythonfnf()raises:#ThisisequivalenttoPython's`importnumpyasnp`letnp=Python.import_module("numpy")leta=np.array([1,2,3])print(a)fnmain()raises:f() mojo编译后执行,报错:Mojo/Pyth......
  • mojo编程语言:mojo调用python库及内置函数builtins
    编程语言mojo调用python十分方便,mojo不仅可以调用python的库函数更可以调用python的内置函数(builtins),给出示例代码:frompythonimportPythonfnmain()raises:Python.add_to_path(".")letmypython=Python.import_module("xyz")letx=mypython.hello()......