>  기사  >  백엔드 개발  >  Python으로 이메일을 보내고 받는 기능을 간단하게 구현

Python으로 이메일을 보내고 받는 기능을 간단하게 구현

小云云
小云云원래의
2018-05-12 11:16:175652검색

이 글에서는 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 이메일 주소를 제공하세요.

테스트 결과는 다음과 같습니다.

좋아요, 위 코드를 복사하여 직접 사용해 보세요

관련 권장 사항:

이메일을 보내고 받는 데 Python

thinkphp는 163을 구현합니다. QQ 메일함 보내기 및 받기 이메일 방법_PHP

php에서 이메일 보내기 및 받기

위 내용은 Python으로 이메일을 보내고 받는 기능을 간단하게 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.