我正试图使用带有Python 3.7 lambda函数的AWS SES发送电子邮件。
当我试图测试该功能并查看它是否发送电子邮件时,我收到一条消息,任务超时。
它到达发送消息的代码部分,但消息在任何时候都没有被发送,任务刚刚超时。
这是我用来发送消息的代码:
from __future__ import print_function
import boto3
import json
import decimal
from datetime import datetime
from boto3.dynamodb.conditions import Key, Attr
from botocore.exceptions import ClientError
ses = boto3.client(
'ses',
region_name = 'us-east-1',
endpoint_url = 'https://email.us-east-1.amazonaws.com'
)
try:
response = ses.send_email(
Destination = {
'ToAddresses': [
email
],
},
Message = {
'Body': {
'Html': {
'Charset': CHARSET,
'Data': BODY_HTML
},
'Text': {
'Charset': CHARSET,
'Data': BODY_TEXT
},
},
'Subject': {
'Charset': CHARSET,
'Data': SUBJECT
}
},
Source = SENDER
)
except ClientError as e:
print(e)
else:
print('Email sent! Message ID:'),
print(response['MessageId'])
上面所有的变量都被硬编码在代码中,并且肯定有值(我已经将其打印到控制台以确保它(。
我也有同样的问题(但使用nodejs(。我发现这些答案可能会对你有所帮助,看起来像是aws的网络问题。https://forums.aws.amazon.com/thread.jspa?threadID=232508https://github.com/aws/aws-sdk-js/issues/1451
编辑:在类似情况下,对我来说最简单的解决方案是使用SNS调用另一个不在VPC内的lambda。第二个lambda用于调用SES服务。您可以为SNS创建一个端点,并将其连接到VPC。
看起来endpoint_url = 'https://dynamodb.us-east-1.amazonaws.com'
指向的DynamoDB在SES客户端中似乎无效。尝试删除:
ses = boto3.client(
'ses',
region_name = 'us-east-1',
)
我很长一段时间都试图让它与boto3 SES客户端一起工作,但没有成功,即使在创建了SES端点(我的lambda在VPC中(之后也是如此。它一直在计时,没有出现任何其他错误。如果这对其他人有帮助,我切换到使用smtplib,如下所述:https://www.authsmtp.com/python/index.html.我不知道这种方法是否有缺点;我只知道它对我有用。
import boto3
import json
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
然后(我在AWS Secrets Manager中存储了SES SMTP凭据(:
# get SES smtp email credentials from Secrets Manager
client2 = boto3.client('secretsmanager')
response = client2.get_secret_value(
SecretId='secretIDhere'
)
secretDict = json.loads(response['SecretString'])
smtpusername = secretDict['username']
smtppassword = secretDict['password']
smtphost = 'email-smtp.us-east-1.amazonaws.com:25'
最后是
# send email
msg = MIMEMultipart()
message = "Message text here"
msg['From'] = "email address here"
msg['To'] = "email address here"
msg['Subject'] = "Subject line here"
msg.attach(MIMEText(message, 'plain'))
server = smtplib.SMTP(smtphost)
server.starttls()
server.login(smtpusername, smtppassword)
server.sendmail(msg['From'], msg['To'], msg.as_string())
server.quit()
我联系了AWS技术支持,他们建议我使用带有NAT网关的私有子网,以使SES电子邮件功能在Lambda设置中工作。