通过 Python Google Cloud Function 发送电子邮件的最佳方式是啥?

Posted

技术标签:

【中文标题】通过 Python Google Cloud Function 发送电子邮件的最佳方式是啥?【英文标题】:What's the best way to send an e-mail via Python Google Cloud Function?通过 Python Google Cloud Function 发送电子邮件的最佳方式是什么? 【发布时间】:2020-09-28 14:31:15 【问题描述】:

我正在尝试编写一个 Python 谷歌云函数,以便每天在同一时间(例如每天 00:00)向同一个 G-mail 地址发送一封自动电子邮件。实现这一目标的最简单方法是什么?我在在线文档中找不到任何在线教程或指南...提前致谢!

这是我迄今为止尝试过的方法,但两种方法似乎都不起作用(真实的电子邮件地址、密码和 API 密钥由于显而易见的原因而被隐藏)

方法一:使用smtplib(函数体)

import smtplib

gmail_user = 'SenderEmailAddress@gmail.com'
gmail_password = 'SenderEmailPassword'

sent_from = gmail_user
to = ['RecipientEmailAddress@gmail.com']
subject = 'Test e-mail from Python'
body = 'Test e-mail body'

email_text = """\
From: %s
To: %s
Subject: %s

%s
""" % (sent_from, ", ".join(to), subject, body)

server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.ehlo()
server.login(gmail_user, gmail_password)
server.sendmail(sent_from, to, email_text)
server.close()
print('Email sent!')

方法二:使用 SendGrid API(函数体)

import os
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail

message = Mail(
    from_email='SenderEmailAddress@gmail.com',
    to_emails='RecipientEmailAddress@gmail.com',
    subject='Sending with Twilio SendGrid is Fun',
    html_content='<strong>and easy to do anywhere, even with Python</strong>')

try:
    sg = SendGridAPIClient("[SENDGRID API KEY]")
    #sg = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
    response = sg.send(message)
    print(response.status_code)
    print(response.body)
    print(response.headers)
except Exception as e:
    print(e.message)

【问题讨论】:

请添加您目前尝试过的内容。 感谢@VenkataramanR,我已经编辑了我的问题,包括我尝试过的几种方法。 【参考方案1】:

使用云功能发送电子邮件的最佳方式是使用电子邮件第三方服务。

GCP 为 Sendgrid 和 Mailjet 提供折扣,这些服务必须通过 GCP 市场启用才能申请此优惠。

sendgrid 的配置非常简单

    在GCP marketplace 上激活计划(我使用免费计划,12K 邮件/月) Create an api key in sendgrid 验证您的 sendgrid 帐户电子邮件(使用您收到的电子邮件)

在云功能方面,您需要使用新的 sendgrid api 密钥 create a variable environment。

EMAIL_API_KEY = your awesome api key

您可以部署以下示例代码

requirements.txt:

sendgrid

*不指定版本以安装最新的可用版本

def email(request):
    import os
    from sendgrid import SendGridAPIClient
    from sendgrid.helpers.mail import Mail, Email
    from python_http_client.exceptions import HTTPError

    sg = SendGridAPIClient(os.environ['EMAIL_API_KEY'])

    html_content = "<p>Hello World!</p>"

    message = Mail(
        to_emails="[Destination]@email.com",
        from_email=Email('[YOUR]@gmail.com', "Your name"),
        subject="Hello world",
        html_content=html_content
        )
    message.add_bcc("[YOUR]@gmail.com")

    try:
        response = sg.send(message)
        return f"email.status_code=response.status_code"
        #expected 202 Accepted

    except HTTPError as e:
        return e.message

要安排您的电子邮件,您可以使用Cloud Scheduler。

    Create a service account 和 functions.invoker permission 在你的函数中 Create new Cloud scheduler job 以 cron 格式指定频率。 将 HTTP 指定为目标类型。 一如既往地添加您的云函数和方法的 URL。 从 Auth 标头下拉列表中选择令牌 OIDC 在服务帐户文本框中添加服务帐户电子邮件。

【讨论】:

非常感谢@JAHDZP 提供详细的分步说明! @user147529 不一定在sendgrid example 中使用测试/假电子邮件,from_email 参数中可以使用任何地址 这正是我遇到的问题,也是我正在寻找的解决方案。感谢您对解决方案的简洁而全面的描述! gmail 怎么样...使用 gmail api....?

以上是关于通过 Python Google Cloud Function 发送电子邮件的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Functions 部署:EROFS:只读文件系统

通过 Python Google Cloud Function 发送电子邮件的最佳方式是啥?

通过 Python 客户端库将多个文件上传到 Google Cloud Storage

带有 python 入口点的 Google Cloud Build gsutil

如何在Python和Java中访问Google Cloud Endpoints请求标头

google.cloud 在哪个 python 库中?