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','張三','交朋友','你好呀!')