2010-11-20 20 views
5

Receiving Mail ile ilgili eğiticiyi okuyorum. Ben de e-posta göndererek uygulamak için kullanılan hw.py sahipGoogle App Engine'de Posta Alma

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 

Ve 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() 

yarattı: emrettiğim gibi app.yaml dosyası güncellendi. Bu çalışır.

Şimdi http://localhost:8081/_ah/admin/inboundmail gidip bir e-posta göndermek [email protected]

Bu e-postayı işlemek nasıl biri bana açıklayabilir mi? E-postanın içeriğine nasıl erişebilirim? Ben kodu handle_incoming_email.py içinde

self.response.out.write(txtmsg) 

var ama o şey yazmaz.

E-posta alma işleminin nasıl çalıştığını açıklığa kavuşturabilirseniz çok memnun olurum. Örneğin

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

bildiğim kadarıyla sender anladığım kadarıyla gönderenin e-posta olduğunu. Yani, benim durumumda gönderenin e-posta adresine nasıl erişirim.

Ayrıca, gelen postaları işlemek için neden ayrı bir betiğe sahip olmam gerekiyor? Neden ReceiveEmail işleyiciyi hw.py komut dosyasına koyamıyorum? Ben çizgi

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

koymak yerlerde, bu yaparsanız bu sorularla bana yardımcı olabilir eğer minnettar olacaktır.

(GAE'nin grubunda I asked the same question ama hiçbir cevap yoktu.)

+0

Bu logging.info ("% s den alınan e-posta alındı"% message.sender) kod satırı, bir şeyleri günlüğe kaydettiriyor mu? – systempuntoout

+1

Evet; Logging.info'nun bilgiyi Log Console'a kaydettiğini bilmiyordum :) Bu yüzden kod çalışıyor gibi görünüyor; şimdi e-postanın içeriğini nasıl veri deposuna yazacağımı bulmalıyım. Teşekkürler! – Zeynel

cevap

1

[email protected] geçerli bir google kullanıcı var mı? GAE, yalnızca uygulamanızın google kullanıcısından posta alabilir/gönderebilir. Kodunuz yanlış görünüyor.

"Ayrıca, gelen postayı işlemek için ayrı bir betiğe neden ihtiyacım var? Neden ReceiveEmail işleyiciyi hw.py'ye koyamıyorum" -> ana betik URL isteğini işlemek için bu şekilde çok daha net.

+0

Cevabınız için teşekkürler. "Yardım @ hello-1-world.appspotmail.com" un neden "geçerli bir google kullanıcısı" olması gerektiği konusunda kafam karıştı. Eğitmen şöyle diyor: "Uygulamanız şu formun adreslerinden e-posta alabilir:" string @ appid.appspotmail.com "Bana öyle geliyor ki 'hello-1-world.appspotmail.com yardım' bu forma uygun. Ama anlamadığım şey bu e-postayı nasıl işleyeceğimizdir. Örneğin, alınan e-postanın gövdesini nasıl yazdırabilirim? – Zeynel

+1

Kodunuz doğruysa, uygulamayı çalıştırırsanız ve e-posta alma etkinse, gövdede Açıkçası ben sadece google kullanıcıları geçerli bir e-posta, ama ben hiç kontrol ettim. Ben sadece google kullanıcıları posta gönderen olabilir.Ayrıca postanın konsoldan gerçekten aktif olduğunu kontrol edin. – Uberto

+0

Üzgünüz, ne 'logging bilmiyordum .info() 'yaptı.Evet, Log Console'da http: // localhost: 8081/_ah/admin/inboundmail' tarafından gönderilen e-postanın alındığını ve giriş yaptığınızı görüyorum. Bunu açıkladığınız için teşekkürler. Şimdi içeriği veri deposuna yazmayı deneyeceğim. – Zeynel