Email Empfang über POP3

    • VB.NET

    Es gibt 74 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

      Email Empfang über POP3

      Auf der Suche nach geeignetem Code für den POP3 Email Empfang bin ich über ein OpenSource Projekt gestolpert, es nennt sich OpenPOP3.
      Natürlich ist das Protokoll für POP3 nicht sonderlich kompliziert, jedoch das E-Mail Parsing schon.

      Leider gibt es z.Z. noch keine geeignete Dokumentation zu diesem Projekt, aber durch ein wenig rumprobieren habe ich es nun hinbekommen, Mails zu holen und Attachments mit zu sichern.

      Download der Binaries:
      sourceforge.net/projects/openpop3/files/

      Download vom VB-Paradise Server (*hinzugefügt am 22.07.2009*)

      Benötigt wird:
      - Form1
      - Button1
      - TextBox1
      - ListBox1
      - ListBox2

      Verweise:
      OpenPOP.dll
      MIMEParser.dll

      Imports:
      System.IO
      OpenPOP
      OpenPOP.Pop3

      Globale Variablen:

      VB.NET-Quellcode

      1. Dim Messages As New List(Of String)
      2. Dim AttachArray As New ArrayList


      Code für Button1:

      VB.NET-Quellcode

      1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      2. Dim pop3 As New POPClient
      3. pop3.Disconnect()
      4. pop3.Connect("pop.host.de", 110)
      5. pop3.Authenticate("benutzeraccount", "benutzerpasswort")
      6. ListBox1.Items.Clear()
      7. For i As Integer = 1 To pop3.GetMessageCount
      8. Dim m As MIMEParser.Message = pop3.GetMessage(i, False)
      9. ListBox1.Items.Add("From: " & m.From & " <" & m.FromEmail & "> - " & m.Subject)
      10. If m.MessageBody.Count > 0 Then
      11. Dim Attach As New List(Of MIMEParser.Attachment)
      12. Messages.Add(m.MessageBody(m.MessageBody.Count - 1))
      13. For ii As Integer = 1 To m.AttachmentCount - 1
      14. Attach.Add(m.GetAttachment(ii))
      15. Next
      16. AttachArray.Add(Attach)
      17. End If
      18. ' pop3.DeleteMessage(i) ' Wenn die Message nach abholung gelöscht werden soll
      19. Next
      20. pop3.Disconnect()
      21. End Sub


      Code für ListBox1:

      VB.NET-Quellcode

      1. Private Sub ListBox1_SelectedIndexChanged(ByVal sender As ListBox, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
      2. TextBox1.Text = Messages(sender.SelectedIndex)
      3. ListBox2.Items.Clear()
      4. For Each att As MIMEParser.Attachment In AttachArray(sender.SelectedIndex)
      5. ListBox2.Items.Add(att.ContentFileName & " " & att.ContentLength & " Byte")
      6. Next
      7. End Sub


      Code für ListBox2:

      VB.NET-Quellcode

      1. Private Sub ListBox2_SelectedIndexChanged(ByVal sender As ListBox, ByVal e As System.EventArgs) Handles ListBox2.SelectedIndexChanged
      2. Dim att As MIMEParser.Attachment = AttachArray(ListBox1.SelectedIndex)(sender.SelectedIndex)
      3. Dim fs As FileStream = File.Create(Application.StartupPath & "/attach/" & att.ContentFileName)
      4. Dim da() As Byte
      5. da = att.DecodedAttachment
      6. fs.Write(da, 0, da.Length)
      7. MsgBox("'" & att.ContentFileName & "' wurde gespeichert!")
      8. fs.Close()
      9. End Sub


      Informationen Header der Mail:
      Hier ist eine Liste der Informationen, die man aus dem Mail Header auslesen kann. Die Variable m steht hier für die Message (siehe Code Button1):

      Quellcode

      1. String m.AttachmentBoundry
      2. String m.AttachmentBoundry2
      3. Integer m.AttachmentCount
      4. Array(Of String) m.BCC
      5. Array(Of String) m.CC
      6. Array(Of String m.TO
      7. String m.ContentEncoding
      8. String m.ContentType
      9. String m.From
      10. String m.FromEmail
      11. Boolean m.HasAttachment
      12. String m.MessageID
      13. String m.Subject
      14. String m.Date
      15. String m.Received
      16. Boolean m.HTML
      17. String m.Importance
      18. String m.ReplyTo
      19. String m.ReplyToEmail
      20. Function(att As MIME.Parser.Attachment, Filename) m.SaveAttachment
      21. Function(Path) m.SacheAttachments



      Ich hoffe es hilft einigen weiter, mir hat es sehr geholfen. Die Libraries verfügen auch noch über diverser anderer nützlicher Funktionen, aber dieses hier ist denke ich mal der Hauptteil.


      Edit by LaMa5:
      - Download vom VB-Paradise Server hinzugefügt

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Marcus Gräfe“ ()

      Tach,
      ich bekomme gleich zwei Fehlermeldungen:
      1. Wenn ich mehr als eine Mail empfange und nicht die erste in der Listbox auswähle kommt folgende Meldung: "Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein. Parametername: index"

      2. Wenn ich Anhänge speichern will kommt folgende Meldung: "Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch." Ich habe aber alle Ordner erstellt.
      Liegen die DLLs bei dem Programm dabei? Wenn die DLLs als Verweise einfügst unter MyProject, schau mal ob da Lokale Kopie auf True gestellt ist, ansonsten dies nachholen.
      Nach dem Builden sollten die DLLs auch im Release Ordner sich befinden.

      Email über Pop 3 abrufen

      Jedesmal wenn ich es versuche hängt sich das programm auf(um genau zu sein beim pop3.connect)^^
      hab schon hotmail und googlemail getestest (ports gibts ja hier) also dann host und port richtig geändert und es funktioniert einfach nicht! HILFE! =D freue mich über jede Hilfe!
      Das ist keine Offizielle Liste, Hotmail bietet das soweit ich weiß NICHT an, was mit google ist weiß ich nicht. Wenn es nicht funktioniert, scheints auch nicht zu gehen. Ansonsten kann man sowas einfach mit Putty oder so testen. Einfach Host und Port angeben und connecten, wenn die Anfrage nach Username und Passwort kommt, muss es auch mit der DLL gehen.

      @metakilla:
      Ich bin mir gerade nicht sicher, aber ich glaube in den Namespaces gibt es irgendwo eine Funktion mit der man die Mails im MIME Format speichern kann, heißt so wie sie abgeholt werden mit Header und den Base64 Encodeten Anhängen drin. Diese muss man dann auch nur wieder über den Namespace laden, sie werden geparsed und nun kann man wieder mit .Text .From und so auf die Attachments zugreifen.
      Hallo Dodo
      Geniale Sache, funktioniert bei mir ohne Probleme.
      Etwas habe ich aber noch nicht heraus gefunden, vielleicht weiss da jemand Bescheid.

      Ich möchte noch einbinden, dass mir die eigentliche Nachricht auch angezeigt wird ... habe aber unter der Variable m nichts gefunden.

      Gruss
      Hallo

      Habs hinbekommen aber womit kann ich den Text der E-mail auslesen?

      EDIT:Bekomme auch das hin mit:

      VB.NET-Quellcode

      1. TextBox1.Text = Messages(sender.SelectedIndex)


      Dann kommt allerdings sowas:
      Spoiler anzeigen

      <html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

      <head>
      <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
      <meta name=Generator content="Microsoft Word 12 (filtered medium)">
      <style>
      <!--
      /* Font Definitions */
      @font-face
      {font-family:"Cambria Math";
      panose-1:0 0 0 0 0 0 0 0 0 0;}
      @font-face
      {font-family:Calibri;
      panose-1:2 15 5 2 2 2 4 3 2 4;}
      /* Style Definitions */
      p.MsoNormal, li.MsoNormal, div.MsoNormal
      {margin:0cm;
      margin-bottom:.0001pt;
      font-size:11.0pt;
      font-family:"Calibri","sans-serif";}
      a:link, span.MsoHyperlink
      {mso-style-priority:99;
      color:blue;
      text-decoration:underline;}
      a:visited, span.MsoHyperlinkFollowed
      {mso-style-priority:99;
      color:purple;
      text-decoration:underline;}
      span.E-MailFormatvorlage17
      {mso-style-type:personal-compose;
      font-family:"Calibri","sans-serif";
      color:windowtext;}
      ..MsoChpDefault
      {mso-style-type:export-only;}
      @page Section1
      {size:612.0pt 792.0pt;
      margin:70.85pt 70.85pt 2.0cm 70.85pt;}
      div.Section1
      {page:Section1;}
      -->
      </style>
      <!--[if gte mso 9]><xml>
      <o:shapedefaults v:ext="edit" spidmax="1026" />
      </xml><![endif]--><!--[if gte mso 9]><xml>
      <o:shapelayout v:ext="edit">
      <o:idmap v:ext="edit" data="1" />
      </o:shapelayout></xml><![endif]-->
      </head>

      <body lang=DE link=blue vlink=purple>

      <div class=Section1>

      <p class=MsoNormal>Hallo Welt<o:p></o:p></p>

      </div>

      </body>

      </html>


      Habe allerdings nur Hallo Welt geschrieben. Wie kann ich das rausfiltern?

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Croasider“ ()

      Ja, dann hast du aber eine HTML E-Mail geschrieben und keine normale Text E-Mail, das kann man meist irgendwie beim Mailschreiben auswählen, zumindest bei Web.de.
      Um die Mail anzeigen zu lassen müsstest du halt entweder eine Browser Engine nehmen wie z.B. das WebBrowser Control oder du parsed das selbst und suchst dir via RegEx den Content selber heraus.