当前位置: 首页 > 知识库问答 >
问题:

AWS Lambda无法通过AWS SES发送电子邮件

唐修明
2023-03-14

我已经证实了以下几点

  1. AWS SES不在沙箱中。我可以通过控制台发送电子邮件到未经验证的电子邮件标识。
  2. 我的Lambda函数有一个角色附加了对SES和Lambda的完全访问权限(因为它最初的基本测试给了完全的权限)

下面是AWS文档中的基本代码,只是硬编码了我的电子邮件id。但我无法收到任何电子邮件。lambda代码运行成功,但我没有收到电子邮件。

import json
import os
import boto3
from botocore.exceptions import ClientError
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

print('Loading function')


def lambda_handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))
    #print("value1 = " + event['key1'])
    #print("value2 = " + event['key2'])
    #print("value3 = " + event['key3'])
    #return event['key1']  # Echo back the first key value
    #raise Exception('Something went wrong')
    SENDER = "[redacted email]"
    RECIPIENT = event['email']
    CONFIGURATION_SET = "ConfigSet"
    AWS_REGION = "us-east-2"
    SUBJECT = "Contact Us Form Details"
    # The email body for recipients with non-HTML email clients.
BODY_TEXT = "Hello,\r\nPlease see the attached file for a list of customers to contact."

# The HTML body of the email.
BODY_HTML = """\
<html>
<head></head>
<body>
<h1>Hello!</h1>
<p>Please see the attached file for a list of customers to contact.</p>
</body>
</html>
"""

# The character encoding for the email.
CHARSET = "utf-8"

# Create a new SES resource and specify a region.
client = boto3.client('ses',region_name='us-east-2')

# Create a multipart/mixed parent container.
msg = MIMEMultipart('mixed')
# Add subject, from and to lines.
msg['Subject'] = "Contact Us Form Details" 
msg['From'] ="[redacted email]" 
msg['To'] = "[redacted email]"

# Create a multipart/alternative child container.
msg_body = MIMEMultipart('alternative')

# Encode the text and HTML content and set the character encoding. This step is
# necessary if you're sending a message with characters outside the ASCII range.
textpart = MIMEText(BODY_TEXT.encode(CHARSET), 'plain', CHARSET)
htmlpart = MIMEText(BODY_HTML.encode(CHARSET), 'html', CHARSET)

# Add the text and HTML parts to the child container.
msg_body.attach(textpart)
msg_body.attach(htmlpart)

# Define the attachment part and encode it using MIMEApplication.
#att = MIMEApplication(open(ATTACHMENT, 'rb').read())

# Add a header to tell the email client to treat this part as an attachment,
# and to give the attachment a name.
#att.add_header('Content-Disposition','attachment',filename=os.path.basename(ATTACHMENT))

# Attach the multipart/alternative child container to the multipart/mixed
# parent container.
msg.attach(msg_body)

# Add the attachment to the parent container.
#msg.attach(att)
print(msg)
try:
    #Provide the contents of the email.
    response = client.send_raw_email(
        Source="[redacted email]",
        Destinations=[
            "[redacted email]"
        ],
        RawMessage={
            'Data':msg.as_string(),
        },
        #ConfigurationSetName=CONFIGURATION_SET
    )
# Display an error if something goes wrong. 
except ClientError as e:
    print(e.response['Error']['Message'])
else:
    print("Email sent! Message ID:"),
    print(response['MessageId'])

附加我的云监视日志以供参考

共有2个答案

詹甫
2023-03-14

如果您在执行lambda时没有收到任何错误,那么很可能您没有遇到sesapi。从我在代码中看到的情况来看,您缺少一个访问密钥Id和一个秘密访问密钥。尝试如下配置您的boto客户端

client = boto3.client(
    'ses',
    region_name=region,
    aws_access_key_id='aws_access_key_string',
    aws_secret_access_key='aws_secret_key_string'
)

还要确保lambda部署在与SES相同的区域。我看到你在用我们东区2号。我看到的另一个差异也存在于文档中,即在AWS官方文档中,目的地实际上是目的地。不带“s”试试看。您还可以为lambda粘贴cloudwatch日志。我认为它应该在成功后打印消息Id。是吗?

苏鹏鹍
2023-03-14

如果您的代码确实是您向我们显示的代码,那么它不发送电子邮件的原因是因为有一半代码没有被执行。

def lambda_handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))
    #print("value1 = " + event['key1'])
    #print("value2 = " + event['key2'])
    #print("value3 = " + event['key3'])
    #return event['key1']  # Echo back the first key value
    #raise Exception('Something went wrong')
    SENDER = "[redacted email]"
    RECIPIENT = event['email']
    CONFIGURATION_SET = "ConfigSet"
    AWS_REGION = "us-east-2"
    SUBJECT = "Contact Us Form Details"
    # The email body for recipients with non-HTML email clients.
BODY_TEXT = "Hello,\r\nPlease see the attached file for a list of customers to contact."

当AWS Lambda执行该函数时,它调用Lambda\u handler()。根据Python格式,它将执行所有缩进行,因为它们构成函数的一部分。这包括print()语句。

但是,从BODY\u TEXT= 行,没有缩进。这意味着代码是“main”程序的一部分,而不是lambda_handler()函数的一部分。它将在第一次实例化Lambda容器时执行,但不会在触发函数时执行。

一句话:如果这是你的实际代码,你需要修复你的缩进。

 类似资料:
  • 我使用SendInBlue Java Api发送电子邮件,我在scala中编写了以下代码: 但我得到了这个错误:{“代码”:“失败”,“消息”:“需要有效的”至“电子邮件地址”,“数据”:[]}

  • 我有一个代码,就像半年前一样工作。它基本上发送电子邮件。 这是例外 (534, b'5.7.14 5.7.14 KL7\u 2qGSLW9IBjP8dKKgP67bEgyKNc5ls76dnVDZcUlVQjJUQb0JX9BIVi\u Agb84vKNOKB 5.7.14fshB0ngZ_Tn8ocDpDHKavRKXmluVjHo5YM7ADKENtWn4aVTxyvaBlbXRGpA1EBh

  • 问题内容: 我正在使用。 使用发送电子邮件(通过)的最佳方法是什么? 问题答案: 有关使用Outlook的解决方案,请参见下面的TheoretiCAL答案。 否则,请使用python随附的smtplib。请注意,这将要求您的电子邮件帐户允许smtp,默认情况下不一定启用此功能。 编辑: 此示例使用保留域,如RFC2606中所述 为了使它真正与gmail配合使用,Doe先生需要进入gmail中的选项

  • 我使用的PHPMailer表格在这里找到。 从网站下载的示例是“接触-3”,在引导主题中使用PHPMailer通过gmail发送SMTP电子邮件。当我使用“接触-1”时,它完全适用于我的托管域电子邮件地址,但SMTP版本适用于gmail地址,联系人表单不会提交。 在下面的代码中,我更改了以下行以添加我的gmail地址和gmail密码: 任何关于使用给定信息进行此工作的帮助都将不胜感激-提前感谢!

  • 我正在尝试使用Gmail SMTP服务器从我用CodeIgniter构建的应用程序发送电子邮件,但没有成功。我使用我的Gmail帐户作为用户,但为了保密,我正在更改这里的配置。我使用了下面的代码 以下是每次出现的2个错误消息: 遇到一个PHP错误 严重性:警告 消息:mail():无法连接到位于“”的邮件服务器ssl://smtp.googlemail.com端口465,验证php.ini中的“S

  • 我的: 但是邮件不会发送到该地址,在控制台中,当我单击时,正在打印,但它不会发送任何电子邮件。 我用的是Django 1.3.7和Python 2.6。 不知道是版本的问题还是什么逻辑问题。