码迷,mamicode.com
首页 > 编程语言 > 详细

python 发邮件

时间:2018-06-04 14:36:52      阅读:880      评论:0      收藏:0      [点我收藏+]

标签:接受   UI   sel   使用   read   server   smtplib   map   数据   

一、邮件的介绍

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}\n+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(‘娄辉‘, ‘注册成功!!‘)

 

python 发邮件

标签:接受   UI   sel   使用   read   server   smtplib   map   数据   

原文地址:https://www.cnblogs.com/louhui/p/9132316.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!