def test001_imapclient_can_create_folder_in_imap():
    """
    Client can create folders in his mail.

    Steps:
    - Start imap server, should succeed.
    - List default folder, inbox should be there.
    - Create new folder, should succeed.
    """
    global servers
    servers = []

    cmd = "kosmos 'j.servers.imap.start()'"
    info("Execute {} in tmux main session".format(cmd))
    pan = j.servers.tmux.execute(cmd=cmd)
    info("Wait for 30s to make sure that the server is running")
    sleep(30)
    info("Assert that the server is running")
    assert pan.cmd_running is True, "imap server is not running"
    servers.append(pan)

    info("List default folder, inbox should be there")
    box = Imbox("0.0.0.0", "*****@*****.**", "randomPW", ssl=False, port=7143)
    # assert "INBOX" in str(box.folders()[-1][0])
    # assert the whole string instead of the first element in the tuple as it is ordered alphabetically.
    assert "INBOX" in str(box.folders()[-1])

    info("Connect the client to the IMAP server")
    client = IMAPClient("0.0.0.0", port=7143, ssl=False)
    client.login("*****@*****.**", "randomPW")

    box_name = j.data.idgenerator.generateXCharID(10)
    info("Create {} box".format(box_name))
    client.create_folder(box_name)

    info("Assert that the new box has been created")
    # assert box_name in str(box.folders()[-1][0])
    # assert the whole string instead of the first element in the tuple as it is ordered alphabetically.
    assert box_name in str(box.folders()[-1])
Exemple #2
0
class EmailRecv(EmailBase):
    """
        messages.sent_from	发件人
        messages.sent_to	收件人
        messages.subject	邮件主题
        messages.date	发送日期
        messages.body['plain']	文本格式的正文
        messages.body['html']	HTML格式的正文
        messages.attachments	附件
        messages.parsed_date datetime 类型
    """

    def __init__(self, *args, **kwargs):
        self._server = None
        super(EmailRecv, self).__init__(*args, **kwargs)

    def _login(self, *args, **kwargs):
        if not isinstance(self._server, Imbox):

            self._server = Imbox(self._host, username=self._user,
                                 password=self._pwd, port=self._port, *args, **kwargs)

        return self._server

    def logout(self, *args, **kwargs):
        """
        退出
        :param args:
        :param kwargs:
        :return:
        """
        if isinstance(self._server, Imbox):
            try:
                self._server.logout()
            except Exception as e:
                logging.error('logout error %s', e)

    def folders(self):

        temp_list = list()

        folder_tuple = self._server.folders()
        if folder_tuple[0] != 'OK':
            return
        for folder in folder_tuple[1]:
            readable_folder = mail_decode(folder)
            temp_list.append(readable_folder.split()[-1].strip('"'))
        return temp_list

    def mark_seen(self, uuid):
        """
        标记本邮件已读
        :param uuid: 邮箱唯一编号
        :return:
        """
        self._server.mark_seen(uuid)

    def mark_flag(self, uuid):
        """
        标记红旗邮件
        :param uuid: 邮箱唯一编号
        :return:
        """
        self._server.mark_flag(uuid)

    def delete(self, uuid):
        """
        删除邮件
        :param uuid: 邮箱唯一编号
        :return:
        """
        self._server.delete(uuid)

    def read(self, **kwargs):
        """
        param folder:
              INBOX: (收件箱)
              草稿箱
              已发送
              已删除
              垃圾邮件
              病毒邮件
              广告邮件
        param unread: 未读邮件 bool
        param unflagged: 不是红旗邮件 bool
        param flagged: 红旗邮件 bool
        param sent_from: 读取某个发件人的邮件 str
        param sent_to: 读取某个收件人的邮件 str
        param date__gt: 某天之后
        param date__lt: 某天之前 datetime.date(2019, 10, 28)
        param lookup_error_ignore: 忽略LookUpError 错误 Bool
        param date__on:某天
        param subject: 主提邮件
        :param kwargs:
        :return: iter obj  example (email_id: str, msg:object )
        """
        lookup_error_ignore = kwargs.pop('lookup_error_ignore', False)

        self.__parser_folders(kwargs)
        all_messages = self._server.messages(**kwargs)
        if lookup_error_ignore:
            return self.iter_all_messages(all_messages)
        return all_messages

    @staticmethod
    def iter_all_messages(all_messages):
        n = 0
        length = len(all_messages._uid_list)  # noqa
        while n < length:
            try:
                uid = all_messages._uid_list[n]  # noqa
                msg = all_messages._fetch_email(uid)  # noqa
                n += 1
                yield uid, msg
            except LookupError as e:
                logging.error('uid %s error %s', uid, e)  # noqa
                n += 1

    @staticmethod
    def __parser_folders(folder_other):
        folder = folder_other.pop('folder', None)
        if folder:
            folder_other['folder'] = mail_encode(folder)

    def copy(self, uid, destination_folder):
        """

        :param uid: 邮箱唯一编号
        :param destination_folder: 目标文件夹
        :return:
        """

        return self._server.copy(uid, destination_folder)

    def move(self, uid, destination_folder):
        """
        :param uid: 邮箱唯一编号
        :param destination_folder: 目标文件夹
        :return:
        """
        self._server.move(uid, destination_folder)