Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Enviar Email desde Django

Estas en el tema de Enviar Email desde Django en el foro de Python en Foros del Web. Hola, estoy intentando enviar un email desde un formulario en Django pero algo falla He visto que Django tiene dos funciones para enviar emails: send_email ...
  #1 (permalink)  
Antiguo 18/08/2014, 14:29
Avatar de kojicomics  
Fecha de Ingreso: junio-2013
Mensajes: 49
Antigüedad: 10 años, 10 meses
Puntos: 1
Enviar Email desde Django

Hola, estoy intentando enviar un email desde un formulario en Django pero algo falla

He visto que Django tiene dos funciones para enviar emails: send_email y EmailMessage.

Al parecer la segunda es más actual y permite más funciones, pero he probado con ambas y ninguna me ha funcionado

Los ficheros que utilizo son los siguientes:

"apps/contact/forms.py"
Código Python:
Ver original
  1. from django import forms
  2.  
  3.  
  4. class ContactForm(forms.Form):
  5.     subject = forms.CharField(max_length=100)
  6.     message = forms.CharField(widget=forms.Textarea)
  7.     sender = forms.EmailField()
  8.     cc_myself = forms.BooleanField(required=False)

"apps/contact/urls.py"
Código Python:
Ver original
  1. from django.conf.urls import patterns, include, url
  2. from .views import *
  3.  
  4.  
  5. urlpatterns = patterns('',
  6.     url(r'^$', ContactFormView.as_view(), name='contact'),
  7.     )

"apps/contact/views.py"
Código Python:
Ver original
  1. from django.views.generic import FormView
  2. from django.core.mail import EmailMessage
  3. from django.core.urlresolvers import reverse_lazy
  4. from .forms import ContactForm
  5.  
  6.  
  7. class ContactFormView(FormView):
  8.     template_name = 'contact/form.html'
  9.     form_class = ContactForm
  10.     success_url = reverse_lazy('contact')
  11.  
  12.     def form_valid(self, form):
  13.         subject = form.cleaned_data['subject']
  14.         message = form.cleaned_data['message']
  15.         sender = form.cleaned_data['sender']
  16.         recipients = ['[email protected]']
  17.         cc_myself = form.cleaned_data['cc_myself']
  18.  
  19.         if cc_myself:
  20.             recipients.append(sender)
  21.  
  22.         mail = EmailMessage(subject, message, sender, recipients)
  23.  
  24.         mail.send()
  25.  
  26.         return super(ContactFormView, self).form_valid(form)

"templates/contact/form.html"
Código Python:
Ver original
  1. {% extends 'general/base.html' %}
  2. {% load i18n %}
  3.  
  4. {% block head %}Contacta{% endblock %}
  5.  
  6. {% block title %} Contacta {% endblock %}
  7.  
  8. {% block content %}
  9.     <div class="form-div">
  10.         <form action="/contact/" method='POST'>
  11.         {% csrf_token %}
  12.             {% for field in form %}
  13.                 {% ifequal field.name "subject" %}
  14.                     <input id="id_subject" type="text" name="subject" placeholder="{% trans 'Subject' %}"/>
  15.                 {% else %}{% ifequal field.name "message" %}
  16.                     <textarea id="id_message" rows="5" cols="40" placeholder="{% trans 'Message' %}"></textarea>
  17.                 {% else %}{% ifequal field.name "sender" %}
  18.                     <input id ="id_sender" type="email" name="sender" placeholder="{% trans 'Email' %}"/>
  19.                 {% else %}{% ifequal field.name "cc_myself" %}
  20.                     <div class="checkbox">
  21.                         <input id="id_cc_myself" type="checkbox" name="cc_myself" />
  22.                         <label for="id_cc_myself">{% trans 'CC Myself' %}</label>
  23.                     </div>
  24.                 {% else %}{{ field }}
  25.                 {% endifequal %}{% endifequal %}{% endifequal %}{% endifequal %}
  26.             {% endfor %}
  27.             <p class="submit">
  28.                 <input type="submit" name="mail" class="button" value="{% trans 'Send' %}" />
  29.             </p>
  30.         </form>
  31.     </div>
  32. {% endblock %}

"settings.py"
Código Python:
Ver original
  1. EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
  2. EMAIL_HOST = 'smtp.gmail.com'
  3. EMAIL_PORT = 587
  4. EMAIL_HOST_USER = '[email protected]'
  5. EMAIL_HOST_PASSWORD = 'pass'
  6. EMAIL_USE_TLS = True

He probado a enviarlo desde consola mediante "python manage.py shell" y ha funcionado correctamente

¿Alguna idea?

Gracias
  #2 (permalink)  
Antiguo 18/08/2014, 14:45
Avatar de kojicomics  
Fecha de Ingreso: junio-2013
Mensajes: 49
Antigüedad: 10 años, 10 meses
Puntos: 1
Respuesta: Enviar Email desde Django

Ya está corregido, me faltaba especificar el atributo name del textarea en el form.html... :|

De todas formas dejo el post abierto por si a alguien le interesa utilizar el código

Aprovecho para consultar un problema que surge al enviar el correo, y es que por defecto Gmail rechaza la conexión diciendo que la aplicación utiliza una tecnología de inicio de sesión no segura y por tanto debo deshabilitar la protección contra logeos inseguros

Por razones de seguridad me gustaría dejar habilitada la protección de Gmail, por tanto, ¿Es posible realizar la conexión de forma segura mediante Django?

Un saludo
  #3 (permalink)  
Antiguo 18/08/2014, 15:18
Avatar de kojicomics  
Fecha de Ingreso: junio-2013
Mensajes: 49
Antigüedad: 10 años, 10 meses
Puntos: 1
Respuesta: Enviar Email desde Django

Cita:
Iniciado por kojicomics Ver Mensaje
Gmail rechaza la conexión diciendo que la aplicación utiliza una tecnología de inicio de sesión no segura y por tanto debo deshabilitar la protección contra logeos inseguros

Por razones de seguridad me gustaría dejar habilitada la protección de Gmail, por tanto, ¿Es posible realizar la conexión de forma segura mediante Django?
En la docuementación: Sending email recomiendan alternar entre las variables EMAIL_USE_TLS (puerto 587) y EMAIL_USE_SSL (puerto 465) en caso de que una falle, pero con la conexión SSL el mensaje ni siquiera se envía

He encontrado un backend específico para conexiones smtp por SSL: django-smtp-ssl pero aunque sí envía el correo, al igual que con TLS Gmail me informa de que no es segura

Seguiré intentándolo

Saludos

Etiquetas: correo, django
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:52.