Python, парсинг ссылок из сообщения электронной почты poplib

Я пытаюсь извлечь ссылки из сообщений электронной почты, загруженных с моего сервера pop3

Я пытаюсь разобрать тело сообщения электронной почты, которое соответствует пропущенной в строке темы. Я использую модуль poplib для получения писем с сервера с кодом ниже:

def pop3_return_all_messages(user="", password="", pop_address="", subject=None):
    pop_conn = poplib.POP3_SSL(pop_address)
    pop_conn.user(user)
    pop_conn.pass_(password)
    #Get messages from server:
    for m in pop_conn.list()[1]:
        idx = int(m.split()[0])
        # we use top(), not retr(), so that the 'read'-flag isn't set
        head, body = parse_email(pop_conn.top(idx, 8192)[1]) #build dict of values for head and body
        if subject in head["subject"]: #if subject matches
            get_link(body)

Синтаксический анализ электронной почты выполняется с помощью parse_email, который генерирует словарь для заголовка и тела письма:

def parse_email(lines):
    '''Splits an email provided as a list of lines into a dictionary of
    header fields and a list of body lines. Returns a (header, body)
    tuple.
    '''
    part = 0
    head = {}
    body = []
    for ln in lines:
        if part == 0:
            if not ln.strip():
                part = 1
                continue
            i = ln.find(':')
            if i <= 0:
                continue
            head[ln[:i].strip().lower()] = ln[i+1:].strip()
        else:
            body.append(ln)
    return head, body

Вот получить ссылки, которые пытаются создать список ссылок.

def get_link(body):
    def get_line(body):
        for item in body:
            yield item
    links = [] #empty list for links
    multipart_link = [] #empty list for multiline links
    for line in get_line(body):
        if "http" in line: #If a link has been found
            if ">" in line: #If that link ends on the same line (single line link)
                links.append(line) #add to links list
            else: #multiline link detected
                multipart_link.append(line) #add current line
                for item in xrange(1,10):
                    if ">" not in get_line(body):
                        multipart_link.append(line) #
                    else:
                        multipart_link.append(line)
                        print multipart_link
                        break #last part of multipart link, exit
                multi_link = "".join(multipart_link) #join up multipart link
                links.append(multi_link) #add to links
                multipart_link.pop() #clear multipart links
    return links

Все под

else: #multiline link detected

Я не могу добраться до работы. По сути, я хочу обнаружить многострочные ссылки, которые используют более одного значения словаря, каждую строку, которую необходимо добавить, вплоть до окончания ссылки. Это будет, когда> обнаружен.

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

0 ответов

Другие вопросы по тегам