首页 > 上网技巧 > 电脑小技巧 > 微信公众号对邮件信息的推送

微信公众号对邮件信息的推送

时间:2017-11-30 13:53 作者:QQ地带 我要评论

一、课程简介
 
本小节,由微信公众号,结合 Python 对邮箱的操作,实现微信公众号对邮件信息的推送。实现的流程大概分为两部分,首先通过微信公众号的消息机制,向服务器发送消息。当服务器得到消息以后,调用 Python 对邮件进行操作,从而实现微信公众号对邮件信息的推送。
 
1.1 课程知识点
 
本实验课程,主要涉及到以下知识点:
 
微信公众号的消息机制
 
Python 对邮件的操作
 
SMTP 发送邮件的基本知识
 
1.2 最终效果图
 
实验的最终效果图如下:
 
 
 
 
 
好了,下面让我们先进行一下实验环境的准备,邮箱操作,首先得开通 SMTP 服务
 
二、实验环境准备
 
2.1 申请开通邮箱的 SMTP 服务
 
这里我推荐使用 163 邮箱的 SMTP,如果你使用腾讯QQ 邮箱,中间会遇到各种各样奇葩的问题。
 
在做课程实验的过程中,如果遇到了邮件发送不出去,老是报错的问题,首先可以去百度谷歌一下,你碰到的问题,各种前辈都已经碰到过了,实在解决不了,可以留言在讨论区,一般情况下,都是把邮箱密码当成了授权码的错误。
 
回到正题,我们先开通 163 的邮箱服务。
 
首先登陆 163 邮箱,进去之后
 
 
 
接着开启 SMTP 服务,见图,都打勾:
 
 
 
接着记住,再去开启授权码(这个相当的重要,授权码用以登录邮箱,非常关键的一步)
 
等会会用到授权码,如果在这开启的过程中,没绑定手机就绑手机,没密保的就设置密保,不然无法使用 SMTP 功能。
 
 
 
2.2 检测是否成功
 
下面,单独创建个send_email.py代码,看是有能够进行邮箱操作
 
建立文件send_email.py代码如下:
 
# -*- coding: utf-8 -*-
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
 
# 格式转成 utf-8
def_format_addr(s):
    name, addr = parseaddr(s)
    return formataddr(( \
        Header(name, 'utf-8').encode(), \
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))
 
 
# 你的邮箱
from_addr = '#######@163.com'
# 你的授权码,注意了,大写的注意,不是你邮箱的登录密码,是授权码
password = '######'
# 你要发送到的邮箱
to_addr = '#######@163.com'
# 163 的 smtp 服务器
smtp_server = 'smtp.163.com'
 
msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
msg['From'] = _format_addr(u'实验楼管理员 <%s>' % from_addr)
msg['To'] = _format_addr(u'管理员 <%s>' % to_addr)
msg['Subject'] = Header(u'放学别走!操场见!', 'utf-8').encode()
 
# 连接服务器,163的smtp端口号,为25
server = smtplib.SMTP(smtp_server, 25)
 
# set_debuglevel大于0时将启用调试模式,也就是输出链接信息,发送头信息等。
server.set_debuglevel(1)
 
# 登录邮箱
server.login(from_addr, password)
 
# 发送邮件
server.sendmail(from_addr, [to_addr], msg.as_string())
 
# 退出服务器
server.quit()
部分代码参考:廖雪峰 Python 教程之邮箱发送,代码地址
 
在后文,我们还要对代码进行封装,在这上面的代码进行改动,形成一个能调用的函数。从而更好地方便模块化调用。
 
在代码send_email.py中填好你的授权码和邮箱地址,在封装前先运行下该函数,看你的邮箱是否能够发送邮件这是发送成功效果图:
 
 
 
三、结合微信公众号
 
3.1 封装send_email.py函数
 
稍微修改一下代码,将这个send_email.py函数封装成一个可调用的方法,由微信公众号,得到消息后,传入参数给这个函数,即可实现微信公众号推送邮件的功能。
 
封装send_email.py后,完整代码如下:
 
# -*- coding: utf-8 -*-
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
 
 
# 格式转成 utf-8
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr(( \
        Header(name, 'utf-8').encode(), \
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))
 
 
def sendEmail(email, content):
    # 你的邮箱
    from_addr = 'XXXXX@163.com'
    # 你的授权码,注意了,大写的注意,不是你邮箱的登录密码,是授权码
    password = 'XXXXXX'
    # 你要发送到的邮箱
    to_addr = email
 
    # 163 的 smtp 服务器
    smtp_server = 'smtp.163.com'# 发送邮件的内容
    msg = MIMEText(content, 'plain', 'utf-8')
 
    # 发邮件的人的邮箱
    msg['From'] = _format_addr(u'实验楼管理员 <%s>' % from_addr)
 
    # 要发送到的邮箱
    msg['To'] = _format_addr(u'管理员 <%s>' % to_addr)
 
    # 发送的邮件标题
    msg['Subject'] = Header(u'放学别走!操场见!', 'utf-8').encode()
 
    # 连接服务器,163的smtp端口号,为25
    server = smtplib.SMTP(smtp_server, 25)
 
    # set_debuglevel大于0时将启用调试模式,也就是输出链接信息,发送头信息等。
    server.set_debuglevel(1)
 
    # 登录邮箱
    server.login(from_addr, password)
 
    # 发送邮件
    server.sendmail(from_addr, [to_addr], msg.as_string())
 
    # 退出服务器
    server.quit()
3.2 完整的shyanlou.py函数
 
在上一节的shiyanlou.py最终完整代码如下,每行都有注释:
 
#-*- coding:utf-8 -*-import werobot
from werobot.reply import ArticlesReply, Article
import send_email 
import re
 
# token填写你的微信 token 值
robot = werobot.WeRoBot(token='shiyanlou')
 
# 关注的时候,事件触发此函数@robot.handlerdefwelcome(message):return"关注实验楼,动手做IT"# 接收到图片时,触发此函数@robot.imagedefecho(message):# 实例化一个图文消息
    reply = ArticlesReply(message=message)
 
    # 下面的 title, description, img, ulr 就是你要换掉的东西
    article = Article(
        title="Learn By Doing",
        description="实验楼,动手实践学IT",
        img="https://ws1.sinaimg.cn/large/005EFdvdgw1f88zx9nwevj30b4086wev.jpg",
        url="https://github.com/whtsky/WeRoBot"
    )
 
    # 最多可用 add 10 个,就是平时你见的公众号推送下的其他文章链接 
    reply.add_article(article)
 
    # 返回图文消息
    return reply
 
 
 
# 接收到文字时,触发此函数    @robot.text    defsendEmail(message):# 得到用户发送的完整信息
    usermessage = message.content
 
    #得到用户的邮箱
    email = re.search('\w.*.com',usermessage)
 
    if email:
 
        # 得到 eamil 的具体数值
        email = mail.group().encode('utf-8')
 
        #得到用户想发的内容,规定格式为:发邮件到XXXXXX@.com,内容叉叉叉,这个是为了找到 .con 的索引
        index = usermessage.find('com')
 
        # [index+4:] 其中,index+4代表 'com,' 这四个字符串,也就是说,这四个字符串后面开始算是内容
        content = usermessage[index+4:]
 
        try:
            # 调用封装好的发邮件函数,传递参数为:发送到的邮箱,发送的内容
            send_email.sendEmail(email,content)
        except:
            return'False'return'success'
      else:
    # 非发邮件状态下,返回的文字    
    return"有种你放学别走!"
 
 
robot.run(host='127.0.0.1',port=8080)
3.3 最终效果演示
 
最终版的使用,我走一遍流程,给大家演示一下:
 
1. 首先确保./sunny clientid 隧道ID开启
 
先进到你下载的 ngrok 文件夹,找到sunny这个同级目录,在终端输入命令,启动ngrok:
 
./sunny clientid {你的隧道ID}
再打开另一个新的终端,运行shiyanlou.py,见图
 
 
 
2. 向微信号公众号发消息
 
确保代码都是最终代码后,先取消对你的公众号的关注,然后重新关注你的微信公众号,会触发以下事件:
 
分别是关注事件,触发回复:
 
关注实验楼,动手做IT
 
发普通文字,收到文字回复回复:
 
有种你放学别走!
 
发图片消息,触发图文消息回复:
 
 
 
发文字:发邮件到123456789@qq.com,动手实践学IT,那么邮件就发到了你填的邮箱,内容为第一个","后面的所有内容
 
 
 
 
 
可根据自己需要,修改shiyanlou.py中的正则表达式,来截取自己所需要的邮箱内容,从而实现邮件信息推送。
 
见shiyanlou.py中相应的代码,接收到文本消息后,由正则表达式得到邮箱,这是对应的代码:
 
# 得到用户发送的完整信息usermessage = message.content
 
#得到用户的邮箱email = re.search('\w.*.com',usermessage)
四、实验总结
 
通过本次实验,大家了解微信,邮箱操作。遇到问题,先尝试自己解决,解决不了的问题,可以在讨论区留言。举个比较常见的错误,比如邮件发送老是530,553 问题,初学者很容易气馁。其实这种情况,要么就是授权码的问题,要么就是自己单词拼写错误的问题。
 
碰到问题,最简单的情况,就是把问题复制一遍,放到谷歌上,先自己谷歌一下,就会发现很多人像你一样碰到过类似的情况了。相应的办法,早已有在了网上。还有邮箱实在不行的时候,有时候换一个邮箱说不定就行了,在写本篇教程的时候,之前是使用 QQ 邮箱作为尝试的,但是邮件老是发不出去,经网上查找原因后,可能是因为腾讯的邮箱改版等问题,结果改用 163 邮箱就特别顺利。
 
邮箱服务商的一些接口突然改变了。而网上的教学教程,还未来得及及时更新。这种情况在我们学习的过程中,是经常碰到。最后,放上本实验的完整代码地址,以供大家下载。
 
本实验的完整代码地址:
 
http://labfile.oss.aliyuncs.com/courses/690/shiyanlou.zip
若使用上面的完整代码,要更改两个的地方,首先你的是 163 邮箱以及相应的授权码。若换成其他邮箱则该需修改,相应的地方 SMTP 服务器地址和端口
 
163 邮箱的改这两个地方,最后再说一遍,是授权码,不是登录密码,授权码是在使用 SMTP 服务的时候生成的。要改的地方如图:
 
 
 
最后,感谢学习本实验课程。
 
有什么好的建议和课程反馈,欢迎留言。

标签: 微信公众号
顶一下
(0)
0%
踩一下
(0)
0%

Google提供的广告