微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

连接失败 AWS Lambda SMTP 邮件

如何解决连接失败 AWS Lambda SMTP 邮件

我正在尝试从在 AWS lambda 上运行的 Python 容器发送电子邮件。当我在本地测试我的 Lambda 容器时,它工作正常。但是一旦我在 AWS Lambda 上尝试相同的方法,它就会失败并出现以下回溯:

函数返回

{ "errorMessage": "can only concatenate str (not \"bytes\") to str","errorType": "TypeError","stackTrace": [ " File \"/var/lang/lib/python3.8/imp.py\",line 234,in load_module\n return load_source(name,filename,file)\n"," File \"/var/lang/lib/python3.8/imp.py\",line 171,in load_source\n module = _load(spec)\n"," File \"<frozen importlib._bootstrap>\",line 702,in _load\n",line 671,in _load_unlocked\n"," File \"<frozen importlib._bootstrap_external>\",line 848,in exec_module\n",line 219,in _call_with_frames_removed\n"," File \"/var/task/app.py\",line 65,in <module>\n handler(None,None)\n",line 62,in handler\n __send_email(msg)\n",line 22,in __send_email\n server.login(gmail_user,gmail_password)\n"," File \"/var/lang/lib/python3.8/smtplib.py\",line 732,in login\n (code,resp) = self.auth(\n",line 635,in auth\n (code,resp) = self.docmd(\"AUTH\",mechanism + \" \" + response)\n" ] }

日志输出

[ERROR] TypeError: can only concatenate str (not "bytes") to str
Traceback (most recent call last):
  File "/var/lang/lib/python3.8/imp.py",in load_module
    return load_source(name,file)
  File "/var/lang/lib/python3.8/imp.py",in load_source
    module = _load(spec)
  File "<frozen importlib._bootstrap>",in _load
  File "<frozen importlib._bootstrap>",in _load_unlocked
  File "<frozen importlib._bootstrap_external>",in exec_module
  File "<frozen importlib._bootstrap>",in _call_with_frames_removed
  File "/var/task/app.py",in <module>
    handler(None,None)
  File "/var/task/app.py",in handler
    __send_email(msg)
  File "/var/task/app.py",in __send_email
    server.login(gmail_user,gmail_password)
  File "/var/lang/lib/python3.8/smtplib.py",in login
    (code,resp) = self.auth(
  File "/var/lang/lib/python3.8/smtplib.py",in auth
    (code,resp) = self.docmd("AUTH",mechanism + " " + response)

代码

def __send_email(msg:str) -> None:
    gmail_user = os.getenv('EMAIL_USER')
    gmail_password = os.getenv('EMAIL_PASSWORD')

    # Create Email
    mail_from = gmail_user
    mail_to = gmail_user
    mail_subject = f'DB Update today {datetime.today().strftime("%m/%d/%Y")}'
    mail_message = f'Subject: {mail_subject}\n\n{msg}'

    # Send Email
    server = smtplib.SMTP('smtp.gmail.com',587)
    server.starttls()
    server.login(gmail_user,gmail_password)

    server.sendmail(mail_from,mail_to,mail_message)
    server.close()

其他环境变量运行良好,所以我认为问题不是来自这里。

我正在使用以下 docker 镜像:public.ecr.aws/lambda/python:3.8。

感谢您的帮助!

解决方法

我测试了你的函数,它工作正常:

import os
from datetime import datetime

os.environ["EMAIL_USER"] = "<test_email>"
os.environ["EMAIL_PASSWORD"] = "<test password>"

def __send_email(msg:str) -> None:
    gmail_user = os.getenv('EMAIL_USER')
    gmail_password = os.getenv('EMAIL_PASSWORD')

    # Create Email
    mail_from = gmail_user
    mail_to = gmail_user
    mail_subject = f'DB Update today {datetime.today().strftime("%m/%d/%Y")}'
    mail_message = f'Subject: {mail_subject}\n\n{msg}'

    # Send Email
    server = smtplib.SMTP('smtp.gmail.com',587)
    server.starttls()
    server.login(gmail_user,gmail_password)

    server.sendmail(mail_from,mail_to,mail_message)
    server.close()


__send_email("hello world")

此外,我查看了我的一个 lambda,这是我使用 SMTP 发送电子邮件的方式:

import smtplib

smtp_server = "smtp.gmail.com"
smtp_port = 465
smtp_username = "<test_email>"
smtp_passwword = "<test password>"
send_to = "<send_to_email_address>"
send_from = "<send_from_email_address>"
message_to_send = "hello world"


def send_email(msg):
    server = smtplib.SMTP_SSL(smtp_server,smtp_port)
    server.login(smtp_username,smtp_passwword)
    message = f"""From: {send_to}
To: {send_to}
Subject: Test message

{msg}."""
    server.sendmail(send_from,send_to,message)
    server.quit()


send_email(message_to_send)

您能否验证用户名和密码的 env 变量并查看它们是否正确传入。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。