自动发邮件面向对象

Posted zhouly-008

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动发邮件面向对象相关的知识,希望对你有一定的参考价值。

一、自动发邮件

1、使用模块 yagmail,安装模块,python install yagmail-0.10.212-py2.py3-none-any.whl

如果直接pip install yagmail,发中文附件,文件名显示为乱码

2、在邮箱设置开启smtp服务

 

3、开启邮箱授权码,授权码是用于登录第三方邮件客户端的专用密码。

适用于登录以下服务: POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

 

自动发邮件代码示例:

import yagmail

username = [email protected]
passwd = sdfsdfsd#授权码,随便填的,请输入自己的
mail = yagmail.SMTP(user=username,
                    password=passwd,
                    host=smtp.163.com,
                    # smtp_ssl=True
                    ) #如果用的是qq邮箱或者你们公司的邮箱使用是安全协议的话,
                    # smtp_ssl=True
mail.send(
    to=[[email protected],[email protected]], #如果多个收件人的话,写成list就行了
    cc=[email protected],#抄送
    subject=学习发送邮件,#邮件标题
    contents=你好,你今天开心吗?,#邮件正文
    attachments=[rC:\\Users\\nhy\\Desktop\\修改pip源.py,
                 rC:\\Users\\nhy\\PycharmProjects\\pp\\day9\\笔记.txt])
print(发送成功)

二、面向对象编程

1、面向对象与面向过程的区别

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

 

举例:买车

面向过程编程 执行者,完成买车整个过程,要在不同地点完成不同的事情,要进行以下步骤:

1、4S店 掏钱买车

2、保险公司 上保险

3、税务局 交购置税

4、交管局 验车、选号、交钱、取牌、上牌

面向对象 指挥者 ,买车只需要在买车办事处完成,在办事处4S店、保险公司等这些角色(即对象)能完成相应的事情

买车办事处

1、4S店 掏钱买车

2、保险公司 上保险

3、税务局 交购置税

4、交管局 验车、选号、交钱、取牌、上牌

 

2、面向对象的一些概念

  1. 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  2. 方法:类中定义的函数。
  3. 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  4. 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  5. 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  6. 实例变量:定义在方法中的变量,只作用于当前实例的类。
  7. 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。 python3中多继承都是广度优先,python2中经典类的多继承是深度优先,新式类的多继承是按照 广度优先的。

继承是为了代码的重用

  1. 实例化:创建一个类的实例,类的具体对象。
  1. 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

10.封装:把一些功能的实现细节不对外暴露,类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法。

比如说造的一个人,你把他身体内部的什么心肝脾肺肾都封装起来了,其他人都看不到,你直接找这个人。

11.多态:对不同类的对象发出相同的消息将会有不同的行为。比如,你的老板让所有员工在九点钟开始工作, 他只要在九点钟的时候说:“开始工作”即可,而不需要对销售人员说:“开始销售工作”,对技术人员说:“开始技术工作”, 因为“员工”是一个抽象的事物, 只要是员工就可以开始工作,他知道这一点就行了。至于每个员工,当然会各司其职,做各自的工作。

多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话

 

3、类的一些概念

  1. 属性:属性就是类里面的一个变量,有类变量和实例变量,类变量是类在定义的时候就有的,实例变量是在实例化的时候才产生的变量。这个可以理解为,人是一个类,他的名字、年龄、性别就是它的属性。
  2. 方法:方法就是类的功能,也就是定义在类里面的函数,它实现了某个功能,比如说人有睡觉的功能。
  3. 构造函数:什么是构造函数,就是类在实例化的时候做的某些初始化操作,比如说人,你造一个汽车的时候,它得有颜色、型号等等。

def __init__():

pass

  1. 析构函数:析构函数就是这个实例在销毁的时候做的一些操作。

def __del__():

pass

  1. 定义类:定义类使用class关键字,类名一般我们开发的时候首字母要大写。python中有经典类和新式类,他俩在python3中没有区别,在python2中经典类在多继承的时候是深度优先,新式类是广度优先。python3中统一是广度优先,这个后面在说继承的时候会说。
  1. 属性方法

看起来像属性的一个方法。

7. 类变量

类变量,公共的变量,每个实例都可以用

8. 实例变量(成员变量)

9. 实例方法

实例化之后才可以用的。

10. 类方法

1、不用实例化就可以直接调用。

2、它可以通过cls使用类变量

3、它不能调用这个类里面的其他实例方法和实例变量

11.静态方法

#你不想实例化的时候,就可以定义成类方法

#静态方法就是一个普通函数,只不过是写在类里面而已,它用不了类变量、类方法、实例变量、实例方法

12.私有

私有方法

私有变量

出了类之后,就不能用了。

 

代码示例:

class Person:  #经典类
    def __init__(self,name):#构造函数
        self.name = name
        self.nose = 2 #鼻子  #属性
        self.face = 2 #
        self.head = 10 #脑子
        self.wing = 4#翅膀
        print(开始造人。。。)
    def driver(self):
        print(老司机,开车非常稳)
        self.eat() #调用类里面的函数
    def fly(self):
        print(%s 在飞。。%self.name)
        #获取类里面的变量
    def eat(self):
        print(%s 吃火锅,吃小龙虾,喝啤酒%self.name)

#类在用到时候,首先必须实例化,即模型要造出对象才能用
zll=Person(张流量)#传入参数
zll = Person(张流量)#传入参数
zll.driver()

# zlj = Person()  #实例化,类名加上括号就是实例化
# zlj.eat()
# zlj.fly()
# zlj.fly()
# zlj.eat()
# print(zlj.wing)
# print(zlj.nose)

class Person2(object):#新式类
    pass

#类名首字母都大写
#在python3里面经典类和新式类没有任何区别

4、“签名规则”功能分别使用面向对象和面向过程来实现

1)、签名规则的需求:

A、输入数据:

1、请求数据:

vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0

2:商家编码:

1697

 

B、计算规则:

1、将商家编码(vendorId)1697进行两次MD5加密得到一个字符串 Astr:09B764965CE4E92BED8BD3140E22D5CF

2、将请求数据

vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0

进行urlDecode处理(编码格式为utf-8)得到一个字符串urlDecodeStr:

vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0

3、urlDecodeStr + Astr 拼接得到一个待加密的字符串 beforeMD5

vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E009B764965CE4E92BED8BD3140E22D5CF

然后将 beforeMD5字符串进行加密得到最终的签名:

6F811B63B11D92BA4A359E6DC98EEE31

 

2)需求分析

python基础教程 %DFSDF url编码

%DFSDF 学习 url解码

 

1、请求数据获取到

2、提取到商家编码

3、将商家编码进程2次md5 得到astr

4、再将请求数据进行一次urldecode,urlstr

5、astr+url_str MD5

 

3)使用面向过程方式来实现编码规则的功能,代码示例:

from urllib import  parse
# url=‘http://www.baidu.com?query=python基础教程‘
# url_str=parse.quote_plus(url)#URL解码
# #print(parse.quote_plus(url))
# baidu_url=‘https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=python%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B&oq=python&rsv_pq=b6c92ffc00023232&rsv_t=be4d%2FdgIVLHbmdj5jU9bfpJTXGIAcO4y2u%2BfKsxWWJW2wIKbEuXL6tNXiug&rqlang=cn&rsv_enter=1&inputT=878&rsv_sug3=9&rsv_sug1=3&rsv_sug7=100&rsv_sug2=0&prefixsug=python&rsp=1&rsv_sug4=2134&rsv_sug=1‘
#print(parse.unquote_plus(baidu_url))#url编码
s=vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0
import  hashlib
def my_md5(s):
    md = hashlib.md5()
    md.update(s.encode())
    return md.hexdigest()
def get_vendorid(req_data):
    data_dict={}
    sub_list=req_data.split(&)
    for i in sub_list:
        k,v=i.split(=)
        data_dict[k]=v
    return data_dict.get(vendorId)
def sign(req_data):
     verid=get_vendorid(req_data)
     print(verid)
     first=my_md5(verid)
     astr=my_md5(first)
     url_srt=parse.unquote_plus(req_data)
     res=my_md5(astr+url_srt)
     return res
#s=‘vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0‘
#print(sign(s))
#sign(s)

4)使用面向对象方式来实现编码规则的功能,代码示例:

class Sign(object):
    def __init__(self,req_data):
        self.req_data = req_data  #这写了self的话,在其他的函数里面也可以用self.xx
        self.get_verid()
        self.get_sign()
    def md5(self,s):#self叫做本类对象
        md = hashlib.md5()
        md.update(s.encode())
        return md.hexdigest()

    def get_verid(self):
        data_dict = {}
        sub_list = self.req_data.split(&)
        for i in sub_list:
            k, v = i.split(=)
            data_dict[k] = v
        self.verid = data_dict.get(vendorId)
    def get_sign(self):
        frist = self.md5(self.verid)
        astr = self.md5(frist)
        url_str = parse.quote_plus(self.req_data)
        self.sign = self.md5(astr+url_str)
        return self.sign
print(__nam__,__name__)

if __name__ == __main__:    s=vendorId=1697&posCode=pos006&ip=127.0.0.1&posVersion=2.1.1.1.1&mac=;D4-81-D7-CA-20-29;7C-67-A2-9A-06-05;7C-67-A2-9A-06-06;7C-67-A2-9A-06-09;00-00-00-00-00-0000E0
    abc = Sign(s)
    print(abc.sign)
    print(我是sign...)

知识点:

if __name__ == ‘__main__‘:

判断这个python是在别的地方导入的,还是直接运行的这个python文件

这句话一般是做调试的时候用的。

1、如果是直接运行这个python文件的时候,这句话一点用都没有

2、如果是其他python文件中导入这个模块,则不会执行这个语句下面的内容

 

5、用面向对象方式来实现mysql数据库操作,代码示例:

import pymysql
class Mydb(object):
    def __del__(self):
        #析构函数,析构函数就是这个实例在销毁的时候做的一些操作,关闭游标,关闭数据库连接
       self.cur.close()
       self.coon.close()
       print(over....)

    def __init__(self,
                 host,user,passwd,db,port=3306,charset=utf8):
        try:
            self.coon=pymysql.connect(
                host=host,user=user,passwd=passwd,port=port,charset=charset,db=db,
                autocommit=True,#自动提交
        )
        except Exception as e:
           print(数据库连接失败%s%e)
        else:
            self.cur=self.coon.cursor(cursor=pymysql.cursors.DictCursor)
    def ex_sql(self,sql):
        try:
            self.cur.execute(sql)
        except Exception as e:
            print(sql语句有问题,%s%sql)
        else:
            self.res=self.cur.fetchall()
            return self.res
my=Mydb(118.24.3.40,jxz,123456,jxz)
stu=my.ex_sql(select * from stu;)
print(我是最后一行代码了)
print(stu)

6、厘清面向对象的一些概念,代码示例

class Baby():
    country=China#类变量,相当于公共的变量,不用实例化就可以用,可以节省内存
    # def __init__(self):
    #     self.country=‘China‘
    # def __init__(self,name):
    #     print(‘self的内存地址‘,id(self))
    #     self.name=name
    #     #self代表的就是实例化之后的对象
    #     self.money=5000
    #     self.sex=‘女‘
    def my(self):
        self.name=牛汉阳

    def cry(self):#实例方法,都得实例化后才能调用
        #self.sex
        print(哇哇哇)
    @property#装饰器
    def hhh(self):
        return 198
    def xm(self):
        print(我是类方法)
  #  @classmethod
    def xm1(cls):#cls代表的就是Baby
        print(cls.country)
        print(我是类方法)
        # print(cls.name)
        # cls.cry

    @staticmethod
    def xh():
        print(这是个静态方法,他和一个没写在类里面的函数是一样的)

# Baby.country=‘USA‘ #类变量是可以直接通过类名.xxx来进行修改的。

# 类方法
# 1、不用实例化就可以直接调用。
# 2、它可以通过cls使用类变量
# 3、它不能调用这个类里面的其他实例方法和实例变量
#不想实例化的时候,就可以定义为类方法
#静态方法 @staticmethod
#你不想实例化的时候,就可以定义成类方法
#静态方法就是一个普通函数,只不过是写在类里面而已,它用不了类变量、类方法、实例变量、实例方法

 

以上是关于自动发邮件面向对象的主要内容,如果未能解决你的问题,请参考以下文章

如何利用python监控主机存活并邮件,短信通知

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程

java windows自动化-mail自动发邮件

android 自动发邮件

Python如何一行代码自动发邮件