簡體   English   中英

由於缺少 api 代理,從 Google Appengine 發送電子郵件失敗

[英]Sending emails from Google Appengine fails because of missing api proxy

我正在嘗試使用以下代碼從 GAE 應用程序發送電子郵件:

from google.appengine.api.mail import send_mail

send_mail(
    "sender@nowhere.com",
    ["user@example.com"],
            "Subject",
            "Body",
)

我在app.yaml中配置了 API 的使用:

app_engine_apis: true

部署到 App Engine 是使用gcloud beta app deploy完成的。

但是,我收到此錯誤:

Traceback (most recent call last):   
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/flask/app.py", line 2073, in wsgi_app      response = self.full_dispatch_request()    
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/flask/app.py", line 1518, in full_dispatch_request      rv = self.handle_user_exception(e)    
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/flask/app.py", line 1516, in full_dispatch_request      rv = self.dispatch_request()    
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/flask/app.py", line 1502, in dispatch_request      return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)    
File "/srv/infrastructure/view_modifiers.py", line 12, in view_method      response_val = f(*args, **kwargs)    
File "/srv/views/orders.py", line 25, in create_order      vm.create_order()    
File "/srv/viewmodels/orders/order_viewmodel.py", line 74, in create_order      self._send_order_email()    
File "/srv/viewmodels/orders/order_viewmodel.py", line 54, in _send_order_email      send_mail(    
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/google/appengine/api/mail.py", line 401, in send_mail      message.send(make_sync_call=make_sync_call)    
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/google/appengine/api/mail.py", line 1209, in send      make_sync_call('mail', self._API_CALL, message, response)    
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/google/appengine/api/apiproxy_stub_map.py", line 96, in MakeSyncCall      return stubmap.MakeSyncCall(service, call, request, response)    
File "/layers/google.python.pip/pip/lib/python3.9/site-packages/google/appengine/api/apiproxy_stub_map.py", line 348, in MakeSyncCall      assert stub, 'No api proxy found for service "%s"' % service  AssertionError: No api proxy found for service "mail"

這似乎表明即使對於郵件服務的默認行為,也需要配置某種代理。 但是,我找不到有關此代理設置的任何信息。 而且,我最初的理解是設置代理只需要進行單元測試或本地開發。

我剛剛對此進行了測試,它對我有用(即我收到了我在下面的代碼中為recipient_email_address電子郵件地址提供的 email)。 請注意,sender 必須是 App Engine 設置頁面中Email Senders下指定的值

requirements.txt文件

Flask
appengine-python-standard>=1.0.0

app.yaml文件

runtime: python39
app_engine_apis: true

handlers:

- url: /static
  static_dir: static/

- url: /.*
  script: auto

main.py

    from flask import Flask
    from google.appengine.api import wrap_wsgi_app
    from google.appengine.api.mail import send_mail

    app = Flask(__name__)
    app.wsgi_app = wrap_wsgi_app(app.wsgi_app)

    @app.route("/")
    def sendMail():
        
        
        send_mail(sender= <authorized_email_sender>,
                  to= <recipient_email_address>,
                  subject="Testing Python3 sending mails",
                    body="""Dear Albert:
    
                        Your example.com account has been approved.  You can now visit
                        http://www.example.com/ and sign in using your Google Account to
                        access new features.
    
                        Please let us know if you have any questions.
    
                        The example.com Team
                        """)

            return "Mail was sent"

這是一個適用於 fastapi 的示例。

from google.appengine.api import mail
from fastapi.middleware.wsgi import WSGIMiddleware
from google.appengine.api import wrap_wsgi_app
from flask import Flask

app = create_app() // this is just app = FastAPI() and somes  middleware but but no relevance here
app_flask = Flask(__name__)
app_flask.wsgi_app = wrap_wsgi_app(app_flask.wsgi_app, use_deferred=True)


def send_approved_mail(sender_address):
    # [START send_message]
    message = mail.EmailMessage(
        sender=sender_address,
        subject="Your account has been approved")

    message.to = "test@gmail.com"
    message.body = """Dear Albert:
Your example.com account has been approved.  You can now visit
http://www.example.com/ and sign in using your Google Account to
access new features.
Please let us know if you have any questions.
The example.com Team
"""
    message.send()

@app_flask.route("/send_email", methods=['GET'])
def send_email():
    send_approved_mail("registred_email@domain.com")
    return "message sent"


app.mount("/v1", WSGIMiddleware(app_flask))

這里 app.yaml

runtime: python39
entrypoint: gunicorn -k uvicorn.workers.UvicornWorker app.main:app
instance_class: F1
app_engine_apis: true
inbound_services:
- mail
- mail_bounce

您不會在 swagger 上看到 flask 路線。 由於某種原因,我無法使用應用引擎的默認服務帳戶發送 email。 我必須在這里注冊我的 email(具有相同的域): https://console.cloud.google.com/appengine/settings/emailsenders?project=your_project

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM