Browse Source

Use standard lib to parse addr in email

Guénaël Muller 7 years ago
parent
commit
d4f675010e
2 changed files with 10 additions and 16 deletions
  1. 8 10
      tracim/tracim/lib/email_fetcher.py
  2. 2 6
      tracim/tracim/lib/test_email_fetcher.py

+ 8 - 10
tracim/tracim/lib/email_fetcher.py View File

@@ -6,7 +6,7 @@ import json
6 6
 from typing import Union
7 7
 from email.message import Message
8 8
 from email.header import Header, decode_header, make_header
9
-from email.utils import formataddr,parsedate_tz,mktime_tz
9
+from email.utils import parseaddr,parsedate_tz,mktime_tz
10 10
 from email import message_from_bytes
11 11
 
12 12
 import requests
@@ -30,10 +30,11 @@ def decode_mail(msg:Message)-> dict:
30 30
     try:
31 31
         mailData['subject'] = str_header(msg['subject'])
32 32
         mailData['msg_id'] = str_header(msg['Message-ID'])
33
-        mailData['from'] = str_header(msg['From'])
33
+        mailData['from'] = parseaddr(msg['From'])[1]
34 34
         # Reply key
35
-        mailData['to'] = str_header(msg['To'])
36
-        mailData['references'] = str_header(msg['References'])
35
+        mailData['to'] = parseaddr(msg['To'])[1]
36
+
37
+        mailData['references'] = parseaddr(msg['References'])[1]
37 38
         if TRACIM_SPECIAL_KEY_HEADER in msg:
38 39
             mailData[TRACIM_SPECIAL_KEY_HEADER] = str_header(msg[TRACIM_SPECIAL_KEY_HEADER])
39 40
         # date
@@ -70,13 +71,10 @@ def get_tracim_content_key(mailData:dict) -> Union[str,None]:
70 71
     if key is None and 'to' in mailData:
71 72
         key = find_key_from_mail_adress(mailData['to'])
72 73
     if key is None and 'references' in mailData:
73
-        mail_adress = mailData['references'].split('>')[0].replace('<', '')
74
+        mail_adress = mailData['references']
74 75
         key = find_key_from_mail_adress(mail_adress)
75 76
     return key
76 77
 
77
-def get_email_address_from_header(header:str) -> str:
78
-    return header.split('<')[1].split('>')[0]
79
-
80 78
 def find_key_from_mail_adress(mail_address:str) -> Union[str,None]:
81 79
     """ Parse mail_adress-like string
82 80
     to retrieve key.
@@ -95,7 +93,7 @@ def find_key_from_mail_adress(mail_address:str) -> Union[str,None]:
95 93
 
96 94
 class MailFetcher(object):
97 95
 
98
-    def __init__(self,host,port,user,password,folder,delay,endpoint):
96
+    def __init__(self, host, port, user, password, folder, delay, endpoint):
99 97
         self._connection = None
100 98
         self._mails = []
101 99
         self.host = host
@@ -175,7 +173,7 @@ class MailFetcher(object):
175 173
             mail = self._mails.pop()
176 174
             decoded_mail = decode_mail(mail)
177 175
             msg = {"token" : VALID_TOKEN_VALUE,
178
-                   "user_mail" : get_email_address_from_header(decoded_mail['from']),
176
+                   "user_mail" : decoded_mail['from'],
179 177
                    "content_id" : get_tracim_content_key(decoded_mail),
180 178
                    "payload": {
181 179
                        "content": decoded_mail['body']

+ 2 - 6
tracim/tracim/lib/test_email_fetcher.py View File

@@ -1,5 +1,5 @@
1 1
 from email_fetcher import decode_mail, get_tracim_content_key,\
2
-    TRACIM_SPECIAL_KEY_HEADER,find_key_from_mail_adress,get_email_address_from_header
2
+    TRACIM_SPECIAL_KEY_HEADER,find_key_from_mail_adress
3 3
 from email.mime.multipart import MIMEMultipart
4 4
 from email.utils import parsedate_tz,mktime_tz
5 5
 import datetime
@@ -26,7 +26,7 @@ def test_decode_mail_ok():
26 26
         'from': 'a@home',
27 27
         'to': 'b@home',
28 28
         'subject':'test',
29
-        'references':'<reply+key@home>',
29
+        'references':'reply+key@home',
30 30
         'msg_id': '<uniquevalue@home>',
31 31
         'date': date
32 32
     }
@@ -93,7 +93,3 @@ def test_find_key_from_mail_address_no_key():
93 93
 def test_find_key_from_mail_adress_key():
94 94
     mail_address="a+key@b"
95 95
     assert find_key_from_mail_adress(mail_address) == 'key'
96
-
97
-def test_get_email_address_from_header():
98
-    mail_address = "blabla <a@b>"
99
-    assert  get_email_address_from_header(mail_address) == "a@b"