连接失败 AWS Lambda SMTP 邮件
Connection failed AWS Lambda SMTP mail
我正在尝试从 AWS lambda 上的 python 容器 运行 发送电子邮件。当我在本地测试我的 Lambda 容器时,它工作正常。但是,一旦我在 AWS Lambda 上尝试相同的操作,它就会失败并出现以下回溯:
函数return
{ "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", " File \"<frozen importlib._bootstrap>\", line 671, in _load_unlocked\n", " File \"<frozen importlib._bootstrap_external>\", line 848, in exec_module\n", " File \"<frozen importlib._bootstrap>\", line 219, in _call_with_frames_removed\n", " File \"/var/task/app.py\", line 65, in <module>\n handler(None, None)\n", " File \"/var/task/app.py\", line 62, in handler\n __send_email(msg)\n", " File \"/var/task/app.py\", 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", " File \"/var/lang/lib/python3.8/smtplib.py\", 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", line 234, in load_module
return load_source(name, filename, file)
File "/var/lang/lib/python3.8/imp.py", line 171, in load_source
module = _load(spec)
File "<frozen importlib._bootstrap>", line 702, in _load
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 848, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/var/task/app.py", line 65, in <module>
handler(None, None)
File "/var/task/app.py", line 62, in handler
__send_email(msg)
File "/var/task/app.py", line 22, in __send_email
server.login(gmail_user, gmail_password)
File "/var/lang/lib/python3.8/smtplib.py", line 732, in login
(code, resp) = self.auth(
File "/var/lang/lib/python3.8/smtplib.py", line 635, 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()
其他 env 变量运行良好,所以我不认为问题出在此处。
我正在使用以下 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)
您能否验证用户名和密码的环境变量,看看它们是否正确传递。
我正在尝试从 AWS lambda 上的 python 容器 运行 发送电子邮件。当我在本地测试我的 Lambda 容器时,它工作正常。但是,一旦我在 AWS Lambda 上尝试相同的操作,它就会失败并出现以下回溯:
函数return
{ "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", " File \"<frozen importlib._bootstrap>\", line 671, in _load_unlocked\n", " File \"<frozen importlib._bootstrap_external>\", line 848, in exec_module\n", " File \"<frozen importlib._bootstrap>\", line 219, in _call_with_frames_removed\n", " File \"/var/task/app.py\", line 65, in <module>\n handler(None, None)\n", " File \"/var/task/app.py\", line 62, in handler\n __send_email(msg)\n", " File \"/var/task/app.py\", 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", " File \"/var/lang/lib/python3.8/smtplib.py\", 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", line 234, in load_module
return load_source(name, filename, file)
File "/var/lang/lib/python3.8/imp.py", line 171, in load_source
module = _load(spec)
File "<frozen importlib._bootstrap>", line 702, in _load
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 848, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/var/task/app.py", line 65, in <module>
handler(None, None)
File "/var/task/app.py", line 62, in handler
__send_email(msg)
File "/var/task/app.py", line 22, in __send_email
server.login(gmail_user, gmail_password)
File "/var/lang/lib/python3.8/smtplib.py", line 732, in login
(code, resp) = self.auth(
File "/var/lang/lib/python3.8/smtplib.py", line 635, 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()
其他 env 变量运行良好,所以我不认为问题出在此处。
我正在使用以下 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)
您能否验证用户名和密码的环境变量,看看它们是否正确传递。