Flask 邮件

264 阅读2分钟

邮件样例模板:

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是否使用STARTTLSFalse
MAIL_SSL是否使用SSL/TLSFlase
MAIL_USERNAME发信服务器得用户名None
MAIL_PASSWORD发信服务器得密码None
MAIL_DEFAULT_SENDER默认得发信人None
  1. SSL/TLS加密
MAIL_USE_SSL = True
MAIL_PORT = 465
  1. STARTTLS 加密
MAIL_USE_TLS = True
MAIL_PORT = 587

→ 当不对邮件进行加密时,邮件服务器的端口使用默认25端口。

常用SMTP服务提供配置

电子邮件服务提供商MAIL_SERVER(发信服务器)MAIL_USERNAMEMAIL_PASSWORD额外步骤
Gmailsmtp.gmail.com邮箱地址邮箱密码开启”Allow less seecure apps“,在本地设置VPN代理
QQ邮箱smtp.qq.com邮箱地址授权码开启SMTP服务并获取授权码
新浪邮箱smtp..com邮箱地址邮箱密码开启SMTP服务
163邮箱smtp..com邮箱地址授权码开启SMTP服务并设置授权码
Outlook/Hotmailsmtp..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)

app.py

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 %}