550, b'[SPF] 域的 SPF 记录禁止此主机代表域发送邮件\n

550, b'[SPF] The SPF record for domain prohibits this host from sending mail on\nbehalf of domain

提问人:ser-zhm 提问时间:10/11/2023 更新时间:10/11/2023 访问量:35

问:

我有一个简单的 Flask 表单,用户可以在其中向我发送消息。代码如下:

def send_general_query(email, message, name):        
    receiver_email = sender_email = Config.SMTP_SENDER
    msg = MIMEMultipart()
    msg['Subject'] = 'Message'
    msg['From'] = email
    msg['To'] = receiver_email
    html = f"""
        <!DOCTYPE html>
        <html lang="en">
        <head>
          <meta charset="UTF-8">
        </head>
        <body>
        <p>From: {name}</p>            
        <p>{message}</p>
        </body>
        </html>
    """
    msgText = MIMEText(html, 'html')
    msg.attach(msgText)
    try:
        with smtplib.SMTP(Config.SMTP_SERVER, 587) as 
smtpObj:
            smtpObj.ehlo()
            smtpObj.starttls()
            smtpObj.login(Config.SMTP_SENDER, Config.SMTP_PASSWORD)
            smtpObj.sendmail(sender_email, receiver_email, 
msg.as_string())
    except Exception as e:
        print(e)

所以它基本上是把电子邮件发给自己。当我使用一些众所周知的域(如 gmailyahoo)测试表单时,我没有收到任何错误,邮件会发送到我的邮箱。 但是当我以表单使用其他自定义电子邮件域时,我得到以下 SPF 失败:

(550, b'[SPF] custom_domain.com 的 SPF 记录禁止此主机 发送邮件\n代表 From: 邮件头中找到的custom_domain.com。')

我认为这是因为我与sender_email = (Config.SMTP_SENDER)msg['From'] = email

我试图将 SPF 记录包含在我的 DNS 中,如下所示:

“v=spf1 include:_spf.custom_domain.com ~all”

但表单 STIL 返回相同的错误。 我当然可以将此行留空并在电子邮件正文中返回用户的电子邮件,但是当我想使用我的邮箱回复用户时,我需要手动将该电子邮件复制/粘贴到标题中。 为什么代码接受某些域之间的不匹配,而不接受其他域?msg['From'] = ''sender_emailmsg['From']

python 电子邮件 flask dns smtplib

评论

1赞 tripleee 10/11/2023
这是因为此域的 SPF 策略说您不被允许这样做。要么将 SPF 更改为更宽松(如果您有能力这样做,并且了解后果),要么使用不允许这样做的其他域。不是编程问题。
0赞 ser-zhm 10/11/2023
对于面临相同问题的人,解决方案可能是将变量转换为并在后面添加额外的空格。标头的最后一行是 。这种方法适用于上述代码,将邮件发送到任何域并回复发件人而不会出现问题。emailstr&nbspmsg['From'] = str(email)+'&nbsp'
0赞 tripleee 10/11/2023
起作用的原因是该地址不再有效;可以很容易地用任何其他字符串替换,只要它不再与具有严格 SPF 记录的现有域匹配。你可能想用一个不那么令人不安的字符串来破坏它(也许用“.cοm”替换“.com”?),或者,再次,从你实际被允许发送的域发送。From:&nbsp
0赞 ser-zhm 10/11/2023
出于某种原因,当我试图用这样的空引号替换它时,它没有奏效。至少它现在有效,我很高兴。域是固定的,我真的不想更改它。我没有尝试过问号,而是其他字符。表单传递消息,但我只需点击“回复”按钮并将消息发送回用户,因为电子邮件地址无效。msg['From'] = str(email)+''
0赞 tripleee 10/11/2023
因为在字符串的末尾添加一个空字符串根本不会改变它。

答: 暂无答案