LINUX.ORG.RU
решено ФорумAdmin

Немного скриптопты на сон грядущий

 , , ,


0

1

Для одной задачки мне понадобилось вытягивать с шаред-хостинга письма по IMAP. Накалякал такой скриптик на Питоне с библиотекой ImapClient

#!/usr/bin/python3

import email

from imapclient import IMAPClient

HOST = 'imap.yahooo.com'
USERNAME = 'user'
PASSWORD = 'qwerty'

with IMAPClient(HOST) as server:
    server.login(USERNAME, PASSWORD)
    server.select_folder('INBOX', readonly=True)

    messages = server.search('UNSEEN')
    for uid, message_data in server.fetch(messages, 'RFC822').items():
        with open(str(uid), 'wb') as out:
             out.write(message_data[b'RFC822'])
             out.close

Вопрос: говнокод выше будет нормально обрабатывать письма с вложениями? Как его можно ускорить (если писем будет много), чтобы он не был говнокодом? )) Хотелось, чтобы сам код работал максимально быстро и правильно... ну да так бывает редко.

Перемещено Shaman007 из development

★★★★★

Есть еще вот такое народное творчество, но оно многословно и некрасиво, лично мне режет глазки. Совсем не по питоньи :-)

#!/usr/bin/env python
#
# Very simple Python script to dump all emails in an IMAP folder to files.  
# This code is released into the public domain.
#
# RKI Nov 2013
#
import sys
import imaplib
import getpass

IMAP_SERVER = 'imap.domain.tld'
EMAIL_ACCOUNT = "user@mailserv.tld"
EMAIL_FOLDER = "INBOX"
OUTPUT_DIRECTORY = '/home/user/imap_fetcher/'

PASSWORD = getpass.getpass()


def process_mailbox(M):
    """
    Dump all emails in the folder to files in output directory.
    """

    rv, data = M.search(None, "ALL")
    if rv != 'OK':
        print "No messages found!"
        return

    for num in data[0].split():
        rv, data = M.fetch(num, '(RFC822)')
        if rv != 'OK':
            print "ERROR getting message", num
            return
        print "Writing message ", num
        f = open('%s/%s.eml' %(OUTPUT_DIRECTORY, num), 'wb')
        f.write(data[0][1])
        f.close()

def main():
    M = imaplib.IMAP4_SSL(IMAP_SERVER)
    M.login(EMAIL_ACCOUNT, PASSWORD)
    rv, data = M.select(EMAIL_FOLDER)
    if rv == 'OK':
        print "Processing mailbox: ", EMAIL_FOLDER
        process_mailbox(M)
        M.close()
    else:
        print "ERROR: Unable to open mailbox ", rv
    M.logout()

if __name__ == "__main__":
    main()

Взято с гитхаба.

Twissel ★★★★★
() автор топика
Ответ на: комментарий от pawnhearts

Во-первых, ты не поверишь, но я никак не мог вспомнить как он называется (fetchmail) :-D Помнил просто, что такая тулза была.

Во-вторых, он умеет просто сохранять сообщения в соответствии со структурой IMAP-каталогов сервера с которого копирует?

В-третьих, сабж может общаться с dovecot только через procmail?

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: комментарий от Twissel

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

pawnhearts ★★★★★
()

Нет конечно. Вложения хранятся отдельно. Надо получить ID письма и прибавить к нему .1.gzip чтоб получить 1-е вложение. 2.gzip для второго и так далее...

demrnd
()

говнокод выше

Ничего плохого в этом коде нет. Единственное close в конце. Во-первых, он не нужен, оно закроется контекстным менеджером, во-вторых, это питон, методы нужно вызывать.

WitcherGeralt ★★
()
Ответ на: комментарий от Twissel

У меня isync работал заметно быстрее offlineimap. И он есть в Debian в отличие от imapsync, ссылку на исходники которого я так и не нашёл на оф. сайте, на котором создаётся впечатление, что это платный closed source. Репозиторий imapsync я обнаружил, но политика автора немного непривычна. Понять его можно, но отсутствие его известного скрипта в Debian подтверждает неоднозначность такого подхода.

gag ★★★★★
()
Ответ на: комментарий от Twissel

Ещё есть OfflineIMAP, к которому можно писать хуки на сабжевом Python.

mord0d ★★★★★
()

Shaman007, может имеет смысл переместить топик в Admin?

Все-таки задача больше админская.

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Т.е. он просто имел ввиду, что этот метод все равно не вызывается?

Ну да.

Twissel ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.