python之路_操做成功後發送郵件、微信實例

1、發送郵件代碼django

  以下爲實現發送郵件的功能代碼。使用時只須要按照參數要求實例化對象,對象調用send方法,即可實現發送郵件的需求。json

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()

2、發送微信api

  發送微信消息通常是經過公衆號或者服務號平臺實現,註冊這樣平臺帳號後,我的經過關注這樣的公衆號(會在平臺生成並保存爲我的生成的密鑰),而後經過以下的代碼,調用接口,利用平臺將消息發送給關注的我的。緩存

# 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','要發送的內容')

3、應用實例微信

  背景:在給某銷售員工分配一個客戶的時候,經過短息、微信、郵箱通知該用戶,用戶表中存儲有該用戶的電話、郵箱地址和關注微信公衆號生成的我的密鑰等信息,經過跨表能夠查詢。app

一、base.py:post

  主要用於定義一個基類,要求繼承該類的類必須實現某個方法,本例要求有send方法。ui

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

二、weixin.pyurl

  主要用於實現發送微信的功能,本例未寫出具體實例代碼。spa

from .base import BaseMessage

class WeChat(BaseMessage):
    def __init__(self):
        pass

    def send(self,subject,body,to,name):
        print('微信發送成功')

三、msg.py

  主要用於實現發送短信的功能,本例未寫出具體實例代碼。

from .base import BaseMessage
class Msg(BaseMessage):
    def __init__(self):
        pass

    def send(self,subject,body,to,name):
        print('短信發送成功')

四、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方法。固然這樣是可行的。可是鑑於代碼的開放封閉原則,若是咱們將以上的調用寫死在主代碼中,某一天咱們想去掉某種消息提醒的方式時,咱們要在主代碼中進行修改。這顯然不符合開放封閉原則。改變方式就是在配置文件中進行配置,經過配置決定使用那些消息提醒方式。以下:

一、配置文件

'''
以下爲各個類的路徑,參考中間件方式配置
''' MESSAGE_CLASSES = [ 'utils.message.email.Email', 'utils.message.msg.Msg', 'utils.message.wx.WeChat', ]

二、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,)

三、調用實例

import message
 message.send_message('931880645@qq.com','張三','交朋友','你好呀!')
相關文章
相關標籤/搜索