我正在尝试构建一个可以发送 SMTP 电子邮件的 Flask 应用程序。我弄清楚了如何使用 SMTPlib 库发送电子邮件:
from smtplib import SMTP_SSL, SMTP
sender = "[email protected]"
receivers = ["[email protected]"]
message = """From: Ray Drost <[email protected]>
To: Raymon Drost <[email protected]>
Subject: SMTP e-mail test
This is a test e-mail message.
"""
smtpObj = SMTP_SSL(host="smtp.dreamhost.com", port=465)
smtpObj.login("[email protected]", "password censored ;)")
smtpObj.sendmail(sender, receivers, message)
print("Successfully sent email")
但是,当我将相同的代码插入到一个简单的 Flask 应用程序中时,在使用 Postman 向应用程序发送 POST 请求时出现以下错误:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/flask/app.py", line 2190, in wsgi_app
response = self.full_dispatch_request()
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/flask/app.py", line 1486, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/flask/app.py", line 1484, in full_dispatch_request
rv = self.dispatch_request()
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/flask/app.py", line 1469, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
File "/Users/raymondrost/VSCode-Projects/coop-hour-tracker/Backend/API/api.py", line 31, in hourlogging
smtpObj.sendmail(sender, receivers, message)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/smtplib.py", line 908, in sendmail
raise SMTPDataError(code, resp)
smtplib.SMTPDataError: (550, b'5.7.1 Sender domain not allowed. Please read: http://dhurl.org/20b D07')
127.0.0.1 - - [30/Aug/2023 13:25:56] "POST /hourlogging HTTP/1.1" 500 -
据我所知,此错误应该是为了防止人们在电子邮件中欺骗域名,但这不是我在这里所做的。
这是 Flask 应用程序的上下文:
from flask import Flask, request, jsonify
from smtplib import SMTP_SSL, SMTP
# Flask API
api = Flask(__name__)
# Hour Logging Endpoint
@api.route('/hourlogging', methods=['POST'])
def hourlogging():
# Process incoming data
data = request.json
try:
testString = data["test"]
except:
print("Error getting data from json")
sender = "[email protected]"
receivers = ["[email protected]"]
message = f"""From: Ray Drost <[email protected]>
To: Raymon Drost <[email protected]>
Subject: SMTP e-mail test
This is a test e-mail message.
"""
smtpObj = SMTP_SSL(host="smtp.dreamhost.com", port=465)
smtpObj.login("[email protected]", "password censored ;)")
smtpObj.sendmail(sender, receivers, message)
print("Successfully sent email")
# Return a response
responseData = {"response": "Email Sent!"}
return jsonify(responseData)
if __name__ == '__main__':
api.run()
我尝试联系 Dreamhost(我的电子邮件提供商)支持人员,但他们被难住了。我还尝试过使用 Brevo(以前称为 Sendinblue)的免费 SMTP 计划。它似乎工作正常,只是来自 Flask 应用程序的电子邮件根本无法到达。我认为 Brevo 拒绝发送电子邮件的原因与 Dreamhost 相同,我只是不知道原因是什么。