Python之邮件发送

在CSDN上自学了一下python下QQ邮件的发送,想在这里记录一下。

(ps:是个小白,欢迎批评指正)

# -*- coding: utf-8 -*-
"""
Created on Fri Apr 15 23:04:57 2022
构建发邮件类
@author: lhy
"""

#================构建发邮件类==================

import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart


class send_email_by_qq:

    def __init__(self,from_addr,password,to_addr,fro="None",to="None",subject="None"):
        self.fro = fro  #发送者名字
        self.to = to    #接受者名字
        self.subject = subject      #邮件主题
        self.from_addr = from_addr  #发件方邮箱
        self.password = password    #授权码(可从QQ邮箱顶部设置中的账户中POP3/SMTP服务(开启)进行获取)
        self.to_addr = to_addr      #收件方邮箱
                                    #传入一个列表,支持多个邮件地址同时发送

        
        
    def con_head(self,content):  
        #构造邮件头信息
        #传入MIMEImage、MIMEText、MIMEMultipart对象
        content['From'] = Header(self.fro,'utf-8')         #发件者名字
        content['To'] = Header(self.to,'utf-8')            #收件者名字
        content['Subject'] = Header(self.subject,'utf-8')  #邮件主题
        
    def send(self,content):
        #连接、登录邮箱,发送邮件
        #传入MIMEImage、MIMEText、MIMEMultipart对象
        smtp_server = 'smtp.qq.com'                        #发送邮件服务器:smtp.qq.com
        server = smtplib.SMTP_SSL(smtp_server)             #使用SSL,端口号465或587
        server.connect(smtp_server,465)                    #连接
        server.login(self.from_addr, self.password)        #登录
        server.sendmail(self.from_addr, self.to_addr, content.as_string())  #发送   
        server.quit() #退出
    
    
    def text(self,content=None,form = "plain",txt_addr=None,file_name="None"):
        #发送普通文本或超文本或txt文档:
            #发送普通文本或超文本,传入文本内容和格式(form可为plain,html)
            #发送txt文档,传入文档地址和想要发送的文档名
        
        if txt_addr==None:
            #发送普通文本或超文本
            txt = MIMEText(content,form,"utf-8")  #在这里html以文本显示(不是附件)
        else:
            #发送txt文档附件
            file = open(txt_addr, 'rb')
            txt_content = file.read()
            file.close()
            txt = MIMEText(txt_content, 'base64', 'utf-8')     #构建邮件内容
            txt["Content-Type"] = 'application/octet-stream'
            txt.add_header('Content-Disposition', 'attachment', filename=file_name+'.txt')  #命名发送的附件
        
        try:
            self.con_head(txt)       #构造邮件头信息
            self.send(txt)           #发送
            print('send text successful!')
        except Exception as e:
            print(e)
        
        
    def image(self,image_addr,image_name="None"):
        file = open(image_addr, 'rb')
        image_content=file.read()
        file.close()
        image = MIMEImage(image_content)         #构建邮件内容
        image.add_header('Content-ID', '<image1>')
        image.add_header("Content-Disposition",'attachment', filename=image_name+".jpg")  #命名发送的附件
        try:
            self.con_head(image)     #构造邮件头信息
            self.send(image)         #发送
            print('send iamge successful!')
        except Exception as e:
            print(e)
   
    
    def multiple(self,content_txt=None,content_html=None,image_addr=None,image_name="None",txt_addr=None,file_name="None"):
       
        # 设置总的邮件体对象,对象类型为mixed
        msg_root = MIMEMultipart('mixed')
        
        #添加文本内容(1个参数 content_txt)
        if content_txt!=None:    
            # 构造文本内容
            text = MIMEText(content_txt, "plain", 'utf-8')
            msg_root.attach(text)  #添加至邮件对象中
            
        #添加html内容(1个参数 content_html)
        if content_html!=None:    
            html = MIMEText(content_html, "html", 'utf-8')
            # 如果不加下边这行代码的,会把超文本的内容当做文本显示(若有文本内容,文本内容无法显示)
            html["Content-Disposition"] = 'attachment; filename="csdn.html"'    #把超文本的内容加入附件
            # 把 构造的内容(文本/html) 写到邮件体中
            msg_root.attach(html)
            
        #添加图片(2个参数 image_addr,image_name)
        if image_addr!=None:
             file = open(image_addr, 'rb')
             image_content=file.read()
             file.close()
             image = MIMEImage(image_content)
             image.add_header('Content-ID', '<image1>')
             image.add_header("Content-Disposition",'attachment', filename=image_name+".jpg") 
             msg_root.attach(image)

        # 添加txt附件(2个参数 txt_addr,file_name)
        if txt_addr != None:
            file = open(txt_addr, 'rb')
            txt_file_content = file.read()
            file.close()
            txt_file = MIMEText(txt_file_content, 'base64', 'utf-8')
            txt_file["Content-Type"] = 'application/octet-stream'
            txt_file.add_header('Content-Disposition', 'attachment', filename=file_name+'.txt')# 命名发送的附件
            msg_root.attach(txt_file)

        try:
            self.con_head(msg_root)
            self.send(msg_root)
            print('send email successful!')
            
        except Exception as e:
            print(e)


if __name__ == '__main__':
    
    #=============测试=============
    #传入fro,to,subject,from_addr,password,to_addr
    se = send_email_by_qq("**@qq.com",'**',["**@qq.com"],"A","B","A Test")
    
    #====发送文本(2个参数 content,form)
    se.text(content = "This is a test", form = "plain")
        
    #====发送html(2个参数 content,form)
    url = "https://www.icourse163.org/"
    html_info = """
        <p>Another World</p>
        <p><a href="%s">click me</a></p>
        """ % url
    
    se.text(content = html_info, form = "html")
  
    #====发送txt文件(2个参数 txt_addr,file_name)
    se.text(txt_addr="D:\\0AAAAAAAAAAAAAAAAAsmalldeskbook\\Python学习\\学习\\邮件\\text.txt",file_name="C")
    
    #====发送图片(2个参数 image_addr,image_name)
    se.image(image_addr = "D:\\0AAAAAAAAAAAAAAAAAsmalldeskbook\\Python学习\\学习\\邮件\\dlk.jpg",image_name="迪卢克")
  
    #====多附件发送(content_txt,content_html,image_addr,image_name,txt_addr,file_name)
    url = "https://www.icourse163.org/"
    html_info = """
        <p>Another World</p>
        <p><a href="%s">click me</a></p>
        """ % url
    
    se.multiple(content_txt="This is a test",
                content_html = html_info,
                image_addr="D:\\0AAAAAAAAAAAAAAAAAsmalldeskbook\\Python学习\\学习\\邮件\\dlk.jpg", image_name = "迪卢克", 
                txt_addr="D:\\0AAAAAAAAAAAAAAAAAsmalldeskbook\\Python学习\\学习\\邮件\\text.txt", file_name="C")

 

下面是多附件发送的结果展示

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值