如何使用Google App Engine查找请求的URL';什么是Python邮件服务?

如何使用Google App Engine查找请求的URL';什么是Python邮件服务?,python,google-app-engine,wsgi,Python,Google App Engine,Wsgi,我的Google App Engine应用程序想要存储各种传入的电子邮件,包括电子邮件的收件人。我正在尝试找出如何查看电子邮件发布到的URL,以便找到目标收件人 app.yaml有: inbound_services: - mail handlers: - url: /_ah/mail/.+ script: handle_incoming_email.py login: admin Python脚本有: class Message(db.Model): recipient

我的Google App Engine应用程序想要存储各种传入的电子邮件,包括电子邮件的收件人。我正在尝试找出如何查看电子邮件发布到的URL,以便找到目标收件人

app.yaml有:

inbound_services:
- mail
handlers:
- url: /_ah/mail/.+ 
  script: handle_incoming_email.py 
  login: admin
Python脚本有:

class Message(db.Model):
    recipient = db.stringProperty()
    subject = db.stringProperty()
    # etc.

class MyMailHandler(InboundMailHandler):
    def receive(self, mail_message):
        msg = Message(subject=mail_message.subject, recipient=???)
        msg.put()

application = webapp.WSGIApplication([MyMailHandler.mapping()], debug=True)
因此,如果电子邮件发送到john@myapp.appspot.com,收件人将是john@myapp.appspot.com. 如果电子邮件发送到jane@myapp.appspot.com,收件人将是jane@myapp.appspot.com等等


我知道我可以筛选mail_message.to字段,但我更愿意查看实际传入的URL。看起来应该很简单,但我无法理解。

地址在处理程序URL中,您可以查看self.request.path来检索它,但确实应该使用mail\u message获取此值。

好的,转到源代码以了解receive()和mapping()的作用。我最终做了我想做的事情:

class MyEmailHandler(InboundMailHandler):
    def post(self,recipient):
        # 'recipient' is the captured group from the below webapp2 route
        mail_message = mail.InboundEmailMessage(self.request.body)
        # do stuff with mail_message based on who recipient is

app = webapp2.WSGIApplication(
    [(r'/_ah/mail/(.+)@.+\.appspotmail\.com',MyEmailHandler)],
    debug=True)

webapp2路由器允许捕获组,并将其作为参数发送给处理程序。此处,捕获的组是中的“收件人”recipient@myapp.appspotmail.com. 但是您不能使用mapping()便利函数(在本例中,它不会做很多事情)或处理程序中的receive方法(它实际上只是从请求中获取电子邮件并将其放入要接收的参数中。)

为什么要查看邮件?URL看起来很权威,因为这是电子邮件实际到达的地址,而“收件人”字段可能包含许多电子邮件地址,其中可能包含多个接收域的电子邮件地址?@JerryNeumann你确定“收件人”字段包含邮件的所有收件者,而不只是与处理者相关的收件人吗?我不知道答案最后一个问题是肯定的,但电子邮件处理的一个公理是某些标题不会更改。IIRC“To:”标题的规则是,它应该反映发送者想要的所有收件人。MTA可能添加了其他头,您可以使用这些头来确定它实际交付给了谁,但这很快就会变得很模糊。@Guido使用处理程序类的get方法,在URL中命名为captured matches,重新映射get sent作为方法的参数。post方法似乎也有类似的功能,然后receive方法也会有类似的功能,但我找不到文档记录。如果可以通过重新命名的捕获来传递receive方法,那么这将很容易,因为可以通过传入收件人来接收。但是WSGI路由器无法使用mapping()助手方法。。。我在哪里可以找到传递内容的规范以及mapping()的具体工作方式?因此,根据docs(),在处理程序中,self.request.path类似于/_ah/main/test@example.com. 当然,您可以找出如何从字符串中获取最后一个“/”后面的部分吗?(提示:x.split('/')[-1])