2010-11-20 8 views
5

Estoy leyendo el tutorial sobre Receiving Mail. Yo actualizado el archivo app.yaml como se indica:Recibiendo correo en Google App Engine

application: hello-1-world 
version: 1 
runtime: python 
api_version: 1 

handlers: 
- url: /favicon.ico 
    static_files: static/images/favicon.ico 
    upload: static/images/favicon.ico 

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

- url: /.* 
    script: hw.py 

inbound_services: 
- mail 

y creó un handle_incoming_email.py

import cgi 
import os 
import logging 
from google.appengine.api import users 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp.util import run_wsgi_app 
from google.appengine.ext import db 
from google.appengine.api import mail 
from google.appengine.ext.webapp.mail_handlers import InboundMailHandler 

class ReceiveEmail(InboundMailHandler): 
    def receive(self,message): 
     logging.info("Received email from %s" % message.sender) 
     plaintext = message.bodies(content_type='text/plain') 
     for text in plaintext: 
      txtmsg = "" 
      txtmsg = text[1].decode() 
      logging.info("Body is %s" % txtmsg) 
      self.response.out.write(txtmsg) 

application = webapp.WSGIApplication([ 
    ReceiveEmail.mapping() 
], debug=True) 

def main(): 
    run_wsgi_app(application) 
if __name__ == "__main__": 
    main() 

También tengo hw.py que solía practicar el envío de correo electrónico. Ese funciona

Ahora voy a http://localhost:8081/_ah/admin/inboundmail y enviar un correo electrónico a [email protected]

Puede alguien explicarme cómo procesar este correo electrónico? ¿Cómo accedo al contenido del correo electrónico? Tengo el código

self.response.out.write(txtmsg) 

en handle_incoming_email.py pero eso no imprime nada.

Agradecería mucho si alguien aclara cómo funciona el correo electrónico.

Por ejemplo, in this question

class MailHandler (InboundMailHandler): 
    def receive(self, message): 
    sender = message.sender 
    user_account = db.GqlQuery("SELECT * FROM Task WHERE user = :1", sender).fetch(5) 

por lo que yo entiendo sender es el correo electrónico del remitente. Entonces, en mi caso, ¿cómo accedo a la dirección de correo electrónico del remitente?

Además, ¿por qué necesito tener un script separado para manejar el correo entrante? ¿Por qué no puedo poner el controlador ReceiveEmail en mi script hw.py? Si hago eso, ¿dónde coloco la línea

application = webapp.WSGIApplication([ 
    ReceiveEmail.mapping() 
], debug=True) 

Le agradecería que me ayudara con estas preguntas.

(I asked the same question en el grupo GAE pero no hubo respuestas.)

+0

¿Es este logging.info (línea de código "Correo electrónico recibido de% s" message.sender), registrando algo? – systempuntoout

+1

Sí; No sabía que logging.info estaba registrando la información en Log Console :) Por lo tanto, el código parece estar funcionando; ahora necesito averiguar cómo escribir el contenido del correo electrónico en el almacén de datos. ¡Gracias! – Zeynel

Respuesta

1

Es [email protected] un usuario de Google válida? GAE puede recibir/enviar correos solo del usuario de Google de su aplicación. Tu código parece correcto.

"Además, ¿por qué necesito tener un script separado para manejar el correo entrante? ¿Por qué no puedo poner el manejador ReceiveEmail en mi hw.py" -> el script principal es para manejar la solicitud url, creo que es mucho más claro de esta manera.

+0

Gracias por la respuesta. Estoy confundido acerca de por qué 'help @ hello-1-world.appspotmail.com' debe ser un" usuario de google válido ". El tutorial dice: "Su aplicación puede recibir correos electrónicos en las direcciones de la siguiente forma:' string @ appid.appspotmail.com' Por lo tanto, me parece que 'help @ hello-1-world.appspotmail.com' se ajusta a esa forma. Pero lo que no entiendo es cómo procesar este correo electrónico. Por ejemplo, ¿cómo imprimo el cuerpo del correo electrónico recibido? – Zeynel

+1

Su código es correcto, si ejecuta la aplicación y la recepción de correo electrónico está activa, debería ver el cuerpo en los registros. Francamente, asumí que solo los usuarios de google tenían un correo electrónico válido, pero nunca lo comprobé. Por supuesto, solo los usuarios de google pueden ser remitentes de correo. Comprueba también que el correo está realmente activo desde la consola. – Uberto

+0

Disculpa, no sabía qué 'registro .info() 'lo hizo.Sí, veo en Log Console que el correo electrónico que envié desde 'http: // localhost: 8081/_ah/admin/inboundmail' se recibe e inicia sesión. Gracias por aclarar esto. Ahora intentaré escribir el contenido en el almacén de datos. – Zeynel