• python 发邮件


    一、邮件的介绍

    1.1 协议的介绍

        发送的协议:SMTP  规定了发送的数据格式,交互报文

        接受的协议:pop3、IMAP。 两者区别IMAP

      我们主要是使用SMTP来发送数据。

      

    1.2  邮件的流程

      与smtp服务器建立连接--》 建立smtp通道--》 登入--》 写邮件格式--》发送

    二、代码实现

      python发邮件主要是是使用 smtplib这个类。

      邮件的格式与内容 主要使用email这个类

    1.1 只发送文本 的邮件

    import smtplib
    from smtplib import SMTP_SSL
    
    from email.header import Header
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    from email.mime.base import MIMEBase
    from email import encoders
    
    from email.utils import formataddr
    
    
    addr_to = ['2323449277@qq.com', '18768196753@139.com']
    
    # 第一步连接到服务器,并发送一个地址查询,然后登入进去
    smtp = SMTP_SSL('smtp.qq.com')
    smtp.ehlo('smtp.qq.com')
    # smtp.set_debuglevel(1) 打开调试,能看到与服务器之间的交互
    smtp.login('459900477@qq.com', 'iajeclsnsrxebjgd')
    
    
    '''
    第一种,只是发本文
    '''
    def send_email():
        # 第二步构造邮件格式: 
        msg = MIMEText('wo zai na li?', 'plain', 'utf-8')        # 生成一个邮件主体内容对象
    
        msg['subject'] = Header('邮件标题1', 'utf-8')            # 邮件主体对象添加标题
        msg['from'] = formataddr(('LH', '459900477@qq.com'))    # 添加发件人
        addr_to = ['2323449277@qq.com', '18768196753@139.com']
        msg['to'] = ','.join(addr_to)                           # 添加收件人,这个是在邮件中显示的。可以有多个,用,分割
    
        # 发送邮件,
        smtp.sendmail('459900477@qq.com', addr_to, msg.as_string()) # 接受双方的人物
    
        # 关闭 与邮件服务器之间的连接
        smtp.quit()
    
    def main():
        send_email
    
    if __name__ == '__main__':
        main()

    1.2 发送带附件的邮件

      登入 与 模块 使用1.1的案列

    def send_email_attch(body, attachment):
        msg = MIMEMultipart()
        msg['subject'] = Header('邮件标题1', 'utf-8')          # 邮件主体对象添加标题
        msg['from'] = formataddr(('LH', '459900477@qq.com'))  # 添加发件人
        msg['to'] = '2323449277@qq.com'                       # 添加收件人
    
        msg.attach(MIMEText(body, 'plain', 'utf-8'))         # 定义邮件的格式
    
        with open(attachment, 'rb') as f:
            # MIMEBase表示附件对象
            mime = MIMEBase('text', 'txt', filename=attachment)
    
            # 第一个参数必须一致,第二个参数随意,第三个参数为附件的名字
            mime.add_header('Content-Disposition', '456', filename='hui.py')  
            mime.set_payload(f.read())  # 读取文件的内容到付件中
            encoders.encode_base64(mime)  # 定义传输的编码协议,避免错落
    
            msg.attach(mime)  # 把附件添加到邮件中中。
    
        try:
            smtp.sendmail('459900477@qq.com', addr_to, msg.as_string())  # 发送邮件
            smtp.quit()
        except smtplib.SMTPException as e:
            print(e)

    1.3 究极版本:文本或html或附件

    def send_email_all(body, mailtype='plain', attachment=None):
        '''
        body:邮件正文。 可以是文本 或 html。由第二个参数来控制
        mailtype:邮件格式
        acctcchment: 附件。如果不存在,不添加,存在则添加
        '''
        # 构造一个MimeMultipart对象,代表邮件本身
        msg = MIMEMultipart()
    
        # 设置邮件的内容:标题,发件人,收件人
        msg['subject'] = Header('邮件标题1', 'utf-8')          # 邮件标题对象添加标题
        msg['from'] = formataddr(('LH', '459900477@qq.com'))  # 添加发件人
        msg['to'] = ','.join(addr_to)                         # 添加收件人
        
        # body代表发送的内容,mailtype为内容的格式:文本(plian)或html
        msg.attach(MIMEText(body, mailtype, 'utf-8'))  # 定义邮件的格式
    
        # 如果有附件,则添加进去
        if attachment:
            # 使用二进制模式打开
            with open(attachment, 'rb') as f:
                # MIMEBase表示附件对象
                mime = MIMEBase('text', 'txt', filename=attachment)
    
                # 第一个参数必须一致,第二个参数随意,第三个参数为附件的名字
                mime.add_header('Content-Disposition', '456', filename='hui.py')  
                mime.set_payload(f.read())  # 读取文件的内容到付件中
                encoders.encode_base64(mime)  # 定义传输的编码协议,避免错落
    
                msg.attach(mime) # 将附件添加到邮件中
    
        try:
            smtp.sendmail('459900477@qq.com', addr_to, msg.as_string())  # 发送邮件
            smtp.quit()
        except smtplib.SMTPException as e:
            print(e)

    二、封装成类,到处得瑟

    import smtplib
    from smtplib import SMTP_SSL
    
    from email.header import Header         # 邮件的主题格式
    from email.mime.text import MIMEText       # 邮件的格式,纯文本格式
    from email.mime.multipart import MIMEMultipart # 邮件的格式,多格式
    from email.mime.base import MIMEBase   # 附件
    from email import encoders         # 附件的编码
    from email.utils import formataddr     # 邮件的发件人格式
    
    '''
    构造成类
    '''
    class NoMailListErrot(Exception):
        '自定义异常,在邮件接收人不存在的时候,主动抛出异常'
        pass
    
    class MailMaster:
        def __init__(self, email_from_addr='459900477@qq.com', password='iajeclsnsrxebjgd', email_server='smtp.qq.com'):
            '''初始化函数,生成smtp对象,连接到服务器,并登入进去
            '''
            # 第一步连接到服务器,并发送一个地址查询,然后登入进去
            self.smtp = SMTP_SSL(email_server)
            # self.smtp.set_debuglevel(1)  # 调试接口
            self.smtp.ehlo(email_server)
            self.email_from_addr = email_from_addr
            self.smtp.login(self.email_from_addr, password)
            self.email_to_addr = []
    
        def notice(self, username, text, subject='通知消息'):
            '发送通知,调用通用发邮件接口'
            self.send_email(subject, f'{username}
    '+text)
    
        def add_emali_to_list(self, addr: str):
            '添加收件人'
            self.email_to_addr.append(addr)
                
        def send_email(self, subject, body, mailtype='plain', attachment=None):
            '''发送邮件接口
            @subject: 邮件主题
            @body: 邮件内容
            @mailtype:邮件类型,默认时文本,发html时为html
            attachment:附件
            '''
            msg = MIMEMultipart()
    
            # 设置邮件的内容:标题,发件人,收件人
            msg['subject'] = Header(subject, 'utf-8')          # 邮件标题对象添加标题
            msg['from'] = formataddr(('LH', self.email_from_addr))  # 添加发件人
    
            try:
                if len(self.email_to_addr) > 0:
                    msg['to'] = ','.join(self.email_to_addr)  # 添加收件人
                else:
                    raise NoMailListErrot('还没添加收件人了,去加下吧')
            
                # body代表发送的内容,mailtype为内容的格式:文本(plian)或html
                msg.attach(MIMEText(body, mailtype, 'utf-8'))  # 定义邮件的格式
    
                # 如果有附件,则添加进去
                if attachment:
                    # 使用二进制模式打开
                    with open(attachment, 'rb') as f:
                        # MIMEBase表示附件对象
                        mime = MIMEBase('text', 'txt', filename=attachment)
    
                        # 第一个参数必须一致,第二个参数随意,第三个参数为附件的名字
                        mime.add_header('Content-Disposition', '456', filename='hui.py')  
                        mime.set_payload(f.read())  # 读取文件的内容到付件中
                        encoders.encode_base64(mime)  # 定义传输的编码协议,避免错落
    
                        msg.attach(mime)  # 将附件添加到邮件中
    
                self.smtp.sendmail(self.email_from_addr, self.email_to_addr, msg.as_string())  # 发送邮件
                self.smtp.quit()
    
            except smtplib.SMTPException as e:
                print(e)

    测试:

    e = MailMaster()
    e.add_emali_to_list('2323449277@qq.com')
    e.add_emali_to_list('18768196753@139.com')
    e.notice('娄辉', '注册成功!!')
  • 相关阅读:
    00037_this关键字
    一些Perl例程(全部手打并执行过)
    告别码农生涯
    转载:直面人生的大实话
    iOS sqlite C语言操作
    linux C++ 莫名奇异的段错误(segmentation fault),无法调用其他函数
    iWatch应用开发-oc篇
    Android中的音频处理------SoundPool,MediaRecorder,MediaPlayer以及RingStone总结
    (二)用控制器controller给模型数据赋初始值
    PhoneGap开发的android项目环境搭建简单流程
  • 原文地址:https://www.cnblogs.com/louhui/p/9132316.html
Copyright © 2020-2023  润新知