Laden...

SmtpClient unterschied .Net 3.5 und .Net 4

Erstellt von Mighty Panther vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.591 Views
Mighty Panther Themenstarter:in
22 Beiträge seit 2008
vor 13 Jahren
SmtpClient unterschied .Net 3.5 und .Net 4

Hallo!

Ich habe ein Problem mit dem SmtpClient unter 3.5.
Wenn ich eine Email versenden will, bekomme ich bei einigen Emails folgende Fehlermeldung.
System.Net.Mail.SmtpFailedRecipientException: Postfach nicht verfügbar. Die Serverantwort war: must be authenticated
(NetworkCredential habe ich beachtet)

Unter .Net 4 funktioniert die Geschichte.
Ich fand schnell heraus, woran das lag.
Das Problem ist, dass die Emails, wo es nicht funktionierte im Passwort Umlaute wie (ä/ü/ö etc.) hatten.

Meine Frage ist nun ob ich unter 3.5 irgend etwas bei NetworkCredential einstellen kann, dass er die Umlaute beim Anmelden am Server richtig interpretiert.

thx
Mighty

A
2 Beiträge seit 2010
vor 13 Jahren

Hier ein einfaches Beispiel wie ich die mails ‚zu Fuß’ über den Strato Server verschicke. Versuch mal damit.
Nebenbei werden auch die aktuellen GPS Daten und der X-Mailer an die mail header angehängt.


using System.Net;
using System.Net.Sockets;


            IPHostEntry host = Dns.GetHostEntry("smtp.strato.de");

            IPEndPoint endPoint = new IPEndPoint(host.AddressList[0], 25);
            Socket s = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            s.Connect(endPoint);
            WarteAufServerAntwort(s);

            Senddata(s, string.Format("HELO {0}\r\n", Dns.GetHostName()));
            WarteAufServerAntwort(s);

            // SMTP Authentifizierung
            Senddata(s, string.Format("AUTH LOGIN \r\n"));
            WarteAufServerAntwort(s);

            // login, Base64-Kodierung
            Senddata(s, EncodeTo64("user@stratodomain.de") + "\r\n");
            WarteAufServerAntwort(s);

            // pass, Base64-Kodierung
            Senddata(s, EncodeTo64("password") + "\r\n");
            WarteAufServerAntwort(s);

            // Absender
            Senddata(s, string.Format("MAIL FROM: <user@stratodomain.de>\r\n")); 
            WarteAufServerAntwort(s);

            // Empfänger
            Senddata(s, string.Format("RCPT TO: <nobody@domain.de>\r\n"));
            WarteAufServerAntwort(s);

            StringBuilder Header = new StringBuilder();
            Header.Append("From: user@ stratodomain.de\r\n");
            Header.Append("To: nobody@ domain.de\r\n");
            Header.Append("Date: Sat, 24 Jul 2010 03:52:52 +0200 (MEST)\r\n");
            Header.Append("Subject: Test Mailversand\r\n");
            Header.Append("X-Mailer: myCSharp Tool\r\n");
            Header.Append("X-GeoRegion: DE-BY \r\n");
            Header.Append("X-GeoPlacename: Olching, Deutschland\r\n");
            Header.Append("X-GeoPosition: 48.197976;11.324308\r\n");
            Header.Append("X-ICBM: 48.197976,11.324308\r\n");
            
            string MsgBody = "Mail test\r\n";
   
            Senddata(s, ("DATA\r\n"));
            WarteAufServerAntwort(s);

            Header.Append("\r\n");
            Header.Append(MsgBody);
            Header.Append(".\r\n");
            Header.Append("\r\n");
            Header.Append("\r\n");

            Senddata(s, Header.ToString());
            WarteAufServerAntwort(s);

            Senddata(s, "QUIT\r\n");
            WarteAufServerAntwort(s);

            s.Close();



dazu noch zwei Methoden :



        static public string EncodeTo64(string toEncode)
        {
            byte[] toEncodeAsBytes= System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
            string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
            return returnValue;
        }

        private static void WarteAufServerAntwort(Socket s)
        {
            byte[] buffer = new byte[1024];
            while (s.Available == 0)
            {
                System.Threading.Thread.Sleep(100);
            }
            s.Receive(buffer, 0, s.Available, SocketFlags.None);
            string serverAntwort = Encoding.ASCII.GetString(buffer);
        }