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
これは、リンクのリストを構築しようとする get links です。
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
仕事に行けない。基本的に、リンクが終了するまで、追加する必要がある各行を複数の辞書値にまたがる複数行のリンクを検出したいと考えています。これは、> が検出された場合です。
ここで壁にぶち当たりました。単一行のリンクは問題なく取得できますが、マルチパートのリンクは苦労しているので、助けていただければ幸いです。明らかに、生成されたリンクをクリーンアップする必要がありますが、後でそのための正規表現を作成できます。