Google App Engine - 如何配置发送和接收邮件

3 投票
2 回答
2632 浏览
提问于 2025-04-17 06:33

我在网上查了很多资料,但还是不知道我缺少了什么。我有一个联系表单,用户可以通过这个表单联系我:

contact.html

<form id="contact" action="" method="post" name="contact">
    <label for="subject">Subject:</label>
    <input id="id_subject" type="text" name="subject" maxlength="100">
    <label for="email">Email:</label>
    <input id="id_email" type="text" name="email">
    <label for="message">Message:</label>
    <textarea id="id_message" rows="10" cols="40" name="message"></textarea>
    <input type="submit" value="Submit">
</form>

app.yaml

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

main.py

from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template
from google.appengine.api import mail
from google.appengine.ext.webapp.mail_handlers import InboundMailHandler 

class Contact(webapp.RequestHandler):
    def get(self):  
        self.response.out.write(template.render('contact.html', {}))
    def post(self):
        sender = self.request.get("email")
        subject = self.request.get("subject")
        body = self.request.get("message")          
        message = mail.EmailMessage(sender=sender, subject=subject)
        message.to = "myemail@gmail.com"
        message.body = body
        message.send()

class LogSenderHandler(InboundMailHandler):
    def receive(self, mail_message):
        logging.info("Received a message from: " + mail_message.sender)

def main():
    application = webapp.WSGIApplication([('/contact', Contact),  
                                           LogSenderHandler.mapping()],
                                           debug=True)
    util.run_wsgi_app(application)

if __name__ == '__main__':
    main()

这个叫 LogSenderHandler 的类不工作,receive() 这个方法需要一个额外的参数,但我不知道这个参数该从哪里来。所以在我部署的时候我没有把它注释掉。我的脑子里一团乱,我不知道该怎么把这些东西组合在一起。
当我尝试给自己发邮件时,我在仪表盘的日志上看到这个:

Unauthorized sender
Traceback (most recent call last):
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/_webapp25.py", line 703, in __call__
    handler.post(*groups)
  File "/base/data/home/apps/s~projectname/1.354692671370598794/main.py", line 27, in post
    message.send()
  File "/base/python_runtime/python_lib/versions/1/google/appengine/api/mail.py", line 894, in send
    raise ERROR_MAP[e.application_error](e.error_detail)
InvalidSenderError: Unauthorized sender

你能帮帮我吗?

2 个回答

1

来自 App Engine 文档

发件人的电子邮件地址,也就是“发件人地址”。这个发件人地址必须符合以下几种类型:

  • 应用程序的注册管理员的地址。你可以通过管理控制台来添加管理员。

  • 当前请求中使用 Google 账户登录的用户的地址。你可以通过用户 API 来获取当前用户的电子邮件地址。这个用户的账户必须是 Gmail 账户,或者是在 Google Apps 管理的域名下。

  • 应用程序的任何有效的电子邮件接收地址(比如 xxx@APP-ID.appspotmail.com)。

所以,如果你的发件人电子邮件地址不符合这些要求,就会出现这个错误。

1

你不能使用表单上提交的邮箱发送邮件,因为你没有权限使用那个邮箱。你要么得用一个你自己能控制的邮箱,要么通过连接用户的谷歌账号来使用他们的邮箱。http://code.google.com/appengine/docs/python/mail/sendingmail.html 这个页面告诉你可以用哪个邮箱发送邮件,只需在第一个代码块后面往下滚动就可以了。

撰写回答