邮件样例模板:
from flask_mail import Mail,Message
# 方式1
# app.config['MAIL_SERVER'] = 'smtp.qq.com'
# app.config['MAIL_PORT'] = 25
# app.config['MAIL_USE_TLS'] = True
# app.config['MAIL_USE_SSL'] = False
# app.config['MAIL_USERNAME'] = "1319817190@qq.com"
# app.config['MAIL_PASSWORD'] = "hrjtfhaxldflhiei"
# 方式2
app.config.update(
DEBUG = True,
MAIL_SERVER = 'smtp.qq.com',
MAIL_PORT = 25,
MAIL_USE_TLS = True,
MAIL_USE_SSL = False,
MAIL_USERNAME = '1319817190@qq.com',
MAIL_PASSWORD = 'hrjtfhaxldflhiei',
MAIL_DEBUG = True
)
mail = Mail(app)
@app.route("/mail_test")
def mail_test():
msg = Message('Hello', sender = '1319817190@qq.com', recipients = ['1319817190@qq.com'])
msg.body = "Hello Flask message sent from Flask-Mail"
mail.send(msg)
return "Sent"
使用Flask-Mail发送电子邮件
pip install flask-mail
from flask import flask-mail
app = Flask(__name__)
mail = Mail(app)
Flask-Mail的常用配置
| 配置键 | 说明 | 默认值 |
|---|---|---|
| MAIL_SERVER | 用于发送邮件得SMTP服务器 | localhost |
| MAIL_PORT | 发信端口 | 25 |
| MAIL_USE_TLS | 是否使用STARTTLS | False |
| MAIL_SSL | 是否使用SSL/TLS | Flase |
| MAIL_USERNAME | 发信服务器得用户名 | None |
| MAIL_PASSWORD | 发信服务器得密码 | None |
| MAIL_DEFAULT_SENDER | 默认得发信人 | None |
- SSL/TLS加密
MAIL_USE_SSL = True
MAIL_PORT = 465
- STARTTLS 加密
MAIL_USE_TLS = True
MAIL_PORT = 587
→ 当不对邮件进行加密时,邮件服务器的端口使用默认25端口。
常用SMTP服务提供配置
| 电子邮件服务提供商 | MAIL_SERVER(发信服务器) | MAIL_USERNAME | MAIL_PASSWORD | 额外步骤 |
|---|---|---|---|---|
| Gmail | smtp.gmail.com | 邮箱地址 | 邮箱密码 | 开启”Allow less seecure apps“,在本地设置VPN代理 |
| QQ邮箱 | smtp.qq.com | 邮箱地址 | 授权码 | 开启SMTP服务并获取授权码 |
| 新浪邮箱 | smtp..com | 邮箱地址 | 邮箱密码 | 开启SMTP服务 |
| 163邮箱 | smtp..com | 邮箱地址 | 授权码 | 开启SMTP服务并设置授权码 |
| Outlook/Hotmail | smtp..com | 邮箱地址 | 邮箱密码 | 无 |
进行配置:
app.config.update(
DEBUG = True,
MAIL_SERVER = 'smtp.qq.com',
MAIL_PORT = 25,
MAIL_USE_TLS = True,
MAIL_USE_SSL = False,
MAIL_USERNAME = '1319817190@qq.com',
MAIL_PASSWORD = 'hrjtfhaxldflhiei',
MAIL_DEBUG = True
)
# 设置默认发信人
MAIL_DEFAULT_SENDER = ("Your name","test@qq.com")
MAIL_DEFAULT_SENDER = ("Your name",os.getenv('MAIL_USERNAME'))
MAIL_DEFAULT_SENDER = "Your name<test@qq.com>"
构建邮件数据
from flask_mail import Message
message = Message(
subject = "Hello World!", # 邮件标题
recipents = ['Your name<test@qq.com>'], # 收信人
body = "Hello world , welcome to my home!" # 邮件正文
)
发送邮件
mail.send(message)
通用发送邮件模板
from flask_mail import Mail,Message
mail = Mail(app)
def senf_mail(subject, to, body):
message = Message(subject, recipients = [to], body = body)
mail.send(message)
在视图函数中使用
@app.route('/subscribe', methods = ['GET','POST'])
def subscribe():
form = Subscribe()
if form.validate_on_submit():
email = form.email.data
flask("welcome on board")
send_mail("Subscribe Success",email, "Hello, thank you for subscribing Flask Weekly!")
return redirect(url_for('index'))
return render_template('index.html', form=form)
def send_mail(subject, to ,body):
message = Message(subject, recipients =[to], body = body)
mail.send(message)
from wtforms.validators import DataRequired, Length, ValidationError, Email
class SubscribeForm(FlaskForm):
email = StringField("Email", validators = [DataRequired(), Email()])
body = TextAreaField("Body", validators = [DataRequired(), Length(8, 200)])
submited = SubmitField()
@app.route("/index_mail")
def index_mail():
return render_template("index_mail.html")
@app.route('/subscribe', methods=['GET',"POST"])
def subscribe():
form = SubscribeForm()
print("进入了邮件的方法!")
if form.validate_on_submit():
email = form.email.data
body = form.body.data
print("email ===> ",email)
flash("我过来了!")
send_mail("Hello World", email, body = body)
return redirect(url_for('index_mail'))
return render_template('subscribe.html', form = form)
subscribe.html
{% extends "base.html" %}
{% block content %}
<form method="post" >
** ****{{ form.csrf_token }}**
{{ form.email.label }}: {{ form.email }}<br/>
{{ form.body }}<br/>
{{ form.submited }}
</form>
{% endblock %}