使用Python发送带Excel附件的Outlook邮件报错,求解决方案
问题排查与修复
错误原因分析
TypeError: an integer is required (got type str) 出现在open(excel_file)行,核心原因及附带问题如下:
- 内置
open函数被其他同名函数覆盖(比如从第三方库导入了要求第一个参数为整数的open函数); - SMTP连接配置错误:
smtplib.SMTP_SSL对应端口应为465,587是SMTP配合starttls()使用的端口; - 附件文件名传了全路径,收件人会看到冗长的路径名,体验不佳。
修复后的完整代码
import smtplib from email.message import EmailMessage import os import builtins # 配置邮箱信息 SENDER_EMAIL = "your_outlook_email@outlook.com" APP_PASSWORD = "your_app_password" recipient_email = "recipient@example.com" subject = "测试邮件" content = "这是带有Excel附件的测试邮件" excel_file = r'D:\vvvv\bbbb\aaaa\xxxx\abc.xlsx' def send_mail_with_excel(recipient_email, subject, content, excel_file): msg = EmailMessage() msg['Subject'] = subject msg['From'] = SENDER_EMAIL msg['To'] = recipient_email msg.set_content(content) # 强制使用Python内置open函数,避免被覆盖 with builtins.open(excel_file, 'rb') as f: file_data = f.read() # 提取纯文件名作为附件显示名 filename = os.path.basename(excel_file) # 使用标准xlsx MIME类型 msg.add_attachment(file_data, maintype="application", subtype="vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename=filename) # 修正SMTP连接:587端口配合starttls加密 with smtplib.SMTP('smtp-mail.outlook.com', 587) as smtp: smtp.starttls() smtp.login(SENDER_EMAIL, APP_PASSWORD) smtp.send_message(msg) send_mail_with_excel(recipient_email, subject, content, excel_file)
关键修复点说明
锁定内置
open函数:
显式调用builtins.open,彻底避免第三方库同名函数的干扰,确保文件读取正常。修正SMTP连接方式:
- 若偏好
SMTP_SSL,可改用465端口:with smtplib.SMTP_SSL('smtp-mail.outlook.com', 465) as smtp: smtp.login(SENDER_EMAIL, APP_PASSWORD) smtp.send_message(msg) - 587端口配合
starttls()是更通用的加密连接方式,兼容性更好。
- 若偏好
优化附件显示:
用os.path.basename提取纯文件名,收件人看到的附件名会是abc.xlsx而非完整路径。标准MIME类型:
使用vnd.openxmlformats-officedocument.spreadsheetml.sheet作为xlsx文件的MIME子类型,确保邮件客户端正确识别附件格式。
内容的提问来源于stack exchange,提问作者Eashwar GV
相关产品推荐
相关产品推荐

