Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

ImapLibrary проблема с wait for mail когда нет писем -> AttributeError: 'NoneType' object has no attribute 'split'


(Vital Che) #1

Подключил библиотеку ImapLibrary, но когда использую метод Wait for mail и при этом на почте нет новых писем, то тест падает с ошибкой: AttributeError: ‘NoneType’ object has no attribute ‘split’
Происходит это т.к. msgnums принимает значение None.

О чем сказано тут

IMAP4.recent()

Prompt server for an update. Returned data is None if no new messages, else value of RECENT response.

Кусок из библиотеки

def wait_for_mail(self, fromEmail=None, toEmail=None, status=None,
                      timeout=60):
        """
        Wait for an incoming mail from a specific sender to
        a specific mail receiver. Check the mailbox every 10
        seconds for incoming mails until the timeout is exceeded.
        Returns the mail number of the latest email received.

        `timeout` sets the maximum waiting time until an error
        is raised.
        """
        
        timeout = int(timeout)
        while (timeout > 0):
            self.imap.recent()
            self.mails = self._check_emails(fromEmail, toEmail, status)
            if len(self.mails) > 0:
                return self.mails[-1]
            timeout -= 10
            if timeout > 0:
                time.sleep(10)
        raise AssertionError("No mail received within time")

def _check_emails(self, fromEmail, toEmail, status):
    crit = self._criteria(fromEmail, toEmail, status)
    type, msgnums = self.imap.search(None, *crit)
    if str(msgnums) == "[None]":
    	warnings.warn(str(msgnums))
return msgnums[0].split()

Помогите, пожалуйста, решить эту проблему и заставить работать ожидание новых писем


(Dmitriy Zverev) #2

К сожалению, сейчас нет возможности написать\проверить код, но по вашему описанию всё это похоже на ошибку в библиотеке (хотя у нас ребята не столкнулись с такой проблемой).

Отнаследуйтесь от ImapLibrary и попробуйте переопределить wait for mail
Примерно так:

skip
if not (self.imap.recent() is None):
    self.mails = self._check_emails(fromEmail, toEmail, status)
    if len(self.mails) > 0:
        return self.mails[-1]
timeout -=10
skip

Если Ваше исправление заработает, пришлите, пожалуйста pull_request разработчику.


(Vital Che) #3

Победил! Спасибо за направление. Проверка такая не срабатывает, т.к. self.imap.recent() возвращает:
‘OK’, [None]
решил так:

     skip   
    self.imap.recent()
    if not str(self.imap.recent()) == "('OK', [None])":
            self.mails = self._check_emails(fromEmail, toEmail, status)
            if len(self.mails) > 0:
                return self.mails[-1]
        timeout -= 10