一、发送邮件代码

如下为实现发送邮件的功能代码。使用时只需要按照参数要求实例化对象,对象调用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','张三','交朋友','你好呀!')