첫째, 아마 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가 단일 값만 허용하는 것으로 밝혀지면 같은 코드가 그대로 작동합니다.
"Return-Path"행을 찾는 가장 좋은 방법은 무엇입니까? – hirefrank
실제 포맷은 공백을 제거하는 것보다 훨씬 복잡하고 꺽쇠 괄호가 처리하기 때문에 이것은 좋은 생각이 아닙니다. 포맷을 배우지 않고 피할 수 있다면 파서를 쓰는 것을 원하지 않습니다. 할 수 있습니다. – abarnert
동의. 이것은 다소 빠르고 답이 더 좋았습니다. – supercheetah