Announcement

Collapse
No announcement yet.

Mailversand in VS 2010

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mailversand in VS 2010

    Guten Abend,
    in diesem Forum habe ich bisher die besten Antworten bekommen, ohne die ich so manche App gar nicht zum Laufen gebracht hätte. Ein großes Dankeschön an euch alle!
    So hoffe ich auch dieses Mal wieder, dass mir jemand von euch bei einem kniffligen Problem helfem kann.
    Aus VB.Net heraus müssen Mails versendet werden. Dazwischen hängt ein Client des Betreibers des Servers, der die Mails verschlüsselt und mit Zertifikaten versieht. Darum brauche ich mich aber nicht zu kümmern. Ich muss die Mail nur über Port 25 zum Localhost schaufeln.

    In Thunderbird habe ich den Server wie folgt konfiguriert:
    Servertyp: POP
    Server: localhost
    Port 110
    Verbindungssicherheit: keine
    Authentifizierungsmethode: Passwort, ungesichert übertragen

    Postausgangsserver Port 25
    Verbindungssicherheit: keine
    Authentifizierungsmethode: Passwort, ungesichert übertragen
    Benutzername nennen wir mal username

    Beim Versenden einer Mail muss ein Passwort (psw) eingegeben werden und schon flattert die Mail zum Server des Betreibers.

    Über Telnet SMTP geht es so:
    Telnet localhost 25
    Antwort: 250-OK / 250 AUTH LOGIN PLAIN
    AUTH LOGIN
    Antwort: 334 VXNlcm5hbWU6
    <Line Suppressed>
    Antwort: 334 UGFzc3dvcmQ6
    <Line Suppressed>
    SMTP login with user 'username' and password 'xxxxxxxxxx'
    235 Authentication Succeeded

    Ich gebe also AUTH LOGIN ein, danach den Usernamen und schließlich das Passwort (sind quasi 3 Zeilen)

    Das Log sieht dann so aus:
    2015/09/28 17:34:21:750 [ SMTP-Server-pool-2] d.k.b.m.i.s.SMTPHandler:797 [DEBUG] [SMTP] <-- 250-OK
    2015/09/28 17:34:21:750 [ SMTP-Server-pool-2] d.k.b.m.i.s.SMTPHandler:797 [DEBUG] [SMTP] <-- 250 AUTH LOGIN PLAIN
    2015/09/28 17:34:26:656 [ SMTP-Server-pool-2] d.k.b.m.i.s.SMTPHandler:839 [DEBUG] [SMTP] --> AUTH LOGIN
    2015/09/28 17:34:26:656 [ SMTP-Server-pool-2] d.k.b.m.i.s.SMTPHandler:797 [DEBUG] [SMTP] <-- 334 VXNlcm5hbWU6
    2015/09/28 17:34:40:968 [ SMTP-Server-pool-2] d.k.b.m.i.s.SMTPHandler:857 [DEBUG] [SMTP] --> <Line Suppressed>
    2015/09/28 17:34:40:968 [ SMTP-Server-pool-2] d.k.b.m.i.s.SMTPHandler:797 [DEBUG] [SMTP] <-- 334 UGFzc3dvcmQ6
    2015/09/28 17:34:53:671 [ SMTP-Server-pool-2] d.k.b.m.i.s.SMTPHandler:857 [DEBUG] [SMTP] --> <Line Suppressed>
    2015/09/28 17:34:53:671 [ SMTP-Server-pool-2] d.k.b.m.i.s.SMTPHandler:504 [DEBUG] SMTP login with user 'username' and password 'xxxxxxxxxxxxxxxxxxxx'
    2015/09/28 17:34:53:687 [ SMTP-Server-pool-2] d.k.b.r.i.u.RequestUtils:48 [DEBUG] [addUserAgent] added User-Agent KV-Connect()/3.1.2 OS(Windows XP;x86;5.1) JAVA 1.8.0_60 to HTTP header.
    2015/09/28 17:34:54:421 [ SMTP-Server-pool-2] d.k.b.m.i.s.SMTPHandler:797 [DEBUG] [SMTP] <-- 235 Authentication Succeeded


    Unter .Net bekomme ich es einfach nicht hin.
    Ich benutze System.Net.Mail
    Code:
                Dim [to] As New MailAddress(MailAddrTo)
                Dim [from] As New MailAddress(MailAddrFrom)
                Dim client As New SmtpClient(Server, iSnmpPort)
    
                client.DeliveryMethod = SmtpDeliveryMethod.Network
                client.Credentials = New NetworkCredential(MailUserName, MailUserPsw)
                Dim message As New MailMessage([from], [to])
                message.Subject = strSubject
                message.Body = strMessage
    
                client.Send(message)
    Im Log steht:
    2015/09/28 17:49:10:562 [ SMTP-Server] d.k.b.m.i.Connection:95 [INFO ] Connection from localhost (127.0.0.1)
    2015/09/28 17:49:10:562 [ SMTP-Server-pool-4] d.k.b.m.i.s.SMTPHandler:797 [DEBUG] [SMTP] <-- 220 SMTP server (KV-Connect) ready
    2015/09/28 17:49:10:562 [ SMTP-Server-pool-4] d.k.b.m.i.s.SMTPHandler:857 [DEBUG] [SMTP] --> EHLO SZ2
    2015/09/28 17:49:10:562 [ SMTP-Server-pool-4] d.k.b.m.i.s.SMTPHandler:797 [DEBUG] [SMTP] <-- 250-OK
    2015/09/28 17:49:10:562 [ SMTP-Server-pool-4] d.k.b.m.i.s.SMTPHandler:797 [DEBUG] [SMTP] <-- 250 AUTH LOGIN PLAIN
    2015/09/28 17:49:10:562 [ SMTP-Server-pool-4] d.k.b.m.i.s.SMTPHandler:847 [DEBUG] [SMTP] --> AUTH login <password omitted>
    2015/09/28 17:49:10:562 [ SMTP-Server-pool-4] d.k.b.m.i.s.SMTPHandler:328 [ERROR] Verbindung zum MUA abbrechen - Fehler bei der Verarbeitung


    Hoffentlich kann mir jemand helfen, ich bin am Verzweifeln.
    Viele Grüße
    Norbert
    Zuletzt editiert von strzata; 28.09.2015, 19:43. Reason: ergänzt

  • #2
    Schon mal mit debuggen geprüft, was in

    MailUserPsw

    steht?
    Christian

    Comment


    • #3
      Hallo Du Frühaufsteher, Danke für die Post.
      Ich weiss was drin steht, schreib es ja selber rein. Es ist ein Passwort in Base64 codiert. Am Telnet funktioniert es. Beim Debuggen des .Net-Codes sehe ich es auch in den Credentials.

      Comment


      • #4
        Die Fehlermeldung "password omitted" bedeutet, dass ihm das Passwort fehlt. Hätte ja sein können, dass das irgendwie nicht in der Variablen drin steht. Ja, dass es in Telnet geht, habe ich gesehen.
        Hmm, würde davon ausgehen, dass du die Daten (User und Passwort) nicht BASE64 codiert da eiträgst. Das BASE64 codieren wird sicherlich von der Klasse gemacht.

        Also


        New NetworkCredential("start","1234")

        anstatt

        New NetworkCredential("c3RhcnQ=","MTIzNA=")
        Christian

        Comment


        • #5
          Danke Christian,
          aber das hatte ich schon probiert. Und es funzt nicht. Wollte den Datenverkehr mitschneiden. Aber ein "local loopback", also ein Abhören von Localhost habe ich mit keiner im Netz kursierenden Software geschafft. Auch nicht, nachdem ich den Microsoft Loopbackadapter installiert habe.
          Am Telnet gebe ich ja als erstes ein AUTH LOGIN und warte dann ab, dass 334 zurückkommt. Dann gebe ich den UserName ein und wieder kommt 334 zurück, dann gebe ich das Passwort ein. Im Log steht "<Line Suppressed>". Scheinbar werden die Eingaben zwischengespeichert und dann insgesamt verarbeitet. Unter .Net scheint das anders zu laufen. Mit welchen Tricks kann ich irgendwie sehen, was vor sich geht?

          Comment


          • #6
            Wenns mit WireShark nicht geht, den Netzverkehr zu prüfen, ist das blöd.
            - Ev. hast du einen 2. Rechner zur Verfügung?
            - Wenns der Mailserver auf localhost läuft, kann man in dessen Logs ev. genaueres sehen?
            - Kannst du es mit einem externen Mailserver prüfen (GMX, Web.de)
            Ich kann mir nicht vorstellen, dass das mit VB nicht geht. Dafür gibt es schließlich genug Beispiele im Netz zu finden
            Christian

            Comment


            • #7
              Eben hat der Provider geantwortet. Über AUTH PLAIN muss ein String zur Anmeldung gesendet werden. Der setzt sich zusammen aus dem UserNamen, einem Trennzeichen und dem Passwort. Das Trennzeichen sollte Hex 0 sein. Habe also einen String "username\0psw" in Base64 konvertiert. Aber das geht in Telnet auch nicht.
              die \0 wird als Zeichen interpretiert und nicht als 0 und das wird dann schwierig als Base64 abzubilden.
              Daher über Telnet schwierig...(da die Zeichen ausgeplottet werden)
              Wenn Sie die Zeichenfolge über Ihre Streams senden ( auf Byteebene) , dann können Sie eine \0x0 einfach(er) senden...
              Können Sie nicht sowas wie Convert.ToBase64String Method (Byte[]) bei .Net verwenden?
              Wie ist das gemeint? Wie muss ich das in VS machen? Sendet der .Net-Client ein AUTH PLAIN? Und kann man in den Credentials nur einen (statt zwei) Parameter angeben?
              Grüße Norbert

              Comment


              • #8
                Nun habe ich noch festgestellt:
                AUTH LOGIN in Telnet funktioniert
                AUTH login funktioniert nicht und ich bekomme die gleiche Fehlermeldung wie unter .Net
                2015/09/28 17:49:10:562 [ SMTP-Server-pool-4] d.k.b.m.i.s.SMTPHandler:328 [ERROR] Verbindung zum MUA abbrechen - Fehler bei der Verarbeitung

                Scheinbar sendet VB.Net das "login" in Kleinschreibung.
                @Christian:
                Du überforderst mich. Ein so großes Licht bin ich nun wieder auch nicht.

                >> Ev. hast du einen 2. Rechner zur Verfügung?
                Ja, jede Menge. Was soll ich damit machen?

                >> Wenns der Mailserver auf localhost läuft, kann man in dessen Logs ev. genaueres sehen?
                Nur das (auszugsweise) was ich schon hier eingestellt habe. Ich kann Dir aber auch mal das vollständige Log zeigen (über Thunderbird, über Telnet, über .Net?)

                >> Kannst du es mit einem externen Mailserver prüfen (GMX, Web.de)
                Das wird nicht gehen, da noch Zertifikate dazwischen hängen, die geprüft werden.

                Comment


                • #9
                  Bei der LOGIN-Authentifizierung wird wie bei der PLAIN-Authentifizierung der Benutzername und das Passwort unverschlüsselt Base64-kodiert übertragen. Im Unterschied zur PLAIN-Authentifizierung werden die beiden Zeichenketten in zwei Schritten übertragen.

                  https://de.wikipedia.org/wiki/SMTP-Auth

                  Ein 2. Rechner wäre nur zum testen des Netzverkehres, wenn es mit localhost nicht geht. SMTP-Server auf dem einen, SMTP-Client auf dem anderen.
                  Christian

                  Comment


                  • #10
                    Vielen Dank! Wie realisiere ich das jetzt in .Net? Hält sich Net.Mail an diese Konventionen, wenn ich es so programmiere wie in meinem ersten Beitrag (siehe Code) dargestellt?

                    Comment


                    • #11
                      Ich glaube, dass der Fehler woanders ist. Es gibt eine Menge VB, C# Programme, die eMails so versenden. Das wäre schon lange aufgefallen. Insofern habe ich jetzt auch keine Idee mehr
                      Christian

                      Comment


                      • #12
                        Trotzdem Danke für Deine große Mühe. Vielleicht erbarmt sich noch jemand. Sonst muss ich es halt nochmal in einem anderen Forum versuchen.
                        Viele Grüße
                        Norbert

                        Comment


                        • #13
                          Melde mich kurz nochmal. Das Problem ist gelöst. Nachdem mich der Betreiber des Servers 2 Wochen lang mit den sinnlosesten Änderungen an meinem Code beschäftigt hat, konnte ich beweisen, dass der Fehler bei ihm lag.
                          Also:
                          Visual Studio wandelt die Credentials intern nach Base 64 um. Das darf man vorher nicht selbst machen.
                          Im Send wird höchstwahrscheinlich der String "login" in Kleinbuchstaben übertragen. Nachdem auf Serverseite dies als "erlaubt" eingestellt war, funktionierte alles reibungslos.

                          Comment

                          Working...
                          X