博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 发邮件
阅读量:5368 次
发布时间:2019-06-15

本文共 6165 字,大约阅读时间需要 20 分钟。

一、邮件的介绍

1.1 协议的介绍

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

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

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

  

1.2  邮件的流程

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

 

二、代码实现

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

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

1.1 只发送文本 的邮件

import smtplibfrom smtplib import SMTP_SSLfrom email.header import Headerfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.mime.base import MIMEBasefrom email import encodersfrom email.utils import formataddraddr_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_emailif __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 smtplibfrom smtplib import SMTP_SSLfrom 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):    '自定义异常,在邮件接收人不存在的时候,主动抛出异常'    passclass 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('娄辉', '注册成功!!')

 

转载于:https://www.cnblogs.com/louhui/p/9132316.html

你可能感兴趣的文章
201521123044 《Java程序设计》第9周学习总结
查看>>
winfrom 图片等比例压缩
查看>>
人工智能实验报告一
查看>>
用LR12录制app,用LR11跑场景,无并发数限制,已试验过,可行!
查看>>
python 多线程就这么简单(转)
查看>>
oracle 简述
查看>>
ajax如何向后台传递数组,在后台该如何接收的问题(项目积累)
查看>>
Solr之java实现增删查操作
查看>>
httpClient连接工具类实测可用
查看>>
CDOJ 1965 连通域统计【DFS】
查看>>
飞机大战3-我的飞机
查看>>
c#接口
查看>>
MyEclipse部署Jboss出现java.lang.OutOfMemoryError: PermGen space
查看>>
ZOJ 1133
查看>>
alibaba / zeus 安装 图解
查看>>
Planned Delivery Time as Work Days (SCN discussion)
查看>>
Ubuntu:让桌面显示回收站
查看>>
Android上传头像代码,相机,相册,裁剪
查看>>
git 安装体验
查看>>
Oracle 给已创建的表增加自增长列
查看>>