2016-07-22 116 views
0

我决定按照本教程(https://www.boxcontrol.net/adding-contact-form-to-your-site-using-flask-and-python3.html)创建不同类型的表单,用户输入其个人信息并将提交的表单通过电子邮件发送给我的G-mail帐户。然而,在提交表格后,我收不到电子邮件或错误。

我做的第一件事就是创建ContactForm类。用户提交表单时不发送电子邮件的Flask-WTF表单

from flask_wtf import Form 
from wtforms import TextField, TextAreaField, SubmitField 
from wtforms.validators import InputRequired 

class ContactForm(Form): 
    name = TextField("Fullname", validators=[InputRequired('Please enter your name.')]) 
    email = TextField("Email", validators=[InputRequired("Please enter your email address.")]) 
    NoChildren = TextField("Number of children dependants (if applicable):", validators=[InputRequired("Please enter a subject.")]) 
    NoAdults = TextField("Number of adult dependants (if applicable):", validators=[InputRequired("Please enter a subject.")]) 
    travel = TextField("Will you be travelling alone?", validators=[InputRequired("Please enter a subject.")]) 
    marriage = TextField("What is your marital status?", validators=[InputRequired("Please enter a subject.")]) 
    nation = TextField("Current nationality(ies):", validators=[InputRequired("Please enter a subject.")]) 
    dob = TextField("Date of birth:", validators=[InputRequired("Please enter a subject.")]) 
    phone = TextField("Phone number:", validators=[InputRequired("Please enter a subject.")]) 
    nonukaddress = TextField("Your current non-UK address:", validators=[InputRequired("Please enter a subject.")]) 
    ukaddress = TextField("UK address:", validators=[InputRequired("Please enter a subject.")]) 
    history = TextField("Do you have any criminal history?", validators=[InputRequired("Please enter a subject.")]) 
    hadvisa = TextField("Have you ever had any other visas?", validators=[InputRequired("Please enter a subject.")]) 
    refusevisa = TextField("Have you been refused a visa before?", validators=[InputRequired("Please enter a subject.")]) 
    medical = TextField("Did you receive any medical treatment in the UK?", validators=[InputRequired("Please enter a subject.")]) 
    letter = TextField("Do you have a letter from a UK regulated financial institution confirming that original evidence of funds has been supplied?", validators=[InputRequired("Please enter a subject.")]) 
    sole = TextField("Are you the sole owner of the money?", validators=[InputRequired("Please enter a subject.")]) 
    additional = TextAreaField("Additional information/questions/requests:", validators=[InputRequired("Please enter a message.")]) 
    submit = SubmitField("Send") 

然后我为我的表单创建了HTML模板。

{% block content %} 
    <h2>Contact</h2> 

    {% if success %} 
    <p>Thank you for your message. We'll get back to you shortly.</p> 

    {% else %} 
    {% for message in form.name.errors %} 
     <div class="flash">{{ message }}</div> 
    {% endfor %} 

    {% for message in form.email.errors %} 
     <div class="flash">{{ message }}</div> 
    {% endfor %} 

    <form action="{{ url_for('contact') }}" method=post> 
     {{ form.hidden_tag() }} 

     {{ form.name.label }} 
     {{ form.name }} 

     {{ form.email.label }} 
     {{ form.email }} 

     {{ form.NoChildren.label }} 
     {{ form.NoChildren }} 

     {{ form.travel.label }} 
     {{ form.travel }} 

     {{ form.marriage.label }} 
     {{ form.marriage }} 

     {{ form.nation.label }} 
     {{ form.nation }} 

     {{ form.dob.label }} 
     {{ form.dob }} 

     {{ form.phone.label }} 
     {{ form.phone }} 

     {{ form.nonukaddress.label }} 
     {{ form.nonukaddress }} 

     {{ form.ukaddress.label }} 
     {{ form.ukaddress }} 

     {{ form.history.label }} 
     {{ form.history }} 

     {{ form.hadvisa.label }} 
     {{ form.hadvisa }} 

     {{ form.refusevisa.label }} 
     {{ form.refusevisa }} 

     {{ form.parents.label }} 
     {{ form.parents }} 

     {{ form.medical.label }} 
     {{ form.medical }} 

     {{ form.letter.label }} 
     {{ form.letter }} 

     {{ form.sole.label }} 
     {{ form.sole }} 

     {{ form.ukbank.label }} 
     {{ form.ukbank }} 

     {{ form.additional.label }} 
     {{ form.additional }} 

     {{ form.submit }} 
    </form> 
    {% endif %} 
{% endblock %} 

我的主烧瓶文件看起来像这样。

from flask import Flask, render_template, request, flash 
from forms import ContactForm 
from flask_mail import Message, Mail 
import os 

mail = Mail() 

app = Flask(__name__) 

app.secret_key = 'development key' 

app.config["MAIL_SERVER"] = "smtp.gmail.com" 
app.config["MAIL_PORT"] = 465 
app.config["MAIL_USE_SSL"] = True 
app.config["MAIL_USERNAME"] = '[email protected]' 
app.config["MAIL_PASSWORD"] = '*******' 

mail.init_app(app) 

@app.route('/') 
def index(): 
    return render_template('index.html') 


@app.route('/contact', methods=['GET', 'POST']) 
def contact(): 
    form = ContactForm() 

    if request.method == 'POST': 
    if form.validate() == False: 
     flash('All fields are required.') 
     return render_template('contact.html', form=form) 
    else: 
     msg = Message(form.subject.data, sender='[email protected]', recipients=['[email protected]']) 
     msg.body = """ 
     From:%s <%s>, 
      %s 
      """ % (form.name.data, form.email.data, form.message.data,form.NoChildren.data,form.travel.data,form.marriage.data, form.nation.data, form.dob.data, form.phone.data, form.nonukaddress.data, form.ukaddress.data, form.history.data, form.hadvisa.data, form.refusevisa.data, form.parents.data, form.medical.data, form.letter.data, form.sole.data, form.ukbank.data, form.additional.data) 
     mail.send(msg) 

     return render_template('contact.html', success=True) 

    elif request.method == 'GET': 
    return render_template('contact.html', form=form) 

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

回答

0

打破问题 - 目前你有很多运动部件。如果你没有得到一个错误,我最初的想法是你的电子邮件被发送到垃圾邮件。

如果您创建一个只发送静态电子邮件的新视图,它是否工作?

@app.route('/testemail') 
def send_test_email(): 
    msg = Message('Title',sender='[email protected]', recipients=['[email protected]']) 
    msg.body('Hello...') 
    mail.send(msg) 

如果再doesn't--你知道这个问题涉及到代码的电子邮件的一面,那么你就可以开始寻找到在Flask-Mail可用MAIL_DEBUG选项,检查垃圾邮件文件夹等

一般来说,您可能会发现使用像处理电子邮件递送服务那样的服务更容易且更可靠,而不是自己发送SMTP请求,使用其Python库将它们发送给您的电子邮件数据,然后由其他人处理。我个人使用Sendgrid,但有无数的公司提供类似的服务。

0

如果您没有收到任何错误并且没有发送电子邮件,请设置MAIL_DEBUG=True。 Flask-Mail使用smtplib模块,它可以调试set调试级别。在初始化邮件之前,请尝试更新config

app = Flask(__name__) 

app.config.update(dict(
    DEBUG = True, 
    MAIL_SERVER = 'smtp.gmail.com', 
    MAIL_PORT = 587, 
    MAIL_USE_TLS = True, 
    MAIL_USE_SSL = False, 
    MAIL_USERNAME = '[email protected]', 
    MAIL_PASSWORD = 'my_password', 
)) 

mail = Mail(app) 

请参阅this