一、发送邮件代码
如下为实现发送邮件的功能代码。使用时只需要按照参数要求实例化对象,对象调用send方法,便可实现发送邮件的需求。
classEmail(BaseMessage):def __init__(self):
self.email= "xxxx" #发件人的邮箱
self.user = "yyyy" #发件人名称
self.pwd = 'zzzz' #发件人邮箱密码
defsend(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
importrequestsimportjsondefget_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=Nonereturnaccess_tokendefsendmsg(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方法。
classBaseMessage(object):defsend(self, subject, body, to, name):raise NotImplementedError('未实现send方法')
2、weixin.py
主要用于实现发送微信的功能,本例未写出具体实例代码。
from .base importBaseMessageclassWeChat(BaseMessage):def __init__(self):pass
defsend(self,subject,body,to,name):print('微信发送成功')
3、msg.py
主要用于实现发送短信的功能,本例未写出具体实例代码。
from .base importBaseMessageclassMsg(BaseMessage):def __init__(self):pass
defsend(self,subject,body,to,name):print('短信发送成功')
4、email.py
主要实现发送邮件的功能,具体实例代码如下。
importsmtplibfrom email.mime.text importMIMETextfrom email.utils importformataddrfrom .base importBaseMessageclassEmail(BaseMessage):def __init__(self):
self.email= "m394559@126.com" #发件人的邮箱
self.user = "武沛齐" #发件人名称
self.pwd = 'WOshiniba' #发件人邮箱密码
defsend(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方法。
importimportlibfrom django.conf importsettingsdefsend_message(to,name,subject,body):"""短信、邮件、微信
:param to: 接受者
:param name: 接受者姓名
:param subject: 主题
:param body: 内容
:return:"""
for cls_path insettings.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、调用实例
importmessage
message.send_message('931880645@qq.com','张三','交朋友','你好呀!')