1

我正在使用 Flask 和 Flask-Mail 构建一个简单的联系页面。我按照本教程构建了应用程序 -添加联系页面- 现在,当我尝试发送消息时,我收到了错误gaierror: [Errno -2] Name or service not known。我一直在谷歌上搜索错误,但在网上找不到任何类似的例子。我什至无法弄清楚它找不到什么名称或服务。

回溯页面将让我展开一行并执行一些 Python 代码。它提供了一个dump()函数,可以显示所有变量,如果有帮助,可以在对象上调用以查看它们的信息。

路线.py:

from forms import ContactForm
from flask.ext.mail import Message, Mail


mail = Mail()
app = Flask(__name__)


app.secret_key = 'development key'

app.config['MAIL_SERVER'] = 'smtp.google.com'
app.config['MAIL_PORT'] = 465
app.config['MAIL_USE_SSL'] = True
app.config['MAIL_USERNAME'] = 'email'
app.config['MAIL_PASSWORD'] = 'email'

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

    if request.method == 'POST':
        if not form.validate():

表格:

from flask.ext.wtf import Form, validators
from wtforms.fields import TextField, TextAreaField, SubmitField
import wtforms


class ContactForm(Form):
    name = TextField("Name", [wtforms.validators.Required('Please enter your name')])
    email = TextField("Email", [wtforms.validators.Required('Please enter your email'), wtforms.validators.Email()])
    subject = TextField("Subject", [wtforms.validators.Required('Please enter a subject')])
    message = TextAreaField("Message", [wtforms.validators.Required('Please enter a message')])
    submit = SubmitField("Send")
            flash('All fields are required.')
            return render_template('contact.html', form=form)
        else:
            msg = Message(form.subject.data, sender='imauld@gmail.com', recipients=['imauld@gmail.com'])
            msg.body = """From: %s <%s> %s""" % (form.name.data, form.email.data, form.message.data)
            mail.send(msg)
            return render_template('contact.html', success=True)
    elif request.method == 'GET':
        return render_template('contact.html', form=form)

回溯:

File "/home/ian/PycharmProjects/flaskapp/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__

return self.wsgi_app(environ, start_response)

File "/home/ian/PycharmProjects/flaskapp/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app

response = self.make_response(self.handle_exception(e))

File "/home/ian/PycharmProjects/flaskapp/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception

reraise(exc_type, exc_value, tb)

File "/home/ian/PycharmProjects/flaskapp/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app

response = self.full_dispatch_request()

File "/home/ian/PycharmProjects/flaskapp/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request

rv = self.handle_user_exception(e)

File "/home/ian/PycharmProjects/flaskapp/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception

reraise(exc_type, exc_value, tb)

File "/home/ian/PycharmProjects/flaskapp/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request

rv = self.dispatch_request()

File "/home/ian/PycharmProjects/flaskapp/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request

return self.view_functions[rule.endpoint](**req.view_args)

File "/home/ian/PycharmProjects/flaskapp/app/routes.py", line 39, in contact

mail.send(msg)

File "/home/ian/PycharmProjects/flaskapp/lib/python2.7/site-packages/flask_mail.py", line 415, in send

with self.connect() as connection:

File "/home/ian/PycharmProjects/flaskapp/lib/python2.7/site-packages/flask_mail.py", line 123, in __enter__

self.host = self.configure_host()

File "/home/ian/PycharmProjects/flaskapp/lib/python2.7/site-packages/flask_mail.py", line 135, in configure_host

host = smtplib.SMTP_SSL(self.mail.server, self.mail.port)

File "/usr/lib/python2.7/smtplib.py", line 776, in __init__

SMTP.__init__(self, host, port, local_hostname, timeout)

File "/usr/lib/python2.7/smtplib.py", line 249, in __init__

(code, msg) = self.connect(host, port)

File "/usr/lib/python2.7/smtplib.py", line 309, in connect

self.sock = self._get_socket(host, port, self.timeout)

File "/usr/lib/python2.7/smtplib.py", line 781, in _get_socket

new_socket = socket.create_connection((host, port), timeout)

File "/usr/lib/python2.7/socket.py", line 553, in create_connection

for res in getaddrinfo(host, port, 0, SOCK_STREAM):

gaierror: [Errno -2] Name or service not known
4

2 回答 2

1

我在这里的第一次尝试,但只是挑选出我能看到的东西。我假设您已经从每个文件中复制了整个代码。如我错了请纠正我。

确保 routes.py 从烧瓶中导入必要的类(“请求”对于提交表单是必不可少的,因为它确定请求方法是 GET 还是 POST:

from flask import Flask, render_template, request, flash

还有您的 Forms.py... 注意:您实际上不需要导入整个 wtforms 模块...

from flask.ext.wtf import Form
from wtforms import TextField, SubmitField, TextAreaField, validators, ValidationError

在您的 routes.py 代码中有一个不必要的布尔运算符 if "not" 语句:

if request.method == 'POST':
    if not form.validate():

它应该包含比较运算符和布尔值,就像在 Lalith 的 Post中一样:

if form.validate() == False:
    flash("All fields...

您的 forms.py 不应包含以下任何内容:

flash('All fields are required.')
        return render_template('contact.html', form=form)
    else:
        msg = Message(form.subject.data, sender='imauld@gmail.com', recipients=['imauld@gmail.com'])
        msg.body = """From: %s <%s> %s""" % (form.name.data, form.email.data, form.message.data)
        mail.send(msg)
        return render_template('contact.html', success=True)
elif request.method == 'GET':
    return render_template('contact.html', form=form)

它应该全部包含在 routes.py 中的联系函数中,如下所示:

def contact():
form = ContactForm()

if request.method == 'POST':
    if not form.validate():
        flash('All fields are required.')
        return render_template('contact.html', form=form)
    else:
        msg = Message(form.subject.data, sender='imauld@gmail.com', recipients=['imauld@gmail.com'])
        msg.body = """From: %s <%s> %s""" % (form.name.data, form.email.data, form.message.data)
        mail.send(msg)
        return render_template('contact.html', success=True)
elif request.method == 'GET':
    return render_template('contact.html', form=form)

最后我知道这可能看起来很明显,但请确保在此处将“电子邮件”替换为您的真实电子邮件和密码:

app.config['MAIL_USERNAME'] = 'email' 
app.config['MAIL_PASSWORD'] = 'email'

祝你好运。希望这可以帮助。

于 2014-02-12T03:33:52.593 回答
0

好的。我知道这个问题已有 4 年历史,但这是我的解决方案。有一个BUG。您只需要在 app.config.from_object 之后将配置参数添加到烧瓶应用程序中。

from config import config
app.config.from_object(config[config_name])
config[config_name].init_app(app)
app.config.update( DEBUG=True, MAIL_SERVER='smtp.gmail.com',
                   MAIL_PORT=587, MAIL_USE_SSL=False, MAIL_USE_TLS=True, MAIL_USERNAME = 'your@gmail.com')

在 config.py 我有这两个参数:

MAIL_PASSWORD = 'password'
MAIL_DEFAULT_SENDER = 'your@gmail.com'
# IMPORTANT - the rest of the mail parameters are set inside the __init__.py because they don't work here -> BUG

如果有人有时间找出哪些参数不适用于 app.config.from_object( .. ),他可以添加其他答案。

并且不要忘记切换谷歌安全以接受不太安全的应用程序。否则它将无法正常工作。问候

于 2018-05-29T12:27:32.360 回答