AttributeError: экземпляр SMTP_SSL не имеет атрибута __exit__ - PullRequest
0 голосов
/ 24 апреля 2020

Я знаю, что есть другие подобные вопросы, но я следовал за ответами, и у меня все еще была та же ошибка, мой код:

import csv, smtplib, ssl

message = """Subject: Test

Hi {name}"""
from_address = "random@gmail.com"
password = "pasword"



context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
    server.login(from_address, password)
    with open("contacts_file.txt") as file:
        reader = csv.reader(file)
        next(reader)
        next(reader) 
        for number, name, email in reader:
            server.sendmail(
                from_address, email, message.format(name=name)
            )
        server.quit()

Спасибо!

1 Ответ

0 голосов
/ 24 апреля 2020

Используемая версия 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
...