Imaplib imap4 error command search illegal in state auth only allowed in states selected

I'm trying to setup a cron job for django-helpdesk to create tickets from my inbox. I've configured a cron job and then I tried to do this: python manage.py get_email It gives me this error...

I’m trying to setup a cron job for django-helpdesk to create tickets from my inbox. I’ve configured a cron job and then I tried to do this:
python manage.py get_email

It gives me this error:
imaplib.error: command SEARCH illegal in state AUTH, only allowed in states SELECTED

Here’s the full error log:

Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/commercial/.virtualenvs/projects/lib/python2.7/site-packages/django/core/management/__init__.py", line 351, in execute_from_command_line
    utility.execute()
  File "/home/commercial/.virtualenvs/projects/lib/python2.7/site-packages/django/core/management/__init__.py", line 343, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/commercial/.virtualenvs/projects/lib/python2.7/site-packages/django/core/management/base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/commercial/.virtualenvs/projects/lib/python2.7/site-packages/django/core/management/base.py", line 445, in execute
    output = self.handle(*args, **options)
  File "/home/commercial/.virtualenvs/projects/lib/python2.7/site-packages/helpdesk/management/commands/get_email.py", line 73, in handle
    process_email(quiet=quiet)
  File "/home/commercial/.virtualenvs/projects/lib/python2.7/site-packages/helpdesk/management/commands/get_email.py", line 106, in process_email
    process_queue(q, logger=logger)
  File "/home/commercial/.virtualenvs/projects/lib/python2.7/site-packages/helpdesk/management/commands/get_email.py", line 198, in process_queue
    status, data = server.search(None, 'NOT', 'DELETED')
  File "/usr/lib64/python2.7/imaplib.py", line 639, in search
    typ, dat = self._simple_command(name, *criteria)
  File "/usr/lib64/python2.7/imaplib.py", line 1082, in _simple_command
    return self._command_complete(name, self._command(name, *args))
  File "/usr/lib64/python2.7/imaplib.py", line 837, in _command
    ', '.join(Commands[name])))
imaplib.error: command SEARCH illegal in state AUTH, only allowed in states SELECTED

Are there steps I’m missing somewhere? I’m following what is mentioned here:
https://django-helpdesk.readthedocs.io/en/latest/configuration.html

0 / 0 / 0

Регистрация: 26.08.2017

Сообщений: 5

1

Как скопировать отправленные письма в текстовый файл?

24.09.2017, 14:11. Показов 1792. Ответов 8


Хочу создать архив своей электронной переписки в отдельном файле.
С входящими письмами получилось, но не пойму, как выйти на Отправленные письма.
Кто знает, подскажите!

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Garry Galler

Эксперт Python

5403 / 3827 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

24.09.2017, 15:06

2

Цитата
Сообщение от a_shel
Посмотреть сообщение

не пойму, как выйти на Отправленные письма

Каталога с именем OUTBOX для отправленных (наподобие INBOX для входящих) не существует.
Зато существует это:

Код

# идентификаторы папок
folders = {
'Отправленные': b"&BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-",
'Исходящие':    b"&BBgEQQRFBD4ENARPBEkEOAQ1-",
'Спам':         b"&BCEEPwQwBDw-",
'Черновики':    b"&BCcENQRABD0EPgQyBDgEOgQ4-",
'Удаленные':    b"&BCMENAQwBDsENQQ9BD0ESwQ1-"
}

Пример использования:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def mailbox_auth(user,pasw,server,box_type="INBOX"):
    """ аутентификация"""
    box = imaplib.IMAP4(server)
    box.starttls()
    box.login(user, pasw)
    box.select(box_type)
    return box 
    
# пользовательская функция авторизации    
box = mailbox_auth(user,pasw,server,box_type=b'&BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-')
# или так если установить imap_utf7
box = mailbox_auth(user,pasw,server,box_type=imap_utf7.encode('Отправленные'))
mails = mailbox_search_list(box,'ALL')  # пользовательская функция извлечения писем
print(mails)
mailbox_logout(box)



0



0 / 0 / 0

Регистрация: 26.08.2017

Сообщений: 5

24.09.2017, 18:18

 [ТС]

3

Спасибо, Garry Galler!
А не подскажете, что за функция — box.starttls() ?
Как и mailbox_search_list(box,’ALL’) ?



0



Эксперт Python

5403 / 3827 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

24.09.2017, 18:39

4

mailbox_search_list — это просто моя функция получения писем. У вас должна быть своя — вы же как то написали получение входящих. starttls — это функция из imaplib — странно что вы про нее не знаете: The ssl_context argument is optional and should be a ssl.SSLContext object. This will enable encryption on the IMAP connection.
Без создания SSL контекста у вас тот же яндекс выдаст: imaplib.error: LOGIN command error: BAD [b'[PRIVACYREQUIRED] LOGIN Working without SSL/TLS encryption is not allowed.



0



a_shel

0 / 0 / 0

Регистрация: 26.08.2017

Сообщений: 5

24.09.2017, 19:46

 [ТС]

5

Извините, но не посмотрите мой кусок кода. В чем тут ошибка:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def mailbox_auth(user,pasw,server,box_type):
            #аутентификация
            box = imaplib.IMAP4_SSL(server)
            #box.starttls()
            box.login(user, pasw)
            box.select(box_type)
            return box 
    
        n = 0
        tp = input ('Письма: 1 - Входящие, 2 - Отправленные:')
        if tp == '2':
            box_type = b'&BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-' # для Отправленных писем;
        else:
            box_type = 'INBOX' #  для Входящих писем       
        file_subj = open('subj_' + tp + adr + '.txt',"w")
        server = 'imap.' + adr
        # пользовательская функция авторизации          
        m = mailbox_auth(user,pasw,server,box_type) 
        typ, data = m.search(None, 'ALL')  # пользовательская функция извлечения писем

Для Входящих работает нормально, а для Отправленных выдает: imaplib.error: Command SEARCH illegal in state AUTH, only allowed in states SELECTED.



0



Garry Galler

Эксперт Python

5403 / 3827 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

24.09.2017, 20:24

6

У меня работает как с IMAP4starttls, так и с IMAP4_SSL.
Проверьте существует ли папка с указанным идентификатором на сервере:

Python
1
2
3
4
5
6
def get_boxes(box):
    a,folders = box.list()
    return folders or []
 
box = mailbox_auth(user,pasw,server,box_type)
print(get_boxes(box))



0



0 / 0 / 0

Регистрация: 26.08.2017

Сообщений: 5

24.09.2017, 23:51

 [ТС]

7

Спасибо!
Строка в моем случае для gmail.com должна выглядеть так: ‘[Gmail]/&BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-‘
Но вот для яндекса нащупать никак не удается

Добавлено через 18 минут
Еще раз спасибо — всё получилось. На Яндексе папка с Отправленными письмами называется ‘Sent’



0



Эксперт Python

5403 / 3827 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

25.09.2017, 01:06

8

Цитата
Сообщение от a_shel
Посмотреть сообщение

На Яндексе папка с Отправленными письмами называется ‘Sent’

Хм, на моей яндекс почте никакого Sent нет… В случае наличия кириллических наименований папок на пользовательском ящике у них есть только бинарные идентификаторы в utf7.



0



0 / 0 / 0

Регистрация: 26.08.2017

Сообщений: 5

25.09.2017, 01:53

 [ТС]

9

За что купил, за то и продал: по вашему совету вывел список идентификаторов и подобрал подходящий.
Проекты: b’(\Marked \HasNoChildren \ Drafts) “|” Drafts’
Входящие: b’(\Marked \NoInteriors) “|” INBOX’
Исходящие: b’(\Unmarked \HasNoChildren) “|” Outbox’
Отправленные: b’(\Marked \HasNoChildren \ Sent) “|” Sent’
Спам: b’(\Marked \HasNoChildren \ Junk) “|” Spam’
Мусор: b’(\Marked \HasNoChildren \ Trash) “|” Trash’



0



#python #gmail-imap #imaplib

Вопрос:

Я работаю над приложением, которое должно войти в учетную запись электронной почты, чтобы обработать некоторые электронные письма. В этом случае учетная запись электронной почты запускается через google business suite (так что это не домен gmail).

Приложению удается войти в учетную запись электронной почты с помощью этой команды

 mail_client = imaplib.IMAP4_SSL(server) mail_client.login(user, password)  

Затем мне нужно просмотреть входящие, чтобы у меня был код

 mail_client.select("INBOX") (result, messages) = mail_client.search(None, 'ALL')  

Это приводит к ошибке

 imaplib.error: command SEARCH illegal in state AUTH, only allowed in states SELECTED  

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

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

 for i in mail_client.list()[1]:  print(i)  

и результат таков

 b'(HasNoChildren) "/" "INBOX"' b'(HasChildren Noselect) "/" "[Gmail]"' b'(All HasNoChildren) "/" "[Gmail]/All Mail"' b'(Drafts HasNoChildren) "/" "[Gmail]/Drafts"' b'(HasNoChildren Important) "/" "[Gmail]/Important"' b'(HasNoChildren Sent) "/" "[Gmail]/Sent Mail"' b'(HasNoChildren Junk) "/" "[Gmail]/Spam"' b'(Flagged HasNoChildren) "/" "[Gmail]/Starred"' b'(HasNoChildren Trash) "/" "[Gmail]/Trash"'  

Я обнаружил, что код работает, если выбранная папка пуста. Но в тот момент, когда в нем действительно есть почта, я получаю ошибку (даже если раньше она работала пустой). Код также работает, если папка не пуста, но команда поиска ничего не вернет… как в, (result, messages) = mail_client.search(None, '(TO "non-existing@email.address")') … но в тот момент, когда результат поиска что-то вернет, я получаю ошибку.

Но мне нужно специально поискать в папке «Входящие».

Я также немного изменил код, чтобы проверить:

 status, message = mail_client.select('INBOX') print(f"status is {status}") print(f"message is {message}")  

и это дает

 status is OK message is [b'3']  

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

Любая помощь будет очень признательна!

Комментарии:

1. Включите трассировку imaplib (debug=5 или что-то в конструкторе? Вам нужно будет проверить документ здесь) Я ожидаю, что вы каким-то образом отключаетесь, или вход в систему на самом деле не удался. Однако журнал может помочь вам/нам выяснить, что произошло между этими двумя шагами.

Понравилась статья? Поделить с друзьями:
  • Imap сервер сообщает об ошибке bad internal server error
  • Imaginary error function
  • Imagetwist com error this image is deleted or moved from our servers
  • Illegal devices please use genuine как исправить
  • Illegal characters in path как исправить