팝업을 켜기 때문에 Gmail에 액세스하려면 '가져 오기 poplib'을 사용하려고했는데 실제로 어떻게 '보낸 사람'주소의 메시지를 확인한 다음 그 메시지를 기반으로 무언가를 실행합니까? 또한 메시지에서 '본문'텍스트를 제거하라는 명령은 무엇입니까?이메일 서버 (gmail)에서 특정 주소를 확인하고 해당 주소를 기반으로 무언가를 실행하려면 어떻게해야합니까?
답변
다음은 imaplib을 사용하여 Gmail받은 편지함에있는 각 메일의 제목과 발신자를받는 방법입니다.
import imaplib
from email.parser import HeaderParser
conn = imaplib.IMAP4_SSL('imap.gmail.com')
conn.login('[email protected]', 'password')
# Select the mail box
status, messages = conn.select('INBOX')
if status != "OK":
print "Incorrect mail box"
exit()
if int(messages[0]) > 0:
for message_number in range(1,int(messages[0])+1):
data = conn.fetch(message_number, '(BODY[HEADER])')
parser = HeaderParser()
msg = parser.parsestr(data[1][0][1])
print "Subject: %s" % msg['subject']
print "From: %s" % msg['from']
자세한 정보가 필요할 수 있습니다. official imaplib documentation에서 시작하십시오. documentation에서
내가 poplib의 메시지를 생각 RFC822 모듈이 서버에서 donloaded 할 수있다.
다음 모듈 문서를 체크 아웃도 ... 이것을 시도하고>>> rfc822.Message(f)
에 파일
>>> f = StringIO.StringIO(message)
>>> import rfc822
에 넣고 통과했다. 도움이되기를 바랍니다.
>>> import email
>>> email.message_from_string(...)
이것은 헤더에 대한 읽기 액세스를 제공하고 또한 신체 내용의 muliple 형식을 지원합니다 :
다른 파이썬 모듈이있다.
:
POP3.retr(which)
Retrieve whole message number which, and set its seen flag. Result is in form (response, ['line', ...], octets).
그래서, 당신은 메시지의 선이 response[1]
에서 목록으로 저장됩니다 response
라는 변수로 retr()
의 결과를 뒀다 가정. RFC 2822에 의해 우리는 헤더가 메시지 본문과 빈 줄로 구분된다는 것을 알고 있습니다. 메시지를 보낸 사람은 From:
헤더 줄에 있습니다. 따라서 메시지 라인을 반복하고 공백 라인이 생기면 멈추고 From:
으로 시작하는 라인을 볼 때 보낸 사람에게 변수를 설정할 수 있습니다.
sender = None
for line in response[1]:
if line.startswith("From: "):
sender = line.partition(" ")[2].strip()
elif line == "":
break
머리글을 많이 사용하려면 헤더 이름으로 사전에 입력하는 것이 좋습니다. 각 헤더는 여러 번 나타날 수 있으므로 사전의 각 값은 목록이어야합니다. 이 후
headers = {}
for line in response[1]:
if line == "":
break
line = line.partition(" ")
key = line[0].strip().rstrip(":")
value = line[2].stirp()
headers.setdefault(key, []).append(value)
당신은 메시지를 보낸 사람을 얻을 수 headers["From"][0]
를 사용할 수 있습니다.
매우 복잡하지는 않지만 기본 작업 방식을 보여주고 싶었지만 Python이 대부분의 작업을 수행 할 수 있습니다. 다시 말하지만, 당신의 retr()
결과라고 가정하는 것은 response
에 : 당신은 email module에 대한 문서의 메시지 개체에 대한 자세한 내용을 찾을 수 있습니다
import email
# convert our message back to a string and parse it
headers = email.parsefromstring("\n".join(response[0]), headersonly=True)
print headers["From"] # prints the sender
.
전자 메일 메시지의 줄에는 보낸 사람의 이름과 같은 전자 메일 주소 외에 추가 텍스트가있을 수 있습니다. 정규 표현식을 사용하여 이메일 주소를 추출 할 수 있습니다.
sender = re.find(r".*[ <]([email protected]+)\b", headers["From"]).match(1)
완벽하게 작동했습니다. 정말 고맙습니다! Imaplib은 poplib보다 100 배 더 효과가있었습니다. – YamSMit