Maison  >  Article  >  développement back-end  >  Implémentation simple de la fonction d'envoi et de réception d'emails en python

Implémentation simple de la fonction d'envoi et de réception d'emails en python

小云云
小云云original
2018-05-12 11:16:175610parcourir

Cet article vous apprend principalement à implémenter simplement la fonction d'envoi et de réception d'e-mails en python. Les points clés de connaissance sont l'utilisation des modules poplib et stmplib intégrés à python. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer. J'espère que cela pourra aider tout le monde.

1. Préparation

Tout d'abord, nous devons avoir un e-mail de test et effectuer les réglages suivants :

Recherchez Paramètres->Plus de paramètres dans le coin supérieur droit de la page d'accueil de Sina Mail, puis sélectionnez "Client/pop/imap/smtp" sur la gauche :

Enfin, activez l'état du service Pop3/smtp :

2. poplib reçoit le courrier

Tout d'abord, introduisez quelques interfaces pour la boîte aux lettres de connexion poplib et le téléchargement du courrier :

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'

Nous avons besoin de quelques constantes comme ci-dessus pour spécifier la boîte aux lettres de connexion et le pop, le serveur smtp et le port. Nous appelons l'interface POP3_SSL de poplib pour nous connecter à la boîte mail.

# 登录邮箱 
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()

Lors de la connexion à l'e-mail, il est naturel que nous devions fournir un nom d'utilisateur et un mot de passe. Comme le montre le code ci-dessus, il est très simple à utiliser.
Après nous être connecté avec succès à la boîte aux lettres, nous pouvons utiliser la méthode de liste pour obtenir les informations de messagerie de la boîte aux lettres. On voit la définition de la méthode 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')

On voit le commentaire de la méthode list, dont la signification chinoise est que la méthode list a un paramètre par défaut qui, dont la valeur par défaut est None, lorsque l'appelant ne lui donne pas de paramètre, cette méthode listera les informations de tous les emails, et son formulaire de retour est [response, ['msg_number, octets', ...], octets], où réponse est le résultat de la réponse, msg_number est l'e-mail nombre, et les octets sont une unité d'octets de 8 bits. Jetons un coup d'œil à un exemple spécifique :
('+OK ', ['1 2424', '2 2422'], 16)
Ceci est le résultat renvoyé après avoir appelé la méthode list(). Évidemment, il s'agit d'un tuple. La première valeur sahib répond par '+OK', indiquant que la requête a réussi. La deuxième valeur est un tableau qui stocke les informations de courrier électronique. Par exemple, 1 sur « 1 2424 » signifie que le numéro de courrier électronique est 1.
Voyons comment utiliser poplib pour télécharger des e-mails.

# 获取邮件 
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

L'interface de poplib pour obtenir le contenu des e-mails est la méthode retr. Cela nécessite un paramètre, qui est le numéro de courrier électronique à obtenir. Voici la définition de la méthode retr :

def retr(self, which): 
 """Retrieve whole message number 'which'. 
 
 Result is in form ['response', ['line', ...], octets]. 
 """ 
 return self._longcmd('RETR %s' % which)

Nous voyons les commentaires et savons que la méthode retr peut obtenir l'intégralité du contenu de l'email avec le numéro spécifié, et son formulaire de retour est [réponse, ['line', .. .], octets], on peut voir que le contenu de l'e-mail est stocké dans le deuxième élément du tuple renvoyé, et sa forme de stockage est un tableau. Testons à quoi ressemble ce tableau.

On voit que la forme de stockage de ce tableau s'apparente à un dict ! Ainsi, nous pouvons trouver tout ce qui nous intéresse sur cette base. Par exemple, si notre exemple de code doit trouver le sujet et l'expéditeur de l'e-mail, il peut être écrit comme le code ci-dessus. Bien sûr, vous pouvez également utiliser la correspondance régulière~~~ Voici les résultats du test :

Eh bien... vous pouvez l'essayer vous-même.

3. Smtp envoie un e-mail

Comme pop, vous devez lui fournir certaines constantes requises avant d'utiliser smtp :

self.mail_box = smtplib.SMTP(self.smtpHost, self.port) 
self.mail_box.login(self.userName, self.passWord)

Ce qui précède est le code pour se connecter à la boîte aux lettres en utilisant smtp, qui est similaire à pop. Le code pour envoyer des emails via smtp est donné ci-dessous. Vous verrez à quel point Python est simple et beau !

# 发送邮件 
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)

C'est le code pour envoyer des emails en utilisant smtp en python ! C'est très simple ! Très pratique ! Très facile à comprendre ! La méthode principale ici est sendmail. Spécifiez simplement l'expéditeur, le destinataire et le contenu de l'e-mail. Il existe également MIMEText, qui peut être défini comme suit :

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)

Voir les commentaires~~~ Il s'agit simplement d'une méthode pour générer un document MIME avec un contenu et un encodage spécifiés. Au fait, jetons un coup d'œil à la méthode 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.

Hmm... C'est tout pour l'envoi d'e-mails via smtp.

4. Code source et tests

# -*- 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()

Le code ci-dessus se connecte d'abord à la boîte aux lettres, puis reçoit le premier e-mail et le supprime, et puis récupère l'e-mail. L'objet et l'expéditeur sont imprimés, et enfin un e-mail réussi est envoyé à une autre boîte aux lettres bossMail.

Les résultats des tests sont les suivants :

D'accord, vous pouvez copier le code ci-dessus et jouer avec vous-même

Recommandations associées :

Envoyer et recevoir des e-mails en python

thinkphp implémente 163. Comment envoyer et recevoir des e-mails dans QQ mailbox_PHP

Envoyer et recevoir des emails avec php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn