smtplib发送带Zip附件邮件时Gmail收件方退回的问题如何解决
问题核心原因
你遇到的附件变为.bin文件、邮件被Gmail退回的问题,首先由代码参数错误导致,修复代码后配合调整发件规则即可完全解决:
代码修复方案
你代码中add_header方法未给附件指定带.zip后缀的文件名,邮件客户端无法识别附件格式,会自动将无名称的二进制附件转为.bin文件,同时这类无格式标识的二进制附件本身就会触发Gmail的安全拦截规则。
修复后的代码如下:
def send_mail(zips_folder): import smtplib from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders sender_email = "senderEmail@outlook.com" receiver_email = "receiverEmail@gmail.com" message = MIMEMultipart() message["From"] = sender_email message['To'] = receiver_email message['Subject'] = "subject" # 用with语法自动管理文件句柄,避免资源泄露 zip_file_path = r"C:\Users\Full File Path to Zip File\Zip File Name.zip" with open(zip_file_path,'rb') as zf: # 用更准确的zip MIME类型替换通用二进制类型,降低拦截概率 obj = MIMEBase('application', 'zip') obj.set_payload(zf.read()) encoders.encode_base64(obj) # 补充完整附件文件名,用引号包裹避免特殊字符解析错误 obj.add_header('Content-Disposition', "attachment", filename= "Zip File Name.zip") message.attach(obj) my_message = message.as_string() email_session = smtplib.SMTP("smtp-mail.outlook.com", 587) email_session.starttls() email_session.login(sender_email, 'email password') email_session.sendmail(sender_email, receiver_email, my_message) email_session.quit() print("YOUR MAIL HAS BEEN SENT SUCCESSFULLY")
Gmail拦截补充规避规则
- 如果你的zip压缩包内包含
.exe、.bat、.cmd、.js等可执行文件,Gmail会默认拦截该类附件,哪怕压缩后也会被识别。如果确实需要发送此类文件,可以将zip包设置解压密码后再发送,同时在邮件正文中告知收件人解压密码 - 避免邮件只有附件没有正文内容,补充正常的正文说明可以大幅降低被判定为垃圾邮件的概率
- 新注册的Outlook账号不要短时间内大量发送带附件的邮件,否则会触发Gmail的反垃圾风控规则
内容的提问来源于stack exchange,提问作者SSerb1989
相关产品推荐
相关产品推荐

