使用smtplib发送邮件时收件人被归入BCC列表,无法接收邮件求助
使用smtplib发送Outlook邮件时收件人异常的问题排查
嘿,我帮你找到了问题的核心——你没有在邮件内容里明确指定To(收件人)头信息,这才导致Outlook把收件人识别成BCC,而且收件人收不到邮件。咱们来详细拆解下:
问题根源
你当前的代码里,sendmail方法虽然指定了收件人,但邮件本身的内容里只有Subject和正文,缺少了To这个核心头字段。SMTP协议中,sendmail的参数是告诉服务器要投递的地址,但邮件内容里必须包含对应的头信息,否则邮件客户端(比如Outlook)会无法正确解析收件人,甚至服务器可能会判定这封邮件不规范,直接拦截或者放到垃圾邮件池里。
另外你代码里的Subject: Mail test .多了个多余的空格,虽然不是主要问题,但顺手修正下会更规范。
修复后的代码示例
我给你调整了代码,主要就是补上了To头,同时优化了代码的可读性:
import smtplib # 先把配置信息单独提取,方便后续修改 sender_email = "user1@outlook.com" receiver_email = "user2@outlook.com" password = "pass" # 构建符合标准格式的邮件内容:头信息+空行+正文 mail_content = f"""To: {receiver_email} Subject: Mail test Email's BODY text Your :: Signature/Initials """ try: # 连接SMTP服务器并完成发送流程 server = smtplib.SMTP('smtp-mail.outlook.com', 587) server.ehlo() server.starttls() server.login(sender_email, password) server.sendmail(sender_email, receiver_email, mail_content) print("邮件发送成功啦!") except Exception as e: print(f"发送失败:{str(e)}") finally: server.quit()
额外注意事项
- 如果你的Outlook账号开启了两步验证,直接用原密码登录会失败,需要去微软账户后台生成应用专用密码来替代登录密码
- 邮件头信息的格式要严格遵守:每个头字段(To、Subject)单独占一行,头信息和正文之间必须空一行,这是邮件的标准格式要求
- 如果需要添加多个收件人、抄送或密送,
To头里可以用逗号分隔多个邮箱,同时sendmail的第二个参数传入邮箱列表即可,比如[receiver_email, cc_email]
内容的提问来源于stack exchange,提问作者user3254437
相关产品推荐
相关产品推荐

