이 글에서는 Python에서 이메일을 보내고 받는 기능을 간단하게 구현하는 방법을 주로 설명합니다. 핵심 지식은 Python에 내장된 poplib 및 stmplib 모듈을 사용하는 것입니다. 그것은 특정 참조 가치가 있습니다. 관심 있는 친구들이 그것을 참조할 수 있기를 바랍니다.
1. 준비
먼저 테스트 메일함이 필요합니다. Sina Mailbox를 사용하여 다음과 같이 설정합니다.
Sina Mailbox 홈페이지 오른쪽 상단에서 설정을 찾습니다. >More settings 를 클릭한 다음 왼쪽에서 "Client/pop/imap/smtp"를 선택합니다:
마지막으로 Pop3/smtp 서비스의 서비스 상태를 켭니다:
2. mail
먼저 poplib 로그인 메일함과 메일 다운로드를 위한 몇 가지 인터페이스를 소개합니다:
self.popHost = 'pop.sina.com' self.smtpHost = 'smtp.sina.com' self.port = 25 self.userName = 'xxxxxx@sina.com' self.passWord = 'xxxxxx' self.bossMail = 'xxxxxx@qq.com'
로그인 메일함, pop, smtp 서버 및 포트를 지정하려면 위와 같은 몇 가지 상수가 필요합니다. 메일박스에 로그인하기 위해 poplib의 POP3_SSL 인터페이스를 호출합니다.
# 登录邮箱 def login(self): try: self.mailLink = poplib.POP3_SSL(self.popHost) self.mailLink.set_debuglevel(0) self.mailLink.user(self.userName) self.mailLink.pass_(self.passWord) self.mailLink.list() print u'login success!' except Exception as e: print u'login fail! ' + str(e) quit()
이메일에 로그인할 때 사용자 이름과 비밀번호를 제공해야 하는 것은 당연합니다. 위 코드에서 볼 수 있듯이 사용 방법은 매우 간단합니다.
우편함에 성공적으로 로그인한 후 list 메소드를 사용하여 우체통의 메일 정보를 얻을 수 있습니다. 목록 메소드의 정의를 확인하세요.
def list(self, which=None): """Request listing, return result. Result without a message number argument is in form ['response', ['mesg_num octets', ...], octets]. Result when a message number argument is given is a single response: the "scan listing" for that message. """ if which is not None: return self._shortcmd('LIST %s' % which) return self._longcmd('LIST')
목록 메소드에 대한 설명이 있습니다. 중국어 의미는 목록 메소드에 기본 매개변수가 있고 호출자가 매개변수를 제공하지 않을 때 기본값은 None이라는 것입니다. , 메소드는 모든 이메일의 정보를 나열합니다. 반환 형식은 [response, ['msg_number, octets', ...], octets]입니다. 여기서 response는 응답 결과, msg_number는 이메일 번호, octets는입니다. 8비트 바이트 단위. 구체적인 예를 살펴보겠습니다:
('+OK ', ['1 2424', '2 2422'], 16)
list() 메서드 호출 후 반환 결과입니다. 분명히 이것은 튜플입니다. 첫 번째 값은 '+OK'로 응답하여 요청이 성공했음을 나타냅니다. 두 번째 값은 이메일 정보를 저장하는 배열입니다. 예를 들어 '1 2424'에 1이 있으면 이메일 번호가 1이라는 의미입니다.
poplib를 사용하여 이메일을 다운로드하는 방법을 살펴보겠습니다.
# 获取邮件 def retrMail(self): try: mail_list = self.mailLink.list()[1] if len(mail_list) == 0: return None mail_info = mail_list[0].split(' ') number = mail_info[0] mail = self.mailLink.retr(number)[1] self.mailLink.dele(number) subject = u'' sender = u'' for i in range(0, len(mail)): if mail[i].startswith('Subject'): subject = mail[i][9:] if mail[i].startswith('X-Sender'): sender = mail[i][10:] content = {'subject': subject, 'sender': sender} return content except Exception as e: print str(e) return None
poplib의 이메일 콘텐츠 획득 인터페이스는 retr 방식입니다. 획득할 이메일 번호인 하나의 매개변수가 필요합니다. 다음은 retr 메소드의 정의입니다.
def retr(self, which): """Retrieve whole message number 'which'. Result is in form ['response', ['line', ...], octets]. """ return self._longcmd('RETR %s' % which)
우리는 댓글을 보고 retr 메소드가 지정된 번호의 이메일 전체 내용을 얻을 수 있으며 반환 형식은 [response, ['line', ...], octets], 반환된 튜플의 두 번째 요소에 이메일의 내용이 저장되어 있으며 저장 형식이 배열임을 알 수 있습니다. 이 배열이 어떻게 보이는지 테스트해 보겠습니다.
이 배열의 저장 형태가 딕셔너리와 유사하다는 것을 알 수 있습니다! 그래서 우리는 이를 기반으로 우리가 관심 있는 모든 것을 찾을 수 있습니다. 예를 들어, 이메일의 제목과 발신자를 찾는 샘플 코드라면 위의 코드와 같이 작성할 수 있습니다. 물론 일반 매칭도 가능합니다~~ 테스트 결과는 다음과 같습니다.
글쎄... 직접 해보셔도 됩니다.
3. 이메일을 보내기 위한 smtp
pop과 마찬가지로 smtp를 사용하기 전에 몇 가지 필수 상수를 제공해야 합니다.
self.mail_box = smtplib.SMTP(self.smtpHost, self.port) self.mail_box.login(self.userName, self.passWord)
위는 smtp를 사용하여 메일함에 로그인하는 코드입니다. 팝과 비슷하다. smtp를 사용하여 이메일을 보내는 코드는 다음과 같습니다. Python이 얼마나 간단하고 아름다운지 확인하세요!
# 发送邮件 def sendMsg(self, mail_body='Success!'): try: msg = MIMEText(mail_body, 'plain', 'utf-8') msg['Subject'] = mail_body msg['from'] = self.userName self.mail_box.sendmail(self.userName, self.bossMail, msg.as_string()) print u'send mail success!' except Exception as e: print u'send mail fail! ' + str(e)
이것은 Python에서 smtp를 사용하여 이메일을 보내는 코드입니다! 매우 간단합니다! 매우 편리합니다! 매우 이해하기 쉽습니다! 여기서 주요 방법은 sendmail입니다. 보낸 사람, 받는 사람 및 이메일 내용을 지정하기만 하면 됩니다. MIMEText도 있습니다. 다음과 같이 정의를 볼 수 있습니다.
class MIMEText(MIMENonMultipart): """Class for generating text/* type MIME documents.""" def __init__(self, _text, _subtype='plain', _charset='us-ascii'): """Create a text/* type MIME document. _text is the string for this message object. _subtype is the MIME sub content type, defaulting to "plain". _charset is the character set parameter added to the Content-Type header. This defaults to "us-ascii". Note that as a side-effect, the Content-Transfer-Encoding header will also be set. """ MIMENonMultipart.__init__(self, 'text', _subtype, **{'charset': _charset}) self.set_payload(_text, _charset)
댓글 보기~~~ 이것은 지정된 내용과 지정된 인코딩으로 MIME 문서를 생성하는 방법일 뿐입니다. 그런데 sendmail 방식을 살펴보겠습니다~~~
def sendmail(self, from_addr, to_addrs, msg, mail_options=[], rcpt_options=[]): """This command performs an entire mail transaction. The arguments are: - from_addr : The address sending this mail. - to_addrs : A list of addresses to send this mail to. A bare string will be treated as a list with 1 address. - msg : The message to send. - mail_options : List of ESMTP options (such as 8bitmime) for the mail command. - rcpt_options : List of ESMTP options (such as DSN commands) for all the rcpt commands.
흠... smtp를 사용하여 이메일을 보내는 것은 여기까지입니다.
4. 소스 코드 및 테스트
# -*- coding:utf-8 -*- from email.mime.text import MIMEText import poplib import smtplib class MailManager(object): def __init__(self): self.popHost = 'pop.sina.com' self.smtpHost = 'smtp.sina.com' self.port = 25 self.userName = 'xxxxxx@sina.com' self.passWord = 'xxxxxx' self.bossMail = 'xxxxxx@qq.com' self.login() self.configMailBox() # 登录邮箱 def login(self): try: self.mailLink = poplib.POP3_SSL(self.popHost) self.mailLink.set_debuglevel(0) self.mailLink.user(self.userName) self.mailLink.pass_(self.passWord) self.mailLink.list() print u'login success!' except Exception as e: print u'login fail! ' + str(e) quit() # 获取邮件 def retrMail(self): try: mail_list = self.mailLink.list()[1] if len(mail_list) == 0: return None mail_info = mail_list[0].split(' ') number = mail_info[0] mail = self.mailLink.retr(number)[1] self.mailLink.dele(number) subject = u'' sender = u'' for i in range(0, len(mail)): if mail[i].startswith('Subject'): subject = mail[i][9:] if mail[i].startswith('X-Sender'): sender = mail[i][10:] content = {'subject': subject, 'sender': sender} return content except Exception as e: print str(e) return None def configMailBox(self): try: self.mail_box = smtplib.SMTP(self.smtpHost, self.port) self.mail_box.login(self.userName, self.passWord) print u'config mailbox success!' except Exception as e: print u'config mailbox fail! ' + str(e) quit() # 发送邮件 def sendMsg(self, mail_body='Success!'): try: msg = MIMEText(mail_body, 'plain', 'utf-8') msg['Subject'] = mail_body msg['from'] = self.userName self.mail_box.sendmail(self.userName, self.bossMail, msg.as_string()) print u'send mail success!' except Exception as e: print u'send mail fail! ' + str(e) if __name__ == '__main__': mailManager = MailManager() mail = mailManager.retrMail() if mail != None: print mail mailManager.sendMsg()
위 코드는 먼저 메일함에 로그인한 후 첫 번째 이메일을 가져와서 삭제한 다음 이메일의 제목과 보낸 사람을 가져와서 인쇄하고 마지막으로 보냅니다. 성공적인 이메일 다른 bossMail 이메일 주소를 제공하세요.
테스트 결과는 다음과 같습니다.
좋아요, 위 코드를 복사하여 직접 사용해 보세요
관련 권장 사항:
thinkphp는 163을 구현합니다. QQ 메일함 보내기 및 받기 이메일 방법_PHP
위 내용은 Python으로 이메일을 보내고 받는 기능을 간단하게 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!