【问题标题】:How do you find the requested URL with Google App Engine's Python Mail service?您如何使用 Google App Engine 的 Python Mail 服务找到请求的 URL?
【发布时间】:2012-06-20 03:43:15
【问题描述】:

我的 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。看起来应该是直截了当的,但我想不通。

【问题讨论】:

    标签: python google-app-engine wsgi


    【解决方案1】:

    地址在handler URL中,你可以查看self.request.path来检索它,但确实应该使用mail_message获取这个值。

    【讨论】:

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

    好的,去源码搞清楚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 路由器允许捕获组,并将其作为参数发送给处理程序。这里捕获的组是收件人@myapp.appspotmail.com 中的“收件人”。但是您不能使用 mapping() 便利函数(在这种情况下无论如何都不会做任何事情)或处理程序中的接收方法(实际上只是从请求中获取电子邮件并将其放入 args 到收到。)

    【讨论】:

      猜你喜欢
      • 2013-05-22
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 2011-09-16
      • 2013-06-12
      相关资源
      最近更新 更多