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
相关产品推荐
相关产品推荐

