python用SMTP发送电子邮件,出现错误550


import smtplib
import base64
smtpobj=smtplib.SMTP('smtp.qq.com',587)
smtpobj.ehlo()
smtpobj.starttls()
smtpobj.login('xxxxxx@qq.com',"授权码")
smtpobj.sendmail('"=?utf-8?B?5aSc5q6H?=" <xxxxxxx@qq.com>','xxxxxxxx@163.com',
                 'Subject:so long.\ndear alecw,so long and thanks for all the fish. sincerely,bob')

smtpobj.quit()

出现错误提示

(550, b'The "From" header is missing or invalid. Please follow RFC5322, RFC2047, RFC822 standard protocol. https://service.mail.qq.com/detail/124/995.')
File "C:\python2\发送电子邮件和短信\连接到SMTP服务器.py", line 19, in <module>
    smtpobj.sendmail('<1584635173@qq.com>','cb18675328318@163.com',
smtplib.SMTPDataError: (550, b'The "From" header is missing or invalid. Please follow RFC5322, RFC2047, RFC822 standard protocol. https://service.mail.qq.com/detail/124/995.')

主要问题出现在发送地址上,按提示对地址修改为昵称+<地址>的格式,依然报错,请问有没有遇到相同问题的人。

引用 皆我百晓生 小程序回复内容作答:
根据你的代码和错误提示,看起来问题出现在发送地址的格式上。SMTP服务器要求发送地址的格式按照 RFC5322、RFC2047 和 RFC822 的标准协议。

请尝试按照以下格式修改你的发送地址:

smtpobj.sendmail('昵称 <xxxxxx@qq.com>', 'xxxxxxxx@163.com', 'Subject: so long.\ndear alecw, so long and thanks for all the fish. sincerely, bob')

xxxxxx@qq.com 替换为你的发件人邮箱地址,昵称 替换为你的昵称。确保发送地址的格式符合 RFC 标准,参考错误提示中提供的链接了解详细信息。

如果问题仍然存在,你可以检查以下几点:

  1. 确保你的邮箱地址和授权码是正确的,能够成功登录到 SMTP 服务器。

  2. 检查是否需要启用 "Less secure apps" 选项。对于某些邮箱提供商(如 Gmail),需要在账户设置中启用该选项以允许通过 SMTP 发送邮件。

  3. 检查网络连接和代理设置,确保程序能够正常连接到 SMTP 服务器。

如果以上方法仍然无法解决问题,请提供更多详细信息,例如完整的错误提示,以便进一步排查问题原因。

【以下回答由 GPT 生成】

问题分析: 根据错误提示,问题出现在发送地址上,错误提示要求遵循RFC5322,RFC2047和RFC822标准协议。尽管你尝试使用了昵称+地址的格式,但仍然报错。可能原因是编码问题或者格式不正确。

解决方案: 1. 确保发送地址的格式正确。发送地址应该是邮件地址,类似于'xxxxxxx@qq.com',而不是昵称+地址的格式。 2. 确保邮件的发送者地址和接收者地址都是有效的邮箱地址。 3. 确保邮件主题和内容都符合RFC5322,RFC2047和RFC822标准协议。 4. 确保使用正确的编码方式。对于中文字符,可以使用UTF-8编码。

下面是修改后的代码示例:

import smtplib
from email.mime.text import MIMEText

# 发件人地址
sender = 'xxxxxx@qq.com'
# 接收人地址
receivers = ['xxxxxxxx@163.com']

# 创建邮件对象
message = MIMEText('Dear Alecw, so long and thanks for all the fish.', 'plain', 'utf-8')
message['Subject'] = 'so long.'
message['From'] = sender
message['To'] = ','.join(receivers)

try:
    # 连接SMTP服务器
    smtpobj = smtplib.SMTP('smtp.qq.com', 587)
    smtpobj.ehlo()
    smtpobj.starttls()
    # 登录邮箱账号
    smtpobj.login('xxxxxx@qq.com','授权码')
    # 发送邮件
    smtpobj.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功")
except smtplib.SMTPException as e:
    print("Error: 无法发送邮件")
finally:
    # 退出连接
    smtpobj.quit()

请注意,以上代码中使用了email.mime.text.MIMEText来创建邮件对象,并设置邮件的主题、发件人、收件人等信息。使用message.as_string()将邮件对象转换为字符串形式发送。

希望这个解决方案可以帮助到你!如果还有其他问题,请随时告诉我。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

问题点:发送邮箱地址不符合规范.邮箱地址用<>时, 需要添加 昵称. 要么就直接把<>去掉,那也是可以的.

根据RFC2047, RFC822协议,邮件标头中的'From'形式为:

  1. 邮箱地址形式:prefix@domain, 如 'abc@qq.com'。

  2. 昵称+空格+<邮箱地址>形式:nickname <prefix@domain>,其中,nickname为ASCII字符集中字符组合或编码文本:

(1)如果昵称全为ASCII字符,如'ABC',邮箱地址为'abc@qq.com',则标头中的'From'为'ABC abc@qq.com'。注意'ABC'和'abc@qq.com'之间用空格隔开;

(2)如果昵称包含非ASCII字符,如中文,则请使用base64对昵称进行编码。nickname最终的形式为:"=?" charset "?" encoding "?" encoded-text "?="。其中,charset为字符集;encoding为编码方式,'B'代表base64;encoded-text为编码后的文本。例如,昵称为'QQ邮箱昵称示例',邮箱地址为'abc@qq.com',则对昵称进行base64编码,字符集使用UTF-8,则nickname为 '=?UTF-8?B?UVHpgq7nrrHmmLXnp7DnpLrkvos=?=',最终邮件标头中的'From'为'"=?utf-8?B?UVHpgq7nrrHmmLXnp7DnpLrkvos=?=" abc@qq.com'。注意编码文本和邮件地址间用空格隔开。