Heim  >  Artikel  >  Backend-Entwicklung  >  Python verwendet das E-Mail-Modul zum Kodieren und Dekodieren von E-Mails

Python verwendet das E-Mail-Modul zum Kodieren und Dekodieren von E-Mails

不言
不言Original
2018-04-24 15:02:027539Durchsuche

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--

Das Obige ist die Quelldatei einer E-Mail. Die erste Zeile bis zur ersten Leerzeile ist der Header und der Rest ist der Text der E-Mail. Kopieren Sie die oben genannten Informationen und speichern Sie sie in einer Datei mit dem Namen xxx.eml. Sie können den Inhalt sehen, indem Sie mit der Maus darauf doppelklicken. Was Sie sehen, ist natürlich die dekodierte Version.

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

Dieser Code kann den Betreff, den Absender und den Empfänger einer E-Mail analysieren. email.utils.parseaddr wird zum spezifischen Parsen von E-Mail-Adressen verwendet. Der Grund dafür ist, dass E-Mail-Adressen im Originaltext häufig so geschrieben sind: user1 8ec6add0f95aa07e67c7bbeeb7c8a480, email.utils.parseaddr kann sie in ein In-Format analysieren In der Liste ist das erste Element user1 und das zweite Element xxxxxxxx@163.com. Hier werden nur die folgenden Teile angezeigt.

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 &#39;附件名:&#39;, fname
      data = par.get_payload(decode=True) # 解码出附件数据,然后存储到文件中
      
      try:
        f = open(fname, &#39;wb&#39;) #注意一定要用wb来打开文件,因为附件一般都是二进制文件
      except:
        print &#39;附件名有非法字符,自动换一个&#39;
        f = open(&#39;aaaa&#39;, &#39;wb&#39;)
      f.write(data)
      f.close()
    else:
      #不是附件,是文本内容
      print par.get_payload(decode=True) # 解码出文本内容,直接输出来就可以了。
    
    print &#39;+&#39;*60 # 用来区别各个部分的输出

Einfach, Sie können eine komplexe Analyse von E-Mails ohne erreichen viel Codefunktion!

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 == &#39;subject&#39;:
        self.msg[k] = email.Header.Header(mailheader[k], &#39;gb2312&#39;)      
      else:
        self.msg[k] = mailheader[k]
    # 创建纯文本部分
    body_plain = email.MIMEText.MIMEText(maildata[0], _subtype=&#39;plain&#39;, _charset=&#39;gb2312&#39;)
    body_html = None
    # 创建html部分,这个是可选的
    if maildata[1]:
      body_html = email.MIMEText.MIMEText(maildata[1], _subtype=&#39;html&#39;, _charset=&#39;gb2312&#39;)
    
    
    # 创建一个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,&#39;rb&#39;).read()))
      # 这里设置文件类型,全部都设置为Application.当然也可以是Image,Audio什么的,这里不管那么多
      attachment.replace_header(&#39;Content-type&#39;,&#39;Application/octet-stream;name="&#39;+os.path.basename(fname)+&#39;"&#39;)
      # 一定要把传输编码设置为base64,因为这里默认就是用的base64
      attachment.replace_header(&#39;Content-Transfer-Encoding&#39;, &#39;base64&#39;)
      attachment.add_header(&#39;Content-Disposition&#39;,&#39;attachment;filename="&#39;+os.path.basename(fname)+&#39;"&#39;)
      attach.attach(attachment)
    # 生成最终的邮件      
    self.mail = self.msg.as_string()[:-1] + attach.as_string()
    
    return self.mail

if __name__ == &#39;__main__&#39;:
  mc = MailCreator()
  header = {&#39;from&#39;: &#39;zhaowei@163.com&#39;, &#39;to&#39;:&#39;weizhao@163.com&#39;, &#39;subject&#39;:&#39;我的一个测试邮件&#39;}
  data = [&#39;plain text information&#39;, &#39;<font color="red">html text information</font>&#39;]
  if sys.platform == &#39;win32&#39;:
    attach = [&#39;c:/windows/clock.avi&#39;]
  else:
    attach = [&#39;/bin/cp&#39;]
  
  mail = mc.create(header, data, attach)
  
  f = open("test.eml", "wb")
  f.write(mail)
  f.close()

Hier habe ich eine Klasse für die Verarbeitung gekapselt Der Prozess lautet:

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.

Verwandte Empfehlungen:


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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn