Dieser Artikel stellt Ihnen vor, wie Python das E-Mail-Modul zum Kodieren und Dekodieren von E-Mails verwendet. Freunde, die die gleichen Anforderungen haben, können sich auf
E-Mails entschlüsseln
Das mit Python gelieferte E-Mail-Modul ist eine sehr interessante Sache. Es kann E-Mails verschlüsseln und entschlüsseln und ist sehr nützlich für die Verarbeitung von E-Mails. Die Verarbeitung von E-Mails ist eine sehr heikle Aufgabe, insbesondere das Dekodieren von E-Mails, da sich das Format zu stark ändert:
Received: from 192.168.208.56 ( 192.168.208.56 [192.168.208.56] ) by ajax-webmail-wmsvr37 (Coremail) ; Thu, 12 Apr 2007 12:07:48 +0800 (CST) Date: Thu, 12 Apr 2007 12:07:48 +0800 (CST) From: user1 <xxxxxxxx@163.com> To: zhaowei <zhaoweikid@163.com> Message-ID: <31571419.200911176350868321.JavaMail.root@bj163app37.163.com> Subject: =?gbk?B?u+nJtA==?= MIME-Version: 1.0 Content-Type: multipart/Alternative; boundary="----=_Part_21696_28113972.1176350868319" ------=_Part_21696_28113972.1176350868319 Content-Type: text/plain; charset=gbk Content-Transfer-Encoding: base64 ztLS0b+qyrzS1M6qysfSu7j20MfG2ru70ru0zqOs1K3AtMrH0ru49tTCtffSu7TOztLDx8/W1NrT prjDysew67XjssXE3MjI1ebC6bezICAg ------=_Part_21696_28113972.1176350868319 Content-Type: text/html; charset=gbk Content-Transfer-Encoding: quoted-printable <p>=CE=D2=D2=D1=BF=AA=CA=BC=D2=D4=CE=AA=CA=C7=D2=BB=B8=F6=D0=C7=C6=DA=BB= =BB=D2=BB=B4=CE=A3=AC=D4=AD=C0=B4=CA=C7=D2=BB=B8=F6=D4=C2=B5=F7=D2=BB=B4=CE= </p> <p>=CE=D2=C3=C7=CF=D6=D4=DA=D3=A6=B8=C3=CA=C7=B0=EB=B5=E3=B2=C5=C4=DC=C8= =C8</p> <p>=D5=E6=C2=E9=B7=B3</p> ------=_Part_21696_28113972.1176350868319--
Sehen Sie sich an, wie das E-Mail-Modul diese E-Mail verarbeitet. Gehen Sie davon aus, dass der Brief als xxx.eml gespeichert wurde.
#-*- encoding: gb2312 -*- import email fp = open("xxx.eml", "r") msg = email.message_from_file(fp) # 直接文件创建message对象,这个时候也会做初步的解码 subject = msg.get("subject") # 取信件头里的subject, 也就是主题 # 下面的三行代码只是为了解码象=?gbk?Q?=CF=E0=C6=AC?=这样的subject h = email.Header.Header(subject) dh = email.Header.decode_header(h) subject = dh[0][0] print "subject:", subject print "from: ", email.utils.parseaddr(msg.get("from"))[1] # 取from print "to: ", email.utils.parseaddr(msg.get("to"))[1] # 取to fp.close()
Der vorherige Code analysiert nur den Briefkopf und dann den Briefkörper. Der Brieftext kann aus zwei Teilen bestehen: reinem Text und HTML, und kann auch Anhänge enthalten. Pantomimekenntnisse sind hier erforderlich. Eine ausführliche Einführung finden Sie online. Ich werde hier nicht auf Details eingehen, werfen wir einen Blick auf die Vorgehensweise zum Parsen:
#-*- encoding: gb2312 -*- import email fp = open("xxx.eml", "r") msg = email.message_from_file(fp) # 循环信件中的每一个mime的数据块 for par in msg.walk(): if not par.is_multipart(): # 这里要判断是否是multipart,是的话,里面的数据是无用的,至于为什么可以了解mime相关知识。 name = par.get_param("name") #如果是附件,这里就会取出附件的文件名 if name: #有附件 # 下面的三行代码只是为了解码象=?gbk?Q?=CF=E0=C6=AC.rar?=这样的文件名 h = email.Header.Header(name) dh = email.Header.decode_header(h) fname = dh[0][0] print '附件名:', fname data = par.get_payload(decode=True) # 解码出附件数据,然后存储到文件中 try: f = open(fname, 'wb') #注意一定要用wb来打开文件,因为附件一般都是二进制文件 except: print '附件名有非法字符,自动换一个' f = open('aaaa', 'wb') f.write(data) f.close() else: #不是附件,是文本内容 print par.get_payload(decode=True) # 解码出文本内容,直接输出来就可以了。 print '+'*60 # 用来区别各个部分的输出
E-Mails kodieren
Es ist auch sehr einfach, das E-Mail-Modul zum Generieren von E-Mails zu verwenden, es sind lediglich einige Grundkenntnisse in MIME erforderlich. Werfen wir einen Blick auf einige Pantomime-Grundlagen. MIME-Nachrichten bestehen aus zwei Teilen: Nachrichtenkopf und Nachrichtentext. Bei E-Mails handelt es sich um den Nachrichtenkopf und den Nachrichtentext. Trennen Sie den E-Mail-Header und den E-Mail-Text durch Leerzeilen. Dies lässt sich deutlich erkennen, wenn man sich die Quelldatei einer E-Mail mit einem Texteditor (z. B. Notepad) ansieht. Outlook und Foxmail verfügen über eigene Funktionen zum Anzeigen von Quelldateien.
Der E-Mail-Header enthält wichtige Informationen wie Absender, Empfänger, Betreff, Uhrzeit, MIME-Version und Art des E-Mail-Inhalts. Jede Information wird als Domäne bezeichnet und besteht aus dem Domänennamen, gefolgt von „:“ und dem Informationsinhalt. Sie kann eine Zeile lang sein, oder eine längere Zeile kann mehrere Zeilen umfassen. Die erste Zeile des Felds muss „oben“ geschrieben werden, d Informationen selbst.
Der E-Mail-Text enthält den Inhalt der E-Mail und sein Typ wird durch das Feld „Content-Type“ im E-Mail-Header angegeben. Die gebräuchlichsten Typen sind text/plain (einfacher Text) und text/html (Hypertext). Der E-Mail-Text ist in mehrere Segmente unterteilt, und jedes Segment enthält einen Segmentkopf und einen Segmenttext, die ebenfalls durch Leerzeilen getrennt sind. Es gibt drei gängige Multipart-Typen: Multipart/Mixed, Multipart/Related und Multipart/Alternative. Aus ihren Namen lässt sich leicht auf die jeweilige Bedeutung und Verwendung dieser Typen schließen.
Wenn Sie der E-Mail Anhänge hinzufügen möchten, müssen Sie das Multipart-/Mischsegment definieren. Wenn eingebettete Ressourcen vorhanden sind, muss mindestens das Multipart-/verwandte Segment definiert werden /alternatives Segment muss definiert werden. Beim Generieren von E-Mails werden diese verschiedenen MIME-Teile generiert. Das E-Mail-Modul hat diese Prozesse gepackt:
#-*- encoding: gb2312 -*- import email import string, sys, os, email import time class MailCreator: def __init__(self): # 创建邮件的message对象 self.msg = email.Message.Message() self.mail = "" def create(self, mailheader, maildata, mailattachlist=[]): # mailheader 是dict类型,maildata是list, 且里面第一项为纯文本类型,第二项为html. # mailattachlist 是list, 里面为附件文件名 if not mailheader or not maildata: return for k in mailheader.keys(): # 对subject要作特殊处理,中文要转换一下。 # 比如 "我的一个测试邮件" 就要转换为 =?gb2312?b?ztK1xNK7uPay4srU08q8/g==?= if k == 'subject': self.msg[k] = email.Header.Header(mailheader[k], 'gb2312') else: self.msg[k] = mailheader[k] # 创建纯文本部分 body_plain = email.MIMEText.MIMEText(maildata[0], _subtype='plain', _charset='gb2312') body_html = None # 创建html部分,这个是可选的 if maildata[1]: body_html = email.MIMEText.MIMEText(maildata[1], _subtype='html', _charset='gb2312') # 创建一个multipart, 然后把前面的文本部分和html部分都附加到上面,至于为什么,可以看看mime相关内容 attach=email.MIMEMultipart.MIMEMultipart() attach.attach(body_plain) if body_html: attach.attach(body_html) # 处理每一个附件 for fname in mailattachlist: attachment=email.MIMEText.MIMEText(email.Encoders._bencode(open(fname,'rb').read())) # 这里设置文件类型,全部都设置为Application.当然也可以是Image,Audio什么的,这里不管那么多 attachment.replace_header('Content-type','Application/octet-stream;name="'+os.path.basename(fname)+'"') # 一定要把传输编码设置为base64,因为这里默认就是用的base64 attachment.replace_header('Content-Transfer-Encoding', 'base64') attachment.add_header('Content-Disposition','attachment;filename="'+os.path.basename(fname)+'"') attach.attach(attachment) # 生成最终的邮件 self.mail = self.msg.as_string()[:-1] + attach.as_string() return self.mail if __name__ == '__main__': mc = MailCreator() header = {'from': 'zhaowei@163.com', 'to':'weizhao@163.com', 'subject':'我的一个测试邮件'} data = ['plain text information', '<font color="red">html text information</font>'] if sys.platform == 'win32': attach = ['c:/windows/clock.avi'] else: attach = ['/bin/cp'] mail = mc.create(header, data, attach) f = open("test.eml", "wb") f.write(mail) f.close()
1. Erstellen Sie zuerst das Nachrichtenobjekt: email.Message.Message()
2. Erstellen Sie das MIMEMultipart-Objekt: email.MIMEMultipart.MIMEMultipart()
3 An MIMEMultipart anhängen. Der MIMEText besteht hier eigentlich nicht nur aus Text, sondern enthält auch Bilder, Anwendungen, Audio usw.
4. Erstellen Sie eine endgültige E-Mail.
Python-Skript zur Berechnung der Größe aller Verzeichnisse unter einem angegebenen Pfad_PHP-Tutorial
Python-Berechnung von Zeichenbreite Methode
Das obige ist der detaillierte Inhalt vonPython verwendet das E-Mail-Modul zum Kodieren und Dekodieren von E-Mails. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!