You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python用email.message与smtplib发图片附件报bytes对象无tell属性错误

报错原因
  • 报错触发自imghdr.what(file_data)这行代码:imghdr.what() 第一个位置参数要求传入文件路径字符串或者已打开的文件对象,你传入了file.read()得到的字节串file_data,函数内部尝试调用传入对象的tell()方法读取文件指针位置,而字节串类型没有tell()方法,因此抛出该异常。
解决方案

提供两种可直接使用的修改方案:

方案1:直接传入文件对象识别类型

调整读取和识别的顺序,把打开的文件对象传给imghdr.what(),识别完成后再读取字节内容:

if filetype.lower() in ['jpg','jpeg','png','gif']:
    with open(filename, 'rb') as file:
        # 先传文件对象识别类型
        image_type = imghdr.what(file)
        # 识别完成后再读取字节内容
        file_data = file.read()
    
    actual_filename = filename.split('/')[-1]
    msg.add_attachment(file_data, maintype='image', subtype=image_type, filename=actual_filename)

方案2:传入字节内容到第二个参数

如果已经提前读取了字节内容,可以将字节内容传给imghdr.what()的第二个参数h,第一个参数填None即可:

if filetype.lower() in ['jpg','jpeg','png','gif']:
    with open(filename, 'rb') as file:
        file_data = file.read()
        # 字节内容传给第二个参数h
        image_type = imghdr.what(None, h=file_data)
    
    actual_filename = filename.split('/')[-1]
    msg.add_attachment(file_data, maintype='image', subtype=image_type, filename=actual_filename)

内容的提问来源于stack exchange,提问作者Coder Station

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:39:02