In diesem Artikel erfahren Sie hauptsächlich, wie Sie die Funktion zum Senden und Empfangen von E-Mails in Python einfach implementieren. Die wichtigsten Wissenspunkte sind die Verwendung der in Python integrierten Module Poplib und Stmplib. Es hat einen gewissen Referenzwert. Ich hoffe, es kann jedem helfen.
1. Vorbereitung
Zuerst benötigen wir eine Test-E-Mail und nehmen folgende Einstellungen vor:
Suchen Sie Einstellungen -> Weitere Einstellungen in der oberen rechten Ecke der Sina Mail-Startseite und wählen Sie dann links „Client/pop/imap/smtp“ aus:
Schließlich aktivieren Sie den Dienststatus des Pop3/SMTP-Dienstes:
2. Poplib empfängt E-Mails
Führen Sie zunächst einige Schnittstellen für das Poplib-Anmeldepostfach und das Herunterladen von E-Mails ein:
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'
Wir benötigen einige Konstanten wie oben, um das Anmeldepostfach und Pop, den SMTP-Server und den Port anzugeben. Wir rufen die POP3_SSL-Schnittstelle von Poplib auf, um uns beim Postfach anzumelden.
# 登录邮箱 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()
Bei der Anmeldung per E-Mail müssen wir natürlich einen Benutzernamen und ein Passwort angeben. Wie im obigen Code gezeigt, ist die Verwendung sehr einfach.
Nachdem wir uns erfolgreich beim Postfach angemeldet haben, können wir die Listenmethode verwenden, um die E-Mail-Informationen des Postfachs abzurufen. Wir sehen die Definition der Listenmethode:
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')
Wir sehen den Kommentar der Listenmethode, dessen chinesische Bedeutung darin besteht, dass die Listenmethode beim Aufrufen einen Standardparameter hat, dessen Standardwert None ist Gibt es keinen Parameter an, listet diese Methode die Informationen aller E-Mails auf und ihr Rückgabeformular ist [Antwort, ['Nachrichtennummer, Oktette', ...], Oktette], wobei Antwort das Antwortergebnis und Nachrichtennummer die E-Mail ist Zahl und Oktette sind 8-Bit-Byte-Einheiten. Schauen wir uns ein konkretes Beispiel an:
('+OK ', ['1 2424', '2 2422'], 16)
Dies ist das Rückgabeergebnis nach dem Aufruf der list()-Methode. Offensichtlich handelt es sich hierbei um ein Tupel. Der erste Wert antwortet mit „+OK“, was anzeigt, dass die Anfrage erfolgreich ist. Der zweite Wert ist ein Array, das die E-Mail-Informationen speichert. Beispielsweise bedeutet 1 in „1 2424“, dass die E-Mail-Nummer 1 ist.
Sehen wir uns an, wie man Poplib zum Herunterladen von E-Mails verwendet.
# 获取邮件 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
Poplibs Schnittstelle zum Abrufen von E-Mail-Inhalten ist die Retr-Methode. Es ist ein Parameter erforderlich, nämlich die zu erhaltende E-Mail-Nummer. Das Folgende ist die Definition der retr-Methode:
def retr(self, which): """Retrieve whole message number 'which'. Result is in form ['response', ['line', ...], octets]. """ return self._longcmd('RETR %s' % which)
Wir sehen die Kommentare und wissen, dass die retr-Methode den gesamten Inhalt der E-Mail mit der angegebenen Nummer abrufen kann und ihr Rückgabeformular [Antwort, ['line', .. .], octets], es ist ersichtlich, dass der Inhalt der E-Mail im zweiten Element des zurückgegebenen Tupels gespeichert ist und seine Speicherform ein Array ist. Lassen Sie uns testen, wie dieses Array aussieht.
Wir können sehen, dass die Speicherform dieses Arrays einem Diktat ähnelt! Auf dieser Grundlage können wir alles finden, was uns interessiert. Wenn unser Beispielcode beispielsweise den Betreff und den Absender der E-Mail ermitteln soll, kann er wie der obige Code geschrieben werden. Natürlich können Sie auch das reguläre Matching verwenden~~~ Hier sind die Testergebnisse:
Nun... Sie können es selbst ausprobieren.
3. Smtp sendet E-Mail
Wie bei Pop müssen Sie es vor der Verwendung von SMTP mit einigen erforderlichen Konstanten versehen:
self.mail_box = smtplib.SMTP(self.smtpHost, self.port) self.mail_box.login(self.userName, self.passWord)
Das Obige ist der Code zum Anmelden beim Postfach über SMTP, ähnlich wie bei Pop. Der Code zum Senden von E-Mails über SMTP ist unten angegeben. Sie werden sehen, wie einfach und schön Python ist!
# 发送邮件 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)
Dies ist der Code zum Senden von E-Mails mit SMTP in Python! Es ist ganz einfach! Sehr praktisch! Sehr leicht zu verstehen! Die Hauptmethode ist hier sendmail. Geben Sie einfach den Absender, den Empfänger und den E-Mail-Inhalt an. Es gibt auch MIMEText, der wie folgt definiert werden kann:
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)
Siehe die Kommentare~~~ Dies ist lediglich eine Methode zum Generieren eines MIME-Dokuments mit angegebenem Inhalt und angegebener Kodierung. Werfen wir übrigens einen Blick auf die sendmail-Methode~~~
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... Das war's auch schon mit dem Versenden von E-Mails über SMTP.
4. Quellcode und 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()
Der obige Code meldet sich zuerst beim Postfach an, ruft dann die erste E-Mail ab und löscht sie Anschließend wird die E-Mail mit Betreff und Absender ausgedruckt und schließlich eine erfolgreiche E-Mail an ein anderes BossMail-Postfach gesendet.
Die Testergebnisse lauten wie folgt:
Okay, Sie können den obigen Code kopieren und selbst damit spielen
Verwandte Empfehlungen:
E-Mails in Python senden und empfangen
thinkphp implementiert 163. So senden und empfangen Sie E-Mails in QQ mailbox_PHP
E-Mails mit PHP senden und empfangen
Das obige ist der detaillierte Inhalt vonEinfache Implementierung der Funktion zum Senden und Empfangen von E-Mails in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!