2014-01-08 73 views
0

我正在使用Flask和Flask-Mail建立一個簡單的聯繫頁面。我構建了本教程後的應用程序 - Add a contact page - 現在,當我嘗試發送消息時,我收到了錯誤gaierror: [Errno -2] Name or service not known。我一直在搜索錯誤一段時間,找不到任何類似的例子。我甚至無法弄清楚它找不到什麼名字或服務。用Flask-Mail發送郵件 - socket.gaierror

回溯頁面讓我展開一行並執行一些Python代碼。它提供了一個dump()函數,它將向我顯示所有變量,並且可以在對象上調用以查看它們的信息是否有用。

routes.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='[email protected]', recipients=['[email protected]']) 
      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 

回答

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 request.method == 'POST': 
    if not form.validate(): 

應該包含一個比較運營商和布爾,因爲它是在Lalith's 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='[email protected]', recipients=['[email protected]']) 
     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='[email protected]', recipients=['[email protected]']) 
     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' 

祝您好運。希望這可以幫助。