[ Dejan Krstic @ 08.06.2002. 22:33 ] @
Jel zna neko kako da iz c# aplikacije posaljem mail preko smtp protokola?
[ Dragi Tata @ 08.06.2002. 22:56 ] @
http://www.codeproject.com/csharp/sendmailcsharp.asp
[ Dejan Krstic @ 09.06.2002. 12:57 ] @
Hvala a kako da mi aplikacija ne bude zamrznuta dok on pokusava da se poveze na server?
[ Dragi Tata @ 09.06.2002. 20:39 ] @
Mislim da je dobro rešenje da se taj kod za povezivanje i slanje mail-a smesti u posebnu nit (thread), pa da se pritiskom na komandu samo aktivira nova nit koja će da vrši posao u pozadini.

A možda je moguće koristiti i asinhroni poziv, bez kreiranja novih niti. Pogledaću, pa ću da javim.
[ Dragi Tata @ 11.06.2002. 17:29 ] @
Evo ga još bolje rešenje.

http://www.codeproject.com/csharp/smtpemailer.asp

Zašto je bolje? Najpre, program je mnogo bolje isprojektovan. Klase koje obavljaju posao su odvojene od UI-ja, tako da mogu lako biti iskorišćene i u drugim tipovima aplikacija, kao što je ASP.NET ili Web servisi. Takođe, iskorišćena je jedna lepa osobina C#-a, a to je XML komentari. Najzad, postoji i metod koji šalje mail asinhrono - bez blokiranja.

U svakom slučaju fin primer, i savetujem svima da ga malo razgledaju.

[Ovu poruku je menjao Dragi Tata dana 14.06.2002 u 10:39 AM GMT]
[ Dejan Krstic @ 12.06.2002. 17:11 ] @
Hvala puno za onaj primer ali opet mi nesto nije jasno. Ne mogu da ukapiram iz onog primera kako je on uspeo da se poveze i da odradi slanje bez da zaglavi aplikacija? Da li bi to, molim te, mogao da mi pojasnis?
[ Dragi Tata @ 14.06.2002. 00:12 ] @
Nisam startovao taj primer, ali koliko vidim, postoji opcija da se slanje mail-a obavi asinhrono, tj. startuje se nova nit (thread) koja to obavi, a glavna nit koja kontroliše UI ostaje slobodna i nema zamrzavanja.

Znaš li nešto o višenitnom programiranju ili da ti napišem koju reč i o tome?

Pozdrav.
[ Dejan Krstic @ 14.06.2002. 14:23 ] @
Znam samo izgleda nisam bio dobro ukapirao kako to radi iz c#-a :)
[ Dragi Tata @ 14.06.2002. 20:26 ] @
OK. Ako pogledaš fajl TestForm.cs, videćeš da se u funkciji button2_Click (grozno ime za kontrolu - button2) poziva metod SendMessageAsync klase SmtpEmailer. E sad, kad pogledaš definiciju te klase u fajlu SmtpEmailer.cs videćeš da pomenuti metod izgleda ovako:

Code:

public void SendMessageAsync()
{
  new Thread(new ThreadStart(SendMessage)).Start();
}


Ovaj metod će da pozove SendMessage (koji u stvari vrši sav posao) u posebnoj niti i odmah će da se vrati, bez blokiranja aplikacije. Tako ti možeš da radiš sa UI-jem dok se mailovi šalju u odvojenoj niti. Kad je mail poslat (tj kad se završi funkcija SendMessage) ta "pozadinska nit" se završava i biva počišćena.
[ MAD-MAX @ 14.06.2002. 23:52 ] @
Evo jedan vrlo lak nacin za slanje maila.

Ovaj primer sam nasao na C# corner-u a ima jos mnogo drugih cool stvari. Kako u C#-u nikad nisam pisao mail program ovo mi bas izgleda lako (sve mi se vise i vise svidja ovaj VS.NET:)). Iznenadila me je velicina koda koji u stvari vrsi poso (znaci bez onog standardnog oko kreiranja kontrola...)

Evo vam i ceo projekat!

Imam jos nekoliko clanaka oko mailinga u C#-u pa mogu da postujem ako hocete mada je Dragi sve lepo objasnio :)

[ Dejan Krstic @ 15.06.2002. 19:17 ] @
www.deki.co.yu/dev

Programce za slanje poruka na mobilne telefone napravljen na osnovu onog sto sam naucio iz ove teme :)

[Ovu poruku je menjao Dejan Krstic dana 29.07.2002 u 04:07 PM GMT]
[ MAD-MAX @ 17.06.2002. 00:17 ] @
Pa postuj i source pa da i mi naucimo :)

Izgleda da si dovoljno naucio ali evo da postujem i ovaj source kojeg sam nasao u mojoj "staroj" arhivi ali nisam imao vremena da ga postujem (nadam se da ne smeta :)).

simpleSMTPMailer:

Code:



using System.Net.Sockets;
using System.Collections;
using System.IO;
using System.Net;
using System;

class SMTPMailer
{
    string SMTPServer;
    string host;

    public SMTPMailer(string server, string _host){
        SMTPServer = server;
        host = _host;
    }

    public void Send(Message msg)
    {
        TCPClient sender = new TCPClient(SMTPServer,25);
        Byte[] outbytes;
        string input;

        try{
            NetworkStream ns = sender.GetStream();
            StreamReader sr = new StreamReader(sender.GetStream() );
            Console.WriteLine(sr.ReadLine() );

            input = "HELO " + host + "\r\n";
            outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
            ns.Write(outbytes,0,outbytes.Length) ;
            Console.WriteLine(sr.ReadLine() );

            input = "MAIL FROM: " +"<" + msg.From + ">" + "\r\n";
            outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
            ns.Write(outbytes,0,outbytes.Length) ;
            Console.WriteLine(sr.ReadLine() );

            input = "RCPT TO: " + "<" + msg.To + ">" + "\r\n";
            outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
            ns.Write(outbytes,0,outbytes.Length) ;
            Console.WriteLine(sr.ReadLine() );

            input = "DATA" + "\r\n";
            outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
            ns.Write(outbytes,0,outbytes.Length) ;
            Console.WriteLine(sr.ReadLine() );

            input ="Subject: " + msg.Subject + "\r\n" + msg.Body + "\r\n" + "." + "\r\n";
            outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
            ns.Write(outbytes,0,outbytes.Length) ;
            Console.WriteLine(sr.ReadLine() );

            input ="QUIT" + "\r\n";
            outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
            ns.Write(outbytes,0,outbytes.Length) ;
            Console.WriteLine(sr.ReadLine() );

            sr.Close();
            ns.Close();
        }
        catch(InvalidOperationException ioe){
            Console.WriteLine("Could not connect to mail server");
        }
    }

    public static void Main()
    {
        SMTPMailer mlr = new SMTPMailer("smtp-server", "main");
        Message msg = new Message("[email protected]","[email protected]",
                "Hello!", "This is a test...");
 
        mlr.Send(msg);

        Console.ReadLine();

    }
}

class Message
{
    string to;
    string from;
    string subject;
    string body;

    public Message(){
    }
    public Message(string _to, string _from, string _subject, string _body){
        to = _to;
        from = _from;
        body = _body;
        subject = _subject;
    }
    public string To {
        get {return to;}
        set {to = value;}
    }
    public string From {
        get {return from;}
        set {from = value;}
    }
    public string Body {
        get {return body;}
        set {body = value;}
    }
    public string Subject {
        get {return subject;}
        set {subject = value;}
    }
}



[ Dejan Krstic @ 19.06.2002. 22:11 ] @
Inace program verovatno vraca gresku 550 i ne salje poruke a to je zbog mobtelovog servera koji od juce popodne odbija da prosledjuje poruke na mobilne telefone iz ko zna kog razloga. Ako nesto budem saznao javicu.
[ Dejan Krstic @ 20.06.2002. 16:42 ] @
Ponovo radi slanje bez problema.