Email senden mit C#/Silverlight



  • Guten Morgen,
    ich hoffe das mir hier geholfen werden kann.
    Also ich bin recht neu in sachen C# Programmierung, und nun habe ich auch schon das erste Problem welches ich noch nirgends finden konnte.

    Ich versuche seit einigen Tagen ein Programm zu Schreiben mit dem es möglich ist Emails über eine Silverlight Oberfläche zu versenden. Also im Prinzip ein Kontaktformular welches man auf fast jeder Webseite in HTML/PHP findet.

    Ich habe mittlerweile schon einige Tutorials im Internet gefunden, doch stoße ich immer wieder auf dasselbe Problem.

    In allen Anleitungen dazu steht das man einen Verweis zum Projekt hinzufügen muss und anschließend der Namespace mit einer using Directive eingebunden werden muss. Es handelt sich dabei um

    using System.Net.Mail;
    

    Jedoch finde ich das nicht bei mir nicht, und sobald ich die using Directive eingebe bekomme ich eine Fehlermeldung:

    Der Typ- oder Namespacename "Mail" ist im Namespace "System.Net" nicht vorhanden. (Fehlt ein Assemblyverweis?)
    

    Danach soll ich dann die Klasse MailMessage anlegen mit beispielsweise:

    MailMessage msg = new MailMessage();
    

    Hiebei bekomme ich dann auch einen Fehler:

    Der Typ- oder Namespacename "MailMessage" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)
    

    Das ist ja auch verständlich da ich den Verweis oben schon nicht einbinden kann.
    Wieso finde ich den Verweis nicht in der Liste bzw. wo bekomme ich den her? Oder was mache ich Falsch?
    Ich bin echt kurz vorm verzweifeln. Denn selbst auf der Microsoft Seite steht das es ab .NET 2 enthalten ist. Alternativ sollte auch

    using System.Web.Mail;
    

    funktionieren, doch selbst das finde ich nirgends.

    Ich hoffe ihr könnt mir helfen.
    Vielen Dank
    Numax



  • Im .NET-Framework ist es drin, nicht aber in Silverlight!
    Silverlight hat nur einen Teil der Klassen und Namespaces des "richtigen" .NET-Frameworks:
    http://msdn.microsoft.com/de-de/library/cc838194(VS.95).aspx

    Bei Silverlight-Apps ruft man meistens nen Webservice auf, welcher dann den eigentlichen Mailversand übernimmt.



  • Danke schonmal für die schnelle Antwort, bin jetzt auch schon ein ganzes Stück weiter gekommen.
    Ich habe nun einen WebService erstellt und eine Web.config Datei angelegt.
    Habe auch eine Anleitung gefunden die so vorgeht, jetzt macht mir allerdings eine Zeile Probleme.

    Hier einmal der Code aus der MainPage.xaml.cs der ausgeführt wird sobal man auf Senden drückt:

    void Senden_Button_Click(object sender, RoutedEventArgs e)
    		{
                string ToEmail = "test@beispiel.de";
    
    			BasicHttpBinding bind = new BasicHttpBinding();
    
    			EndpointAddress endpoint = new EndpointAddress("http://localhost:51639/BeispielSite/MailServ.asmx");
    
                Proxy.MailServSoapClient mailService = new SendEmail.Proxy.MailServSoapClient(bind, endpoint);
    
                mailService.SendAsync(Email.Text, ToEmail, Betreff.Text, Nachricht.Text);
    
                mailService.SendCompleted += new EventHandler<Proxy.SendCompletedEventArgs>(mailService_SendCompleted);
    		}
    

    Die nachfolgende Zeile ist es die wieder den Fehler ausgibt, das ein Assemblyverweis oder eine Using-Directive fehlt:

    Proxy.MailServSoapClient mailService = new SendEmail.Proxy.MailServSoapClient(bind, endpoint);
    

    Bei SendEmail wird der fehler ausgegeben. Jedoch finde ich nicht den Namespace in dem das integriert sein soll, bzw. ist er wahrscheinlich nicht in Silverlight vorhanden.

    Hier nochmal die Webseite auf der ich eine entsprechende Anleitung gefunden habe: http://www.redmondpie.com/developing-an-email-application-using-silverlight-2-beta-2/



  • Wie sieht denn dein Webservice aus?

    PS: Die redmondpie-Anleitung scheint auch nicht ganz problemlos zu funktionieren ...



  • Der sieht im Prinzip genauso aus wie in der Anleitung.

    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.Services;
    using System.Net.Mail;
    
    /// <summary>
    /// Zusammenfassungsbeschreibung für MailServ
    /// </summary>
    [WebService(Namespace = "http://beispiel.de/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    // Um das Aufrufen dieses Webdiensts aus einem Skript mit ASP.NET AJAX zuzulassen, heben Sie die Auskommentierung der folgenden Zeile auf. 
    // [System.Web.Script.Services.ScriptService]
    public class MailServ : System.Web.Services.WebService
    {
    
        public MailServ()
        {
    
            //Auskommentierung der folgenden Zeile bei Verwendung von Designkomponenten aufheben 
            //InitializeComponent(); 
        }
    
        [WebMethod]
        public bool Send(string fromEmail, string toEmail, string subject, string body)
        {
            try
            {
                MailMessage message = new MailMessage();
                message.From = new MailAddress(fromEmail);
                message.To.Add(new MailAddress(toEmail));
                message.Subject = subject;
                message.Body = body;
                message.IsBodyHtml = false;
    
                SmtpClient smtp = new SmtpClient();
                smtp.EnableSsl = true;
                smtp.Send(message);
    
                return true;
            }
    
            catch (Exception ex)
            {
                return false;
            }
    
         }
    }
    

    Ja, das die Anleitung nicht Problemlos laufen soll habe ich auch gemerkt und es steht auch unter den Kommentaren. Dort wurde sogar dasselbe Problem wie bei mir beschrieben, allerdings kam darauf keine Antwort.



  • Numax schrieb:

    Die nachfolgende Zeile ist es die wieder den Fehler ausgibt, das ein Assemblyverweis oder eine Using-Directive fehlt:

    Proxy.MailServSoapClient mailService = new SendEmail.Proxy.MailServSoapClient(bind, endpoint);
    

    Bei SendEmail wird der fehler ausgegeben. Jedoch finde ich nicht den Namespace in dem das integriert sein soll, bzw. ist er wahrscheinlich nicht in Silverlight vorhanden.

    Der Namespace "Proxy" sowie die Klasse "MailServSoapClient" wird automatisch von VisualStudio durch das Hinzufügen der "Service Reference" erzeugt - Den Namen "Proxy" hast du da nämlich eingegeben (oder solltest du haben)

    Aber abgesehen davon müsste das eher so aussehen:

    Proxy.MailServSoapClient mailService = new Proxy.MailServSoapClient(bind, endpoint);
    


  • Ich frage mich gerade wieso du den Bind selbst machst.
    Wenn man schon Visual Studio verwendet dann bitte auch die Features.
    Webservice hinzufügen
    Klasse aufrufen.
    Asyncfunktion erstellen lassen und das sollte alles gewesen sein.
    Dauer: 5 Minuten.



  • Also jetzt weiß ich nicht mehr weiter.

    Ich habe jetzt diese Zeile geändert und das SendEmail da weg genommen.
    Nur funktionieren tut hier garnix.



  • //private bool sendmail(string to, string htmltext, string subject)
            //{
            //    try
            //    {
            //        MailMessage mail = new MailMessage();
            //        SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
            //        SmtpServer.DeliveryMethod = SmtpDeliveryMethod.Network;
    
            //        mail.From = new MailAddress("deine mailadresse","ichbinses");
            //        mail.To.Add(to);
            //        mail.Subject = subject;
    
            //        mail.IsBodyHtml = true;
            //        string htmlBody;
    
            //        htmlBody = htmltext;
    
            //        mail.Body = htmlBody;
    
            //        SmtpServer.Port = 587;
            //        SmtpServer.Credentials = new System.Net.NetworkCredential("USERNAME", "PASSWORT");
            //        SmtpServer.EnableSsl = true;
    
            //        SmtpServer.Send(mail);
    
            //    }
            //    catch (Exception ex)
            //    {
            //        return false;
            //    }
            //    return true;
            //}
    

    So funktioniert senden über GMAIL.



  • Numax schrieb:

    Also jetzt weiß ich nicht mehr weiter.

    Ich habe jetzt diese Zeile geändert und das SendEmail da weg genommen.
    Nur funktionieren tut hier garnix.

    Bestimmt hast du mit deinem Webservice zu Testzwecken schon eine Email an dich selbst gesendet. Hat das problemlos funktioniert?



  • So nun habe ich das ganze mal mit der Vorlage für gmail gemacht.
    Wenn ich diese Datei mit dem WebDeveloper Debugge, funktioniert das Senden.
    Versuche ich das jedoch mit der Anwendung selber dann Funktioniert das nicht, ich denke das die eingetragenen werte aus der MainPage.xaml.cs nich übermittelt werden.
    Muss ich diese Werte erst in neue Variablen bringen und dann in den Webservice einbinden, oder wie funktioniert das? Oder muss ich generell erst die werte aus den Textboxen verarbeiten, damit diese über die MainPage.xaml.cs überhaupt an den WebService gesendet werden?
    Hier der ausschnitt aus der MainPage.xaml.cs:

    void Senden_Button_Click(object sender, RoutedEventArgs e)
    		{
                string ToEmail = "test@beispiel.de";
    
    			BasicHttpBinding bind = new BasicHttpBinding();
    
    			EndpointAddress endpoint = new EndpointAddress("http://localhost:51639/TestSite/MailServ.asmx");
    
                Proxy.MailServSoapClient mailService = new Proxy.MailServSoapClient(bind, endpoint);
    
                mailService.SendAsync(Email.Text, ToEmail, Betreff.Text, Nachricht.Text);
    
                mailService.SendCompleted += new EventHandler<Proxy.SendCompletedEventArgs>(mailService_SendCompleted);
    		}
    

    hier der Webservice:

    public bool Send(string toEmail, string subject, string body)
        {
            try
            {
                    MailMessage mail = new MailMessage();
                    SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
                    SmtpServer.DeliveryMethod = SmtpDeliveryMethod.Network;
    
                    mail.From = new MailAddress("xxxx.xxxx@googlemail.com","Numax");
                    mail.To.Add(toEmail);
                    mail.Subject = subject;
    
                    mail.IsBodyHtml = true;
                    string htmlBody;
    
                    htmlBody = body;
    
                    mail.Body = body;
    
                    SmtpServer.Port = 587;
                    SmtpServer.Credentials = new System.Net.NetworkCredential("xxxx.xxxx", "xxxxxxxx");
                    SmtpServer.EnableSsl = true;
    
                    SmtpServer.Send(mail);
    
            }
    
            catch (Exception ex)
            {
                return false;
            }
                return true;
        }
    


  • Numax schrieb:

    Muss ich diese Werte erst in neue Variablen bringen und dann in den Webservice einbinden, oder wie funktioniert das? Oder muss ich generell erst die werte aus den Textboxen verarbeiten, damit diese über die MainPage.xaml.cs überhaupt an den WebService gesendet werden?

    Nein.

    Das Problem scheint dein Service-Binding zu sein ... per Ferndiagnose kaum zu lösen.



  • In wie fern ist das mit dem Service-Binding zu vertsehen?

    Wie soll ich nun am besten vorgehen um das Problem zu lösen?



  • Joa ganz einfach eigentlich. Wenn du es lokal ausführst sind die Endpoints anders, als wenn du es auf den Server spielst und dann von dort aufrufst. Ich hab dazu was auf meinem blog geschrieben. Probier das einfach mal aus:

    http://www.blog-dotnetprogrammierung.de/?p=7



  • So ganz steige ich da noch nicht durch. Bin halt auch sehr neu in sachen C#.

    Aber würde es dann nicht reichen einfach die EndpointAdress umzuschreiben auf die daten vom Server?



  • Würde reichen, wobei du das jedesmal machen musst wenn du auf einen anderen Server deployes. Die Lösung von mir macht das ganze dynamisch für dich. Musste dich wohl einarbeiten, führt kein Weg drumherum, besonders wenn du weiter Silverlight machen willst.



  • Ich habe das grade mal probiert die EndpointAdress auszutauschen, jedoch funktioniert das auch nicht.

    Also so wie ich das sehe werden die Daten von der MainPage.xaml.cs nich an den WebService übermittelt bzw. nicht das Signal zum Senden gegeben.



  • Numax schrieb:

    Ich habe das grade mal probiert die EndpointAdress auszutauschen, jedoch funktioniert das auch nicht.

    Also so wie ich das sehe werden die Daten von der MainPage.xaml.cs nich an den WebService übermittelt bzw. nicht das Signal zum Senden gegeben.

    Das siehst du vermutlich richtig. Probleme im Binding sorgen dafür, dass dein WebService für deine Silverlight-Anwendung unerreichbar bleibt. Deshalb gehen alle weiterführenden Anweisungen ins Leere. Aber ohne das vollständige Projekt sind Fehlersuche / -behebung zum Scheitern verurteilt ...


Log in to reply