2010-11-20 17 views
5

Sto leggendo il tutorial su Receiving Mail. Ho aggiornato il file app.yaml come indicato:Ricezione della posta in 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 

E ha creato 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() 

Ho anche hw.py che ho usato per praticare l'invio di e-mail. Quello funziona.

ora vado a http://localhost:8081/_ah/admin/inboundmail e inviare una mail a [email protected]

Qualcuno può spiegare a me come io elaboro questa email? Come posso accedere al contenuto dell'e-mail? Ho il codice

self.response.out.write(txtmsg) 

in handle_incoming_email.py ma che non stampa nulla.

Apprezzerei molto se qualcuno chiarisse come funziona la ricezione della posta elettronica.

Per esempio, 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) 

per quanto ho capito sender è l'e-mail del mittente. Quindi, nel mio caso, come posso accedere all'indirizzo email del mittente.

Inoltre, perché è necessario disporre di uno script separato per gestire la posta in arrivo? Perché non riesco a inserire il gestore ReceiveEmail nello script hw.py? Se lo faccio, dove metto la linea

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

Sarei grato se mi può aiutare con queste domande.

(I asked the same question nel gruppo GAE, ma non c'erano risposte.)

+0

È questa linea di codice logging.info ("E-mail ricevuta da% s"% message.sender), registrazione di qualcosa? – systempuntoout

+1

Sì; Non sapevo che logging.info stava registrando le informazioni nella Log Console :) Quindi, il codice sembra funzionare; ora ho bisogno di capire come scrivere il contenuto dell'email su datastore. Grazie! – Zeynel

risposta

1

È [email protected] un utente Google valido? GAE può ricevere/inviare email solo dall'utente google dell'applicazione. Il tuo codice sembra corretto.

"Inoltre, perché ho bisogno di avere uno script separato per gestire la posta in arrivo? Perché non posso mettere il gestore di ReceiveEmail nel mio hw.py" -> lo script principale è quello di gestire la richiesta di url, penso sia molto più chiaro in questo modo.

+0

Grazie per la risposta. Sono confuso sul motivo per cui 'help @ hello-1-world.appspotmail.com' deve essere un" utente google valido ". Il tutorial dice: "La tua app può ricevere e-mail agli indirizzi del seguente modulo:' string @ appid.appspotmail.com 'Quindi mi sembra che 'help @ hello-1-world.appspotmail.com' sia conforme a tale modulo. Ma quello che non capisco è come elaborare questa email.Ad esempio, come posso stampare il corpo dell'email ricevuta? – Zeynel

+1

Il tuo codice è corretto, se esegui l'app e la ricezione di email è attiva dovresti vedere il corpo in Francamente ho pensato che solo gli utenti di google dovessero avere una e-mail valida, ma non ho mai controllato, di sicuro solo gli utenti di Google possono essere mittenti di posta elettronica Controllare anche che la posta sia realmente attiva dalla console – Uberto

+0

Spiacente, non sapevo cosa 'logging .info() 'ha fatto.Sì, vedo in Log Console che l'e-mail che ho inviato da http: // localhost: 8081/_ah/admin/inboundmail' è stata ricevuta e loggata. Grazie per aver chiarito questo. Ora proverò a scrivere il contenuto sul datastore. – Zeynel