zoukankan      html  css  js  c++  java
  • python之路_操作成功后发送邮件、微信实例

    一、发送邮件代码

      如下为实现发送邮件的功能代码。使用时只需要按照参数要求实例化对象,对象调用send方法,便可实现发送邮件的需求。

    class Email(BaseMessage):
        def __init__(self):
            self.email = "xxxx"               #发件人的邮箱
            self.user = "yyyy"                #发件人名称
            self.pwd = 'zzzz'                 #发件人邮箱密码
    
        def send(self,subject,body,to,name):
            '''
            
            :param subject: 邮件主题
            :param body: 邮件内容
            :param to: 收件人邮箱
            :param name: 收件人名称
            :return: 
            '''
    
            msg = MIMEText(body, 'plain', 'utf-8')                  # 发送内容
            msg['From'] = formataddr([self.user,self.email])        # 发件人
            msg['To'] = formataddr([name, to])                      # 收件人
            msg['Subject'] = subject                                # 主题
    
    
            server = smtplib.SMTP("smtp.126.com", 25)               # SMTP服务,登录发件人邮箱可查看
            server.login(self.email, self.pwd)                      # 邮箱用户名和密码
            server.sendmail(self.email, [to, ], msg.as_string())    # 发送者和接收者
            server.quit()

    二、发送微信

      发送微信消息一般是通过公众号或者服务号平台实现,注册这样平台账号后,个人通过关注这样的公众号(会在平台生成并保存为个人生成的密钥),然后通过如下的代码,调用接口,利用平台将消息发送给关注的个人。

    # pip3 install requests
    import requests
    import json
    
    
    def get_access_token():
        """
        获取微信全局接口的凭证(默认有效期俩个小时)
        如果不每天请求次数过多, 通过设置缓存即可
        """
        result = requests.get(
            url="https://api.weixin.qq.com/cgi-bin/token",     #api接口
            params={
                "grant_type": "client_credential",
                "appid": "wx89085e915d351cae",                 #注册后的公众号提供
                "secret": "64f87abfc664f1d4f11d0ac98b24c42d",  #注册后的公众号提供
            }
        ).json()
    
        if result.get("access_token"):
            access_token = result.get('access_token')
        else:
            access_token = None
        return access_token
    
    def sendmsg(openid,msg):
    
        access_token = get_access_token()
    
        body = {
            "touser": openid,                             #用户通过关注公众号或者服务号后生成的个人密钥,保存在公众号平台内
            "msgtype": "text",                            #发送内容的类型,支持多种类型
            "text": {
                "content": msg                            #要发送的文本内容
            }
        }
        response = requests.post(
            url="https://api.weixin.qq.com/cgi-bin/message/custom/send",  #api接口
            params={
                'access_token': access_token
            },
            data=bytes(json.dumps(body, ensure_ascii=False), encoding='utf-8')
        )
        # 这里可根据回执code进行判定是否发送成功(也可以根据code根据错误信息)
        result = response.json()
        print(result)
    
    
    
    if __name__ == '__main__':
        sendmsg('oK7y70g8OUdJWat84Nkt4sCnN5vg','要发送的内容')

    三、应用实例

      背景:在给某销售员工分配一个客户的时候,通过短息、微信、邮箱通知该用户,用户表中存储有该用户的电话、邮箱地址和关注微信公众号生成的个人密钥等信息,通过跨表可以查询。

    1、base.py:

      主要用于定义一个基类,要求继承该类的类必须实现某个方法,本例要求有send方法。

    class BaseMessage(object):
        def send(self, subject, body, to, name):
            raise NotImplementedError('未实现send方法')

    2、weixin.py

      主要用于实现发送微信的功能,本例未写出具体实例代码。

    from .base import BaseMessage
    
    class WeChat(BaseMessage):
        def __init__(self):
            pass
    
        def send(self,subject,body,to,name):
            print('微信发送成功')

    3、msg.py

      主要用于实现发送短信的功能,本例未写出具体实例代码。

    from .base import BaseMessage
    class Msg(BaseMessage):
        def __init__(self):
            pass
    
        def send(self,subject,body,to,name):
            print('短信发送成功')

    4、email.py

      主要实现发送邮件的功能,具体实例代码如下。

    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formataddr
    from .base import BaseMessage
    
    class Email(BaseMessage):
        def __init__(self):
            self.email = "m394559@126.com"     #发件人的邮箱
            self.user = "武沛齐"                #发件人名称
            self.pwd = 'WOshiniba'             #发件人邮箱密码
    
        def send(self,subject,body,to,name):
            '''
    
            :param subject: 邮件主题
            :param body: 邮件内容
            :param to: 收件人邮箱
            :param name: 收件人名称
            :return:
            '''
    
            msg = MIMEText(body, 'plain', 'utf-8')  
            msg['From'] = formataddr([self.user,self.email]) 
            msg['To'] = formataddr([name, to])  
            msg['Subject'] = subject 
    
    
            server = smtplib.SMTP("smtp.126.com", 25) 
            server.login(self.email, self.pwd)
            server.sendmail(self.email, [to, ], msg.as_string()) 
            server.quit()

      以上为我们写的各个发送消息的类,每个类中均要求实现了send方法。但是怎么用到某个操作之后呢?可能会想到对以上各个类进行实例化,然后逐一调用send方法。当然这样是可行的。但是鉴于代码的开放封闭原则,如果我们将以上的调用写死在主代码中,某一天我们想去掉某种消息提醒的方式时,我们要在主代码中进行修改。这显然不符合开放封闭原则。改变方式就是在配置文件中进行配置,通过配置决定使用那些消息提醒方式。如下:

    1、配置文件

    '''
    如下为各个类的路径,参考中间件方式配置
    ''' MESSAGE_CLASSES = [ 'utils.message.email.Email', 'utils.message.msg.Msg', 'utils.message.wx.WeChat', ]

    2、massege.py

      主要用于对配置文件中的路径进行解析,实现实例化,并调用send方法。

    import importlib
    from django.conf import settings
    
    def send_message(to,name,subject,body):
        """
        短信、邮件、微信
        :param to: 接受者 
        :param name: 接受者姓名
        :param subject: 主题
        :param body: 内容
        :return: 
        """
        for cls_path in settings.MESSAGE_CLASSES:
            module_path,class_name = cls_path.rsplit('.',maxsplit=1)
            m = importlib.import_module(module_path)
            obj = getattr(m,class_name)()
            obj.send(subject,body,to,name,)

    3、调用实例

    import message
     message.send_message('931880645@qq.com','张三','交朋友','你好呀!')
  • 相关阅读:
    Caused by: java.lang.ClassNotFoundException: org.w3c.dom.ElementTraversal
    Linux系统下jar包的启动方式
    1062 Error 'Duplicate entry '1438019' for key 'PRIMARY'' on query
    Linux学习笔记 --iptables防火墙配置
    MySQL学习笔记_10_MySQL高级操作(下)
    MySQL学习笔记_9_MySQL高级操作(上)
    MySQL学习笔记_8_SQL语言基础复习
    Linux 学习笔记_12_文件共享服务_4_SSH
    Linux 学习笔记_12_文件共享服务_3_NFS网络文件服务
    MySQL学习笔记_7_MySQL常用内置函数
  • 原文地址:https://www.cnblogs.com/seven-007/p/8540535.html
Copyright © 2011-2022 走看看