前言: 快两个月没写博客了, 原因是懒了, 没有最初写博客那种看到阅读量上涨, 别人给自己文章点赞后的开心. 心态也发生了不少变化. 有机会再来写写. 前两个月我去厦门某公司实习, 本着去厦门玩一玩还有先了解下公司情况, 11月底就去厦门了. 这两个月最大的变化是我自己变得更会玩了, 蛮开心的. 公司2月13号才放假员工过春节, 我就先请假回家了, 2月9号就到家了. 这几天在家除了吃和睡, 也随便看看flask, 感觉flask真的是很简单呀. 我看的是下面这本书, 我才看一两天, 书写得很好, 当然有一很坑. 接下来我会写一些文章来总结我学flask的过程, 因为我已经大致学过django了, flask与django大致是一样的, 所以我只挑我感得有意思有坑的写, 建议小白还是看书学比较系统.

 

一、功能讲解

因为是初学flask, 讲一下我现在的小项目的功能.当你访问网址时(请忽略192.168.90.63:30102), 这是我用公司内部镜像暴露端口出来给我访问的. 你没有VPN, 也是访问不了的. 你访问这个界面时, 你被当成了陌生人, 被要求输入名字. 

OK, 接下来我输入zcl, 点击提交按钮后, 出现如下图. 显示(Happy to see you again), 这是因为点击提交按钮后会把你的名字存到数据库, zcl用户之前已经存到数据库了, 当你再次输入zcl时, 出显示Happy to see you again.

那如果我输入一个数据库中不存在的用户, 会发生什么情况呢? 比如我输入big SB

下面是代码, 看不懂也没关系. 我来讲, 当你输入big SB, 再点击提交, 后台会根据用户名big SB去数据库查这个用户. 很显然, 查不到, 所以下面的第5行代码user为None。既然数据库中没有big SB这个用户, 那就来创建这个用户, 再保存到数据库中呗. 

但我还不满足, 我还想实现一个发邮件的功能. 比如项目的管理员用户是:zcl, 当有新用户产生(类似big SB用户)时, 会必送一个邮件给zcl用户. 在这实践过程中, 发现这功能有坑, 故下面详细讲下flask发邮件这个功能

@app.route(\'/\', methods=[\'GET\', \'POST\'])
def index():
    form = NameForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.name.data).first()
        if user is None:
            user = User(username=form.name.data)
            db.session.add(user)
            db.session.commit()
            session[\'known\'] = False
            if app.config[\'FLASKY_ADMIN\']:
                send_email(app.config[\'FLASKY_ADMIN\'], \'New User\', \'mail/new_user\', user=user)
        else:
            session[\'known\'] = True
        session[\'name\'] = form.name.data
        return redirect(url_for(\'index\'))
    return render_template(\'index.html\', form=form, name=session.get(\'name\'),
                           known=session.get(\'known\', False))

 

二、发送邮件效果

先来看效果, 我实现自己给自己的邮箱帐号发送一份邮件, 来说明增加的是哪个新用户.

 

三、具体实现

1、导入第三方库

from flask_mail import Mail, Message

Flask-Mail 连接到简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)服务器,并把邮件交给这个服务器发送。如果不进行配置,Flask-Mail 会连接 localhost 上的端口 25,无需验证即可发送电子邮件。表 6-1 列出了可用来设置 SMTP 服务器的配置。

在开发过程中,如果连接到外部 SMTP 服务器,则可能更方便.

 

2、写配置文件

你可能看不懂这此配置文件, 没关系, 我下面会讲.

具体实现时, app.config[\’FLASKY_MAIL_SENDER\’] = \’1274828542@qq.com\’会发送邮件给管理员app.config[\’FLASKY_ADMIN\’] = \’1274828542@qq.com\’

第9行与发送邮件主题相关. 既然发送者要发送邮件, 那他肯定需要登录邮箱呀! 所以就必然需要密码.故app.config[\’MAIL_PASSWORD\’] = \’kjhymbxowmey****\’是密码(为了避免我的密码泄露, 不显示后面4位数).

1~3行为什么是465, smtp.qq.com, True, 下面会讲. 

1 app.config[\'MAIL_SERVER\'] = \'smtp.qq.com\'  # this is email server
2 app.config[\'MAIL_PORT\'] = 465  # this is the port of email server
3 app.config[\'MAIL_USE_SSL\'] = True
4 app.config[\'MAIL_USERNAME\'] = \'1274828542@qq.com\'
5 # app.config[\'MAIL_PASSWORD\'] = \'abcdefg\'  # 为了避免我的密码泄露, 这不是我邮箱的真正密码
6 app.config[\'MAIL_PASSWORD\'] = \'kjhymbxowmey****\'  # this is email password(这是什么?下面会讲)
7 app.config[\'FLASKY_MAIL_SENDER\'] = \'1274828542@qq.com\'  # this is sender
8 app.config[\'FLASKY_ADMIN\'] = \'1274828542@qq.com\'  # this is the email of admin
9 app.config[\'FLASKY_MAIL_SUBJECT_PREFIX\'] = \'[Flasky]\'  # this is subject of email we will send

如上, 我想发邮件到我的QQ邮箱. 便调用以下方法.

def send_email(to, subject, template, **kwargs):
    msg = Message(app.config[\'FLASKY_MAIL_SUBJECT_PREFIX\'] + subject,
                  sender=app.config[\'FLASKY_MAIL_SENDER\'], recipients=[to])
    msg.body = render_template(template + \'.txt\', **kwargs)
    msg.html = render_template(template + \'.html\', **kwargs)
    mail.send(msg)

3、发送邮件

            if app.config[\'FLASKY_ADMIN\']:
                send_email(app.config[\'FLASKY_ADMIN\'], \'New User\', \'mail/new_user\', user=user)

 

四、坑总结与配置讲解

1、邮箱没有开启SMTP服务

最开始我的邮件是发不出去的. app.config[\’MAIL_PORT\’] = 465也是按书上来的, 我只知道是一个端口. 邮件发不出去, 怎么办. 看了网上一些文章, 发现我的QQ邮箱可能没有开启SMTP服务. 哇擦,这也太坑了吧. 登入QQ邮箱, 设置->帐户.

如果, 我没有开启, 下图是我开启后的截图, 我之前是没有开启的. 

 开启时还需要发短信才给通过验证, 通过后就可以开启了.通过后会显示如下授权码, 请务必把你QQ邮箱的授权码记下来!!!

 

 

2、配置讲解

密码错误也是一个坑. 在讲这个坑之前, 先来讲下邮箱配置的1~3行为什么是465, smtp.qq.com, True.

进入下图红色方框内的链接:

重点来了:

1 app.config[\'MAIL_SERVER\'] = \'smtp.qq.com\'  # this is email server
2 app.config[\'MAIL_PORT\'] = 465  # this is the port of email server
3 app.config[\'MAIL_USE_SSL\'] = True

使用SSL, 所以第3行为True; 发送邮件的服务器是smtp.qq.com, 所以第一行也是smtp.qq.com; 当然第二行你写587我想也是可以的(没试过)

 

3、密码错误

因为我的邮箱密码是abcdefg; 所以最开始是这样写的, 但是依旧发不出邮件. 太TM伤心了.

app.config[\'MAIL_PASSWORD\'] = \'abcdefg\'

出现了一个错误:

关于发邮件报错535 Error:authentication failed

这时让我不得不怀疑, 这密码是不是错误了, 但不可能呀, 我密码就是abcdefg. 这就陷入死胡同了

直到看到这篇文章: http://blog.csdn.net/huochen1994/article/details/51282093

调用163邮箱服务器来发送邮件,我们需要开启POP3/SMTP服务,这时163邮件会让我们设置客户端授权码,这个授权码替代上面代码部分的passwd即可成功发送邮件

于是这将密码更改如下(开启SMTP服务时, 我已经让你记下授权码了!!):

app.config[\'MAIL_PASSWORD\'] = \'kjhymbxowmey****\'  # this is email password

 

收到邮件的那一刻, 开心是真的.

最近感觉, 在一个城市工作两三个月, 然后再换一个城市工作两三个月. 会很好玩.

转发请注明出处: http://www.cnblogs.com/0zcl/p/8443544.html , 不然我也拿你没办法~_~

版权声明:本文为0zcl原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/0zcl/p/8443544.html