Ir al contenido principal

Recibir y simular correo en Google App Engine con Python

Para los que usan Google App Engine, tal vez necesiten alguna vez recibir/leer correos electronicos dirigidos a la aplicación, y simular los mismos durante la fase de desarrollo.

Como lenguaje de programación estoy usando Python (recordar que IMAP no se puede usar desde una aplicación GAE)

Bien, por defecto, la aplicación no recibirá mensajes de correo electronico, para activar este servicio, hay que configurar el archivo app.yaml de la siguiente manera:

Archivo APP.YAML


inbound_services:
- mail

En este archivo, también hay que definir cuales son las direcciones de email con las que nuestra aplicación "se mantendrá a la escucha":

- url: /_ah/mail/users@appid\.appspotmail\.com
  script: libraries/users_mail.py
  login: admin

- url: /_ah/mail/webmaster@appid\.appspotmail\.com
  script: libraries/webmaster_mail.py
  login: admin

- url: /_ah/mail/.+
  script: libraries/others_mail.py
  login: admin

Donde appid es el nombre de nuestra aplicación.

La última url /_ah/mail/.+ y la definición de su controlador, es para manejar los restantes correos que no vayan dirigidos a users o a webmaster.

Decir que cada vez que alguien externo, envie un correo a users@appid.appspotmail.com (por ejemplo), el mensaje será enviado a la url /_ah/mail/ de mediante POST.

Bien, ya hemos explicado como asignar controladores de correo a cada cuenta de correo que queramos estar a la escucha, ahora veamos el contenido de los archivos de los controladores, para simplificar, pondré solamente el de un controlador, el de users_mail.py

Archivo users_mail.py

import logging, email
from google.appengine.ext import webapp
from google.appengine.ext.webapp.mail_handlers import InboundMailHandler
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db

class message(db.Model):
 message_body = db.TextProperty()

class UsersMail(InboundMailHandler):
 def receive(self, mail_message):
  for content_type, pl in mail_message.bodies('text/plain'):
    db_message = message(
     message_body = pl.payload.decode('utf-8')
    )
    db_message.put()

# Map mail handler to application.
application = webapp.WSGIApplication([UsersMail.mapping()], debug=True)

def main():
 run_wsgi_app(application)

if __name__ == "__main__":
 main()

Solo decir que se define como una aplicación que será llamada cada vez que alguien envíe un correo a users@appid.appspotmail.com, y que en el modelo se usa la propiedad db.TextProperty() para poder almacenar texto de más de 500 caracteres.

Para más información, visitar: la página oficial de la documentación.

Simular la recepción de correos en el servidor de desarrollo de Google App Engine


Ahora la parte menos documentada, para que podamos simular el envío de correos desde el servidor de desarrollo (en nuestra casa para los menos duchos), tenemos que visitar en nuestro navegador la url:

http://localhost:PORT/_ah/login
Donde PORT es el puerto que estemos usando, en mi caso el 8082.

Y loguearnos como administradores con la cuenta de correo que queramos testear, en este caso:
users@appid.appspotmail.com
No olvidar que appid debería ser el nombre de la aplicación.


Despues de loguarnos como administradores, debemos ir a la url:
http://localhost:PORT/_ah/admin/inboundmail

Y rellenar el mensaje a simular de esta forma o similar:

Una vez enviado el mensaje, podemos ver si todo ha funcionado correctamente.

Como en el controlador de ejemplo hemos definido un modelo llamado message para guardar el cuerpo de los mails recividos, deberemos de consultar este modelo para ver si todo ha funcionado bien.

Para eso visitamos
http://localhost:PORT/_ah/admin/datastore

Y listamos los mensajes de dicho modelo, quedando:

Comentarios

Entradas populares de este blog

Join o producto cartesiano de dos tablas en EXCEL 2007

Hace unos dias inicie mi ocupacion como becario de informatica en la facultad de humanidades y ciencias de la educacion de la UJAEN. Y como no, no han tardado en surgir los problemas. Supongamos que tenemos dos tablas, y queremos hacer una tabla que tenga datos de estas dos tablas, segun un criterio , y es que solo pueden aparecer ciertas filas, mas exactamente aquellas donde coincida cierto campo, en este ejemplo, el codigo de la asignatura. Si queremos realizar el join o producto cartesiano tal y como lo hariamos en una base de datos, parece ser que si no estamos trabajando con una bbdd sino con Excel, la cosa se complica un poco. Para "multiplicar tablas" en excel, primero vamos a hacer una cosa, cada tabla la vamos a guardar en hojas separadas, en nuestro caso, una tabla la guardamos en Hoja1 , y la otra en Hoja2 Ahora, nos situamos en la hoja donde queramos que aparezca el producto cartesiano de nuestras dos tablas, nos vamos a la ficha DATOS . Veremos que h...

Polynomial regression using python

We are going to learn how to create a polynomial regression and make a prediction over a future value using python. The data set have been fetched from INE (national statistics institute) , that data is the EPA ( active population survey ), that tell us the national total (Spain), both genders. 16 and over are unemployed ( in thousands ). Example data: label serie rate 0 2002T1 0 2152.8 1 2002T2 1 2103.3 2 2002T3 2 2196.0 3 2002T4 3 2232.4 4 2003T1 4 2328.5 Data CSV can be downloaded here: https://drive.google.com/file/d/1fwvAZe7lah5DX8-DDEpmfeUDYQhKcfzG/view?usp=sharing Lets see how looks that data: Fine, as we can see the data describe a curve, so its for that because we want to use a polynomial regression. To try to approximate that curve we will use a grade 2 polynomial or...

Use django ORM standalone within your nameko micro-services

Learning about micro services with python, I found a great tool named nameko . https://www.nameko.io/ Nameko is a Python framework to build microservices that doesn't care in concrete technologies you will use within your project. To allow that microservices to work with a database, you can install into your project a wide variety of third parties, like SQLAlchemy (just like any other). To have an easy way to communicate with the database and keep track of the changes made to the models, I chose Django: I'm just learning about microservices and I want to keep focused on that. Easy to use, Django is a reliable web framework, have a powerful and well known ORM. Also using Django we will have many of the different functionalities that this framework provide. To make all this magic to work together, I developed a python package that allow you to use Django as a Nameko injected dependency: https://pypi.org/project/django-nameko-standalone/ You can found the source ...