Используемая версия smtplib не поддерживает менеджер контекста. Скорее всего, вы используете Python версию, которая меньше, чем 3.3.
Чтобы понять ошибку, я создал эти два класса и сохранил их вместе с текстовым файлом hello.txt. Первый класс не поддерживает менеджер контекста, и он вызовет ошибку, аналогичную той, что у вас есть, а второй - нет.
class OpenWithOutExit:
'''
This class has no special dunder for enter and exit used to create context manager
'''
def __init__(self, file, mode='r'):
self.data = open(file, mode)
def close(self):
self.data.close()
class OpenWithExit:
'''
This class has special dunder for enter and exit used to create context manager
'''
def __init__(self, file, mode='r'):
self.file = file
self.mode = mode
def __enter__(self):
self.data = open(self.file, self.mode)
return self.data
def __exit__(self, exception_type, exception_value, traceback):
self.data.close()
print('We exist without issue')
if __name__ == '__main__':
# using class context manager
try:
with OpenWithExit('hello.txt') as f:
#do something
pass
except AttributeError as a:
print('This will not print')
# using a class without context manager
try:
with OpenWithOutExit('hello.txt') as f:
# do something
pass
except AttributeError as e:
print('This will cause Attribute exit error')
raise e