说明

来源: flask web开发第六章   很多类型的应用程序都需要在特定事件发生时提醒用户,而常用的通信方法是电子邮件。 虽然 Python 标准库中的 smtplib 包可用在 Flask 程序中发送电子邮件,但包装了 smtplib 的 Flask-Mail 扩展能更好地和 Flask 集成

1、flask-mail smtp服务器设置

	MAIL_SERVER     127.0.0.1   邮件服务器
	MAIL_PORT		25		电子邮件服务器的端口
	MAIL_USE_TLS	False	启用传输层安全协议
	MAIL_USE_SSL	False	启用安全套接层协议
	MAIL_USERNAME	None	邮件账户的用户名
	MAIL_PASSWORD	None	邮件账户的密码
	
	这一堆忘了没关系, 直接导入 from flask-mail  按ctrl+鼠标左键,然后查找 init_mail 

2、安装

安装 : pip install flask-mail
或者 : ide安装
		file --> settings --> project --> project interpreter --> 点+号 直接搜flask-mail安装

3、准备

     环境: windows 7  
	 python版本: 3.6
	 开发工具: pycharm

  配置文件中的密码帐号应直接保存在环境变量中,因为开源之后可能会暴露
	1、windows 环境变量
		set MAIL_USER="you@mail.com"
		set MAIL_PASSWD="youpassword"
	    查看 echo %MAIL_USER%
 
  2、linux环境变量
	  export MAIL_USER="you@mail.com"
	  export MAIL_PASSWD="youpassword"
	  查看 echo $MAIL_USER

3.1、先来一封简单邮件

目录结构:  conf.py  与 start.py 
1、conf.py配置
	from flask import Flask

	app = Flask(__name__)

	app.config['MAIL_SERVER'] = ""
	app.config['MAIL_PORT'] = 25
	app.config['MAIL_USE_TLS'] = True
	app.config["MAIL_USERNAME"] = os.environ.get('MAIL_USER')
	app.config["MAIL_PASSWORD"] = os.environ.get("MAIL_PASSWD")

2、start.py
	from conf import app
	from flask_mail import  Mail, Message

	mail = Mail(app)

	msg = Message("test subject", sender='you@mail.com',
								recipients=["要发送的邮箱@mail.com", ])      # 这里要注意 是列表

	msg.body = "test"
	msg.html = '<b> html </html> body'

	with app.app_context():
			mail.send(msg)

3、运行效果

  

4、各种错误码 可以查看: http://www.hb-163.com/uploads/soft/port-v2.0.HZ.pdf

3.2、web发送邮件

目录结构:   
 mail
		conf.py   
		mail_from.py
		send_mail.py
		start.py
	templates
	   base.html

3.2.#、安装

flask , flask_wtf,  flask_mail,  flask_bootstrap,  flask_moment

3.2.1、conf.py配置

from flask import Flask

	app = Flask(__name__)

	app.config['MAIL_SERVER'] = ""
	app.config['MAIL_PORT'] = 25
	app.config['MAIL_USE_TLS'] = True
	app.config["MAIL_USERNAME"] = os.environ.get('MAIL_USER')
	app.config["MAIL_PASSWORD"] = os.environ.get("MAIL_PASSWD")

3.2.2、mail_conf配置

	from wtforms import SubmitField, StringField
	from wtforms.validators import DataRequired
	from flask_wtf import FlaskForm


	# 需要导入 from flask_wtf import FlaskForm
	class NameForm(FlaskForm):
			mail_recpto = StringField('请输入收件人: ', validators=[DataRequired()] )
			mail_sub = StringField('请输入主题: ', validators=[DataRequired()] )
			mail_data = StringField('请输入内容: ', validators=[DataRequired()] )
			submit = SubmitField('发送邮件')

3.2.3、send_mail配置

# 用于邮件发送使用
from flask_mail import Mail,Message
from conf import app

# 初始化
mail = Mail(app)


# 在界面上接收三个参数,主题,收件人,内容
def mail_form(subject,recpto,data):
    lirecp=[]
    lirecp.append(recpto)
    msg = Message(subject, sender=app.config["MAIL_USERNAME"],
                  recipients=lirecp)

    msg.body = "test"
    msg.html = '<b> %s </html>' %(data)

		# 激活上下文,然后发送邮件 
    with app.app_context():
        mail.send(msg)

3.2.4、start.py配置

  # 导入发送以及app参数
	from send_mail import mail_form, app
	# 重定向、url跳转、模板
	from flask import render_template, redirect, url_for
	from flask_bootstrap import Bootstrap
	from flask_moment import Moment

	# 初始化bootstrap
	bootstrap = Bootstrap(app)
	moment = Moment(app)

	# 导入邮件发送的类
	from mail_from import NameForm


	# 路由函数
	@app.route('/', methods=['GET', 'POST'])
	# 视图函数
	def index():
			mail_addr = None
			form = NameForm()
			# 当有点击事件的时候获取参数
			if form.validate_on_submit():
					print("form: ",form.data)
					# 获取输入的三个参数
					mail_recpto = form.mail_recpto.data
					mail_sub = form.mail_sub.data
					mail_data = form.mail_data.data
					# 这里就回到了邮件发送的Py文件
					mail_form(mail_sub, mail_recpto, mail_data)
					# 发完之后强制让它再次回到主页上
					return redirect(url_for('index'))
			return render_template('base.html', form = form)


	if __name__ == '__main__':
			app.run(debug=True)

3.2.5、base.html

  来源于flask web开发一书

{% extends "bootstrap/base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}mail{% endblock %}

{% block head %}
{{ super() }}
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}" type="image/x-icon">
<link rel="icon" href="{{ url_for('static', filename='favicon.ico') }}" type="image/x-icon">
{% endblock %}

{% block navbar %}
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
        </div>
    </div>
</div>
{{ wtf.quick_form(form) }}
{% endblock %}

{% block scripts %}
{{ super() }}
{{ moment.include_moment() }}
{% endblock %}

3.2.6、最终效果

3.2.7、参考资料

   form表单form表单提交方式jinja2模板