2013-02-19 6 views

답변

3

첫째, 아마 stdlib의 email 패키지를 사용하여 메시지를 구문 분석하고 싶습니다.

stdlib imaplib 또는 gmail API와 같은 메시지를받는 방법을 모르겠지만 본문과 별도로 헤더를 가져 오는 방법을 제공하지만 다른 방법을 사용하면 전체 메시지를 제공 할 수 있습니다. 경우,

>>> from email.parser import HeaderParser 

>>> msg = HeaderParser().parsestr(header) # or parsestr(msg) if you have the whole msg 
>>> return_path = msg.get('Return-Path') 

이제 return_path 방금 ​​이메일 주소 (또는 None으로 분석 할 수있는 문자열 "<[email protected]>"가있다 : 어느 쪽이든, 당신은 헤더를 구문 분석하고 다른 것을 무시하도록 email.parser.HeaderParser에 전체를 전달할 수 있습니다 하나도 없다.)

>>> from email.utils import parseaddr 
>>> realname, emailaddr = parseaddr(return_path) 

지금, realname""이며, emailaddr'[email protected]'입니다.

Return-Path: "Bob Example" <[email protected]> 

지금이 아주 잘 될 수 없습니다 :이 또한 완벽하게 유효하기 때문에 두 부분이 있습니다

이유입니다. 두 개의 Return-Path 헤더를 가질 수 있습니까? 또는 Return-Path 헤더에 여러 주소가 포함될 수 있습니까? 나는 기억이 안 나. 관련 RFC에서 찾아 볼 수 있지만 인기있는 클라이언트가 이러한 특정 규칙을 위반하는지 여부를 확인하기 위해 검색을 수행해야합니다. 나는이 모든 것을 기억할 수 없다. 따라서, 편의를 위해, 나는 보통 아무것도 여러 헤더 및 다중 값이 될 일들이 방법을 수행 할 수 있습니다 가정

>>> return_paths = msg.get_all('Return-Path') 

이것은 list["<[email protected]>"]를 반환합니다. (Return-Path 헤더가없는 경우 None 대신 list이 비어 있습니다.) 그리고 한 번에 모두 구문 분석하여 이름이 list이되고 주소 쌍이 하나가 아닌

이됩니다.
>>> from email.utils import getaddresses 
>>> for realname, emailaddr in getaddresses(returnpaths): 
...  print(realname, emailaddr) 

Return-Path가 단일 값만 허용하는 것으로 밝혀지면 같은 코드가 그대로 작동합니다.

0

당신은 split() 기능을 사용할 수 있습니다 다음 strip() : 당신은 괄호를 제거해야하는 경우

line = "Return-Path: <[email protected]>" 
header, value = line.split(":") 
value = value.strip() 

PS, 단지 다시 스트립 기능을 사용

value = value.strip('<>') 
+0

"Return-Path"행을 찾는 가장 좋은 방법은 무엇입니까? – hirefrank

+0

실제 포맷은 공백을 제거하는 것보다 훨씬 복잡하고 꺽쇠 괄호가 처리하기 때문에 이것은 좋은 생각이 아닙니다. 포맷을 배우지 않고 피할 수 있다면 파서를 쓰는 것을 원하지 않습니다. 할 수 있습니다. – abarnert

+0

동의. 이것은 다소 빠르고 답이 더 좋았습니다. – supercheetah

관련 문제