1. Python / Говнокод #20388

    −245

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    class MyIMAP(object):
        def __init__(self, host, login, password):
            self.conn = imaplib.IMAP4_SSL(host)
            self.conn.login(login, password)
            self.conn.select(readonly=True)
    
        def find_mail(self, mail_addr):
            # Без select не находит
            self.conn.select(readonly=True)
            result, ids = self.conn.search(None, '(TO "%s")' % mail_addr)
    
    imap = MyIMAP(host, login, password)
    # В этот момент приходит емейл
    for i in range(3):
        mail = imap.find_mail("e.mail")
        time.sleep(5)

    Поиск через IMAP не находит письма, пришедшие после логина, если заново не выбрать папку перед поиском https://docs.python.org/2/library/imaplib.html#imaplib.IMAP4.select . ЧЗХ?

    Запостил: 3_14dar, 17 Июля 2016

    Комментарии (57) RSS

    • СЕО-коммент.
      Ответить
    • Питон гавно
      Ответить
    • Может оно во время селекта уже список затягивает? А ищет потом локально.

      Х.з. я бы исходники глянул на твоём месте.
      Ответить
      • >Может оно во время селекта уже список затягивает? А ищет потом локально.
        Да нунах.

        Могу конечно и трафик поснифать, просто интересно - а может это такая фича имапа.
        Ответить
        • Короче, после чтения твоей ссылки и RFC 3501 появилась гипотеза, что у них там в гугле(?) какая-то кеширующая хуйня стоит, которая SEARCH всегда делает из кеша, пока ты не кинешь какую-нибудь команду, которая реально перезапрашивает статус (SELECT, IDLE, NOOP и т.п.).

          Since any command can return a status update as untagged data, the NOOP command can be used as a periodic poll for new messages or message status updates during a period of inactivity (this is the preferred method to do this).

          Попробуй self.conn.noop() перед search.
          Ответить
          • Я с яндексом работал.

            Проблему я уже решил, просто время на это говно потратил.
            Ответить
            • Ну хуй знает, все настоящие клиенты всяко либо реконнектятся либо дрочат NOOP в цикле, либо висят в IDLE. Видимо и решили оптимизнуть под них, чтобы SEARCH'и подряд быстрее отрабатывали и основную базу не дрочили...
              Ответить
            • Ну либо пытаются так спастись от говноскриптов, которые дрочат тяжёлый SEARCH каждые 5 секунд :)
              Ответить
    • ؀𖠆𖠇𖠄𖠁𖠦𖠸𖡒𖡦𖢋𖢚𖢰𖣁𖣘𖣐𖢸𖤠¤ð–¤³ð–¤ºð–¥™ð–¥ˆð–¨·ð–¨¦ã„ â£¿â£…⣐⣡ꔆ꘠𐩿𐩾𐩼𓀁𓀎𓀍𓀬𓀭𓀯𓀰 𓀱𓂨𓃂𓃟𓃤𓅦𓈮𓈔𓋨𓋙 𓍝𓍪𓐮𓐒𒀝߷ᮮⴿꨑ
      Ответить
    • Может просто особенность сервера? Смирись и воткни костыль.
      Ответить
      • Нет http://stackoverflow.com/questions/28190765/python-imaplib-get-new-gmail-mails-without-reconnect
        Ответить
        • Что это? Очередная "смишная" шутка?
          Ответить
        • И че нет? Что в твоей ссылке отрицает сообщение, на которое ты ответил?
          Ответить
          • Нет, не особенность сервера. Там гугл, у меня яндекс. Если интересно, можешь еще на каком-нибудь серваке проверить.
            Ответить
    • imaplib.error: LOGIN command error: BAD ['[PRIVACYREQUIRED] LOGIN Working without SSL/TLS encryption is not allowed. Please visit http://help.yandex.ru/mail/mail-clients/ssl.xml sc=Xtfdkv0uSa61_181955_4h']

      Ну охуеть, даже не поснифать теперь.
      Ответить
      • socat
        Ответить
        • Как оно должно помочь снять / завернуть в TLS и как эту хрень завести под виндой?
          Ответить
        • Завелось уже. Как теперь игнорить эту хрень > 2016/07/18 22:47:07.625000 length=52 from=18 to=69 и почему он вылетает после каждого коннетка?
          Ответить
        • http://stackoverflow.com/questions/9596594/why-is-fork-needed-by-socat-when-connecting-to-a-web-server

          Эту хуйню надо по любому перестартовывать извне после каждого соединения?
          Ответить
        • Вещь рабочая, но ебаться с ней много надо для первого раза.
          Ответить
    • Signature: conn.search(charset, *criteria)
      Docstring:
      Search mailbox for matching messages.

      (typ, [data]) = <instance>.search(charset, criterion, ...)

      'data' is space separated list of matching message numbers.

      Это, блядь, к тезису об охуительном удобстве питона и вот этом, блядь, говновысере http://xkcd.ru/353/ . Даже это ближе к реальности https://new.vk.com/13studiya
      Ответить
      • То есть, возвращается массив с одной строкой с числами, разделенными пробелом.
        Ответить
        • Просто тонкий имап-клиент. Строка с числами - это то, что возвращает сервер на команду SEARCH. Либа отдает этот высер как есть.
          И да, я уже за тебя погуглил:
          https://hg.python.org/cpython/file/2.7/Lib/imaplib.py#l629 - search() просто шлет команду SEARCH на сервер. Так что это сервер не ищет тебе письма, а не питон.
          Вот тебе еще справка по протоколу на всякий случай https://tools.ietf.org/html/rfc3501#section-6.4.4
          Ответить
          • >Просто тонкий имап-клиент.
            http://xkcd.ru/353/ после этого немного не того ожидаешь. Почему бы тогда просто с сокетом не работать?

            Ты выше читал? У меня завелся уже этот пиздосокат, я видел что там передается. Т.е. оно один в один транслируется в команды imap.
            Ответить
            • > Почему бы тогда просто с сокетом не работать?
              Потому что с сокетом тебе надо вручную формировать команды и парсить ответы, а либа за тебя все это делает.
              Ответить
              • Нихуя она не делает.

                '(TO "%s")' - запросы вводятся вручную, флаги тоже. Луркай imapclient, что ли. Либа-хуиба. Ты не с сишки пришел?
                Ответить
                • Не нравится - не ешь. Заебало твое нытье.
                  Ответить
                  • Не нравится - не читай. На пхп пиздеть все горазды.
                    Ответить
                • она отлично все делает. Ты наверное думаешь что по сокету строки ходят, да?
                  Ответить
                  • Ага. http://pastebin.com/QNXnMp5Z
                    Ответить
                    • лол, похоже ты правда так думаешь)
                      давай я тебе тайну открою: в TCP нет понятия "строка"
                      там ходят октеты
                      Ответить
                      • А строка - это последовательность октетов, заканчивающаяся октетом \r, \n или \r\n.

                        иди кому-то другому мозги еби.
                        Ответить
      • в питоне всегда было принято иметь две либы:

        1) лоу левел (типизированная обертка вокруг сырого протокола или внешней тулзы типа p4)
        2) хай левел (красивая хуита для ленивых)

        И это, в общем, правильно: потому что если у тебязавтра сервер начнет уметь расширение Foo, то лоу левел либа будет его так же понимать.

        Не нравится такой подход? Хочешь жырного абстрактого пафоса? Хочешь понятие ``Store`` как в жабе?
        Ответить
        • Примеры приведешь этих двух типов для одних и тех же протоколов?

          Хочу нормальных либ вроде requests. Бля, да вся встроенная сетевая библиотека питона пальцем деланая, что http(s), который уебанский и не может в сертификаты, что все остальное. Даже сокеты - калька с си и сосут даже у перла, где один конструктор для любого сокета.
          Ответить
          • httplib -- Requests package

            вот тебе пример
            Ответить
            • Ты наверно это хотел сказать:

              в питоне всегда было принято иметь две либы:
              1) Уебанская встроенная
              2) Нормальная сторонняя?

              Только вот уебанская встроенная - это первое с чем сталкиваешься. А еще сторонняя может за нехуй с сегодня на завтра перестать работать.
              Ответить
    • Так, я что-то не понял - с каких это пор Пидар ушёл напитон?
      Ответить
      • А тебе мама не рассказывала? Она вчера у меня была, правда она могла не видеть что я делаю - под столом сидела.
        Ответить
        • Посасываешь там, небось, у немчуры. Ну и как, вкусно? Шлюхин сын.
          Ответить
          • Не я, а у меня, и не немчура, а мама госта.

            А что такое? Рубль снова упал? Почему такой багет? Птеродактилем еще назвать не хочешь?
            Ответить
        • ты, еблан, думаешь что пишешь?
          на оскорбления родителей давай не переходи
          Ответить
          • Мама госта, залогиньтесь под своим акком.
            Ответить

    Добавить комментарий