Ошибка атрибута: объект «байт» не имеет атрибута «рассказать»

#python #image #smtplib #imghdr

Вопрос:

Я использую email.message и smtplib отправляю электронные письма с помощью python. Когда изображение отправляется как вложение, возникает эта ошибка:

 AttributeError: 'bytes' object has no attribute 'tell'
 

Вот код для вложения изображения:

 if filetype.lower() in ['jpg','jpeg','png','gif']:
    with open(filename, 'rb') as file:
        file_data = file.read()
        image_type = imghdr.what(file_data)
    
    actual_filename = filename.split('/')[-1]
    msg.add_attachment(file_data, maintype='image', subtype=image_type, filename=actual_filename)
 

Ответ №1:

Скорее делать

 with open(filename, 'rb') as file:
    file_data = file.read()
    image_type = imghdr.what(file_data)
 

вы могли бы сделать

 image_type = imghdr.what(filename)
with open(filename, 'rb') as file:
    file_data = file.read()
 

как imghdr.what(file, h=None) и делает

Проверяет данные изображения, содержащиеся в файле с именем по файлу, и возвращает строку, описывающую тип изображения. Если указан необязательный параметр h, аргумент файла игнорируется, и предполагается, что h содержит поток байтов для тестирования.