AWS Lambda SES 发送带有附件 PYTHON 的电子邮件

问题描述:

我的 Lambda 函数在 lambda 环境中的/tmp 位置创建一个文本文件.

My Lambda function creates a text file in /tmp location within in lambda environment.

我无法使用 Lambda SES Python 将文件作为附件发送

I am failing to send the file as an attachment using Lambda SES Python

我正在遵循以下 AWS 文档中的代码,使用 SES Python3.6 发送带有附件的 RAW 电子邮件

I am following code from below AWS documentation to send RAW email with attachment using SES Python3.6

https://docs.aws.amazon.com/ses/latest/DeveloperGuide/examples-send-raw-using-sdk.html

def send_mail_with_attach_ses(sender, recipient, aws_region, subject, file_name):
    # The email body for recipients with non-HTML email clients.
    BODY_TEXT = "Hello,\r\nPlease find the attached file."

    # The HTML body of the email.
    BODY_HTML = """\
    <html>
    <head></head>
    <body>
    <h1>Hello!</h1>
    <p>Please find the attached file.</p>
    </body>
    </html>
    """

    CHARSET = "utf-8"
    client = boto3.client('ses',region_name=aws_region)

    msg = MIMEMultipart('mixed')
    # Add subject, from and to lines.
    msg['Subject'] = subject 
    msg['From'] = sender 
    msg['To'] = recipient    

    msg_body = MIMEMultipart('alternative')
    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(file_name, 'rb').read())

    att.add_header('Content-Disposition','attachment',filename=os.path.basename(file_name))

    if os.path.exists(file_name):
        print("File exists")
    else:
        print("File does not exists")

    # 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)

    try:
        #Provide the contents of the email.
        response = client.send_raw_email(
            Source=msg['From'],
            Destinations=[
                msg['To']
            ],
            RawMessage={
                'Data':msg.as_string(),
            },
            ConfigurationSetName="ConfigSet"
        )
    # 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'])


    # 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)

在触发 lambda 之后,函数到达 response = client.send_raw_email 并且直到 lambda 超时才返回.我的 lambda 超时配置为 3 分钟.

After trigger the lambda the function is reaching to response = client.send_raw_email and never returning until the lambda timesout. My lambda timeout is configured for 3 minutes.

{
  "errorMessage": "2019-07-30T10:14:45.180Z fc3ca995-58f9-4f89-8a35-114d941ee063 Task timed out after 180.06 seconds"
}

任何人都可以帮助使用 Lambda SES Python 发送带附件的电子邮件吗?

Can anyone help to send email with attachment using Lambda SES Python?

你只需要在函数的基本设置下扩展超时值.最长可达 15 分钟.

you just have to extend the timeout value under basic settings of the function. It can go up to 15 mins.