почта не отправляется приложением django-contact-form и нет сообщения об ошибке

Я установил это приложение django-contact-form. Когда я хочу отправить электронное письмо на свою учетную запись gmail через контактную форму, я не получаю сообщения об ошибке, и меня перенаправляют на мой contact_form_sent.html, но письмо не отправляется. Может ли кто-нибудь помочь мне в отладке этой проблемы. Это проблема smtp-сервера, потому что я тестирую с локального хоста???

Мои настройки следующие: они аналогичны Patrick Beeson. :

settings.py Я уже проверил другие учетные записи электронной почты и их соответствующие порты.

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
      #('***', '***@googlemail.com'),
)

MANAGERS = ADMINS

EMAIL_HOST = 'smtp.gmail.com'   
EMAIL_HOST_PASSWORD = '********'  
EMAIL_HOST_USER = '******@googlemail.com' 
EMAIL_PORT = 587 #465 or 587  
#EMAIL_SUBJECT_PREFIX = 'Django Test mail'  
EMAIL_USE_TLS = True  

urls.py

(r'^contact/', include('contact_form.urls')),

contact_form.html

...
              <form method="POST">
              <ol>
              {{ form.as_p }}
              <li>
          <input type="submit" name="submit" value={% trans "Senden" %} />
                <div class="clr"></div>
              </li>
              </ol>
              </form>
...

contact_form.txt

{{ name }}
{{ email }}
{{ body }}

contact_form_sent.html

{% block content %}
           <h2>{% trans "Your message was sent." %}</h2>
{% endblock %}

contact_form_subject.txt

message from {{ name }}

ОТРЕДАКТИРОВАНО

при настройке action="." в моем contact_form.html и добавлении print request.POST я получаю это на своем сервере разработки на локальном хосте после нажатия кнопки отправки:

<QueryDict: {u'body': [u'This is my Test message for you !!\r\n\r\nBest Regards\r\nMr. NoOne'], u'name': [u'testname'], u'submit': [u'Send'], u'email': [u'anyone@myemail.
com']}>

ОТРЕДАКТИРОВАНО

Если я пишу свой собственный view.py, я получаю эту ошибку:

Request Method:     POST
Request URL:    http://127.0.0.1:8000/en/contact/
Exception Type:     error
Exception Value:    

(10065, 'No route to host')

Exception Location:     C:\Python25\lib\smtplib.py in connect, line 310
Python Executable:  C:\Python25\python.exe
Python Version:     2.5.0
Python Path:    ['H:\\webpage', 'C:\\WINDOWS\\system32\\python25.zip', 'C:\\Python25\\DLLs', 'C:\\Python25\\lib', 'C:\\Python25\\lib\\plat-win', 'C:\\Python25\\lib\\lib-tk', 'C:\\Python25', 'C:\\Python25\\lib\\site-packages']

мой новый собственный views.py выглядит так:

from django.conf import settings
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.core.mail import send_mail

from contact_form.forms import ContactForm


def email_contact(request, form_class=ContactForm, template_name='contact_form/contact_form.html'):
    form = form_class(data=request.POST, files=request.FILES, request=request)
    if request.method == "POST":
        send_mail('Subject here', 'Here is the message.', '[email protected]', ['[email protected]'], fail_silently=False)
        print request.POST
    return render_to_response(template_name, { 'form': form }, context_instance=RequestContext(request))

Что здесь происходит не так?


person saeed    schedule 06.01.2011    source источник


Ответы (2)


Вы уверены, что форма вообще отправляется? Потому что, если вы отправляете форму с отладкой true и в вашей форме нет токена csrf, Django должен выдать ошибку. Другая идея; вы обращаетесь к smtp.gmail.com, но используете адрес @googlemail.com. Вы уверены, что справляется?

РЕДАКТИРОВАТЬ

Я сделал это по-другому; вместо использования существующего приложения я создаю новое. Мое приложение должно было делать больше, чем просто рассылка. И это всего два файла, так что должно помочь. Я тоже пользовался gmail, еще один плюс:) Я дам вам соответствующий код, но вырежьте лишнее, так что следите за ним;)

настройки.py:

from local import localsettings

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    ('Jasper Kennis', '[email protected]'),
)

MANAGERS = ADMINS

DATABASES = {
    'default': {
        'ENGINE': localsettings.db_engine,
        'NAME': localsettings.db_name,
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    }
}

SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True

# Make this unique, and don't share it with anybody.
SECRET_KEY = '###'

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)


INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.admin',
        'therelevantapp',
)


EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = '###@gmail.com'
EMAIL_HOST_PASSWORD = '###'
EMAIL_PORT = 587

и приложение, app/views.py

import os
import os.path
import string
from random import choice

from app.models import *
from TitelGenerator.TitelGenerator import TitelGenerator
from django import forms
from django.conf import settings
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.core.mail import send_mail
from django.core.mail import EmailMultiAlternatives



def klaar(request):
    if request.method == "POST":
        title = 'Je inschrijving is voltooid!'
        message = 'a whole message'
        send_mail( title , message , 'sendermail' , 'receivermail' ,     fail_silently=False)

        return render_to_response('klaar.html' , { 'titel': kind.id, 'request':     request.FILES }, context_instance = RequestContext(request))

Обратите внимание, что вам ДЕЙСТВИТЕЛЬНО НУЖНО иметь {% csrf_token %} внутри вашей формы. Шаблон формы в этом случае вам придется создавать самостоятельно. Дайте мне знать, если это помогло.

person Jasper Kennis    schedule 06.01.2011
comment
Я проверил это с помощью smtp.googlemail.com, но все еще та же проблема. Есть ли способ отладить? - person saeed; 06.01.2011
comment
Я знаю, что когда-то у меня были похожие проблемы. Я надеюсь, что у меня все еще есть репо, позвольте мне поискать его для вас. - person Jasper Kennis; 06.01.2011
comment
Я был бы признателен за любую помощь, потому что я схожу с ума, и сообщение об ошибке не предоставляется. Это как игра в угадайку. - person saeed; 06.01.2011
comment
Вы вставили свое решение сюда? Я ничего не вижу? - person saeed; 06.01.2011
comment
Поместите action= (или action =.) в html-тег формы и напечатайте request.POST в своем представлении, чтобы убедиться, что форма действительно работает. - person Steve Jalim; 06.01.2011
comment
@ Джаспер Кеннис: Я попробую решение с моим собственным приложением и расскажу вам о результатах. - person saeed; 06.01.2011
comment
@ stevejalim: я отредактировал свой вопрос с вашей помощью по отладке относительно отправки формы. - person saeed; 06.01.2011
comment
У Стивжалима есть действительно хорошая идея, где ваш атрибут действия? - person Jasper Kennis; 06.01.2011
comment
Даже с таким атрибутом действия, как ‹form action=/sent/ method=post›, электронное письмо не отправляется, хотя и перенаправляет вас на страницу отправки. - person saeed; 06.01.2011
comment
Какое действие в каком представлении отображает отправленную страницу? Попробуйте вывести туда объект запроса. Данные формы должны быть в request.POST или что-то в этом роде, если это не так, форма не отправляет свою информацию. В противном случае проблема где-то в представлении. - person Jasper Kennis; 06.01.2011
comment
Я написал свой собственный view.py и получил значение исключения: (10065, «Нет маршрута к хосту») Местоположение исключения: C:\Python25\lib\smtplib.py в соединении, строка 310 - person saeed; 06.01.2011
comment
Извините, что заставил вас ждать;) Для меня это не похоже на ошибку Django (хотя мои навыки django запылились). Небольшой гугл выдал мне такой интересный результат: ubuntuforums.org/showthread.php?t=75621 Это может быть просто проблема с брандмауэром, проверьте, открыт ли порт;) По крайней мере, тот факт, что вы получаете эти данные в request.POST, означает, что ваша форма действительно отправляет данные, поэтому проблема действительно заключается в почтовом действии. Кроме того, но совершенно не по теме, было бы неплохо обновиться до python 2.7. - person Jasper Kennis; 07.01.2011
comment
БУДЬТЕ ОСТОРОЖНЫ, возможно, вам нужно открыть исходящую связь только на тех портах, которые вы хотите использовать. Вероятно. Это действительно не моя область, но вы не должны просто открывать случайные порты;) - person Jasper Kennis; 07.01.2011
comment
Извините за поздний ответ и спасибо за помощь охотно. Проблема с smtplib.py заключалась в том, что в settings.py имя и адрес электронной почты должны быть указаны для ADMINS. Но, наконец, это работает после переустановки приложения django-contact-form. Я также удаляю файл яйца и папку django-contact-form перед повторной установкой. Поэтому я объявляю вашу конфигурацию ответом. - person saeed; 19.01.2011
comment
Это отстой... Я даже не думал, что проблема в этом. Я благодарю вас за представителей (теперь я могу комментировать везде, woohoo), но действительно ли мой ответ помог вам здесь? Думаю, нет... Рад, что у вас все получилось :) Я действительно нашел систему рассылки Django немного сложной по сравнению с остальной частью Django. - person Jasper Kennis; 20.01.2011

убедитесь, что ваши настройки ADMIN, MANAGERS в вашем settings.py доступны, потому что он ищет эти электронные письма

в form.py из contact_form

class BaseEmailFormMixin(object):
    from_email = settings.DEFAULT_FROM_EMAIL
    recipient_list = [email for _, email in settings.MANAGERS]

еще раз убедитесь, что вы установили настройку хоста порта электронной почты в настройках settings.py

EMAIL_HOST = 'yourmailserver'
EMAIL_PORT = "587"
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_USE_TLS = True
person soField    schedule 07.03.2012