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','张三','交朋友','你好呀!')
原文地址:https://www.cnblogs.com/seven-007/p/8540535.html