2011-09-09 12 views
13

Desidero ottenere tutte le e-mail nella mia applicazione ASP.NET che ha un determinato destinatario CC. Per usarlo per le email future non volevo fare il polling per tutto il tempo per ottenerle. Ma non riesco a trovare un modo, come posso usare push per ottenere le email istantaneamente. Sono i loro quadri in C# per aiutarmi per questo?Notifica al client C#, quando il server SMTP riceve una nuova e-mail

Desidero connettermi con la mia applicazione a un server di posta e registrare un metodo "X". Sempre quando arriva un nuovo messaggio al server di posta, la mia applicazione deve essere notificata e la mia applicazione deve eseguire il metodo 'X'.

spero che questo è possibile con codice come questo:

void Application_Start() 
{ 
    ... 
    ConnectWithTheSmtpServer(); 
    RegisterMethodForNotification(DoSomethink); 
    ... 
} 
void DoSomethink(Mail newMail) 
{ 
    // Do Somethink with the mail 
} 

EDIT:

ho fatto con la MailSystem.Net. Funziona molto bene ed è molto facile da implementare.

codice di esempio:

void Application_Start() 
{ 
    var worker = new BackgroundWorker(); 
    worker.DoWork += new DoWorkEventHandler(StartIdleProcess); 

    if (worker.IsBusy) 
     worker.CancelAsync(); 

    worker.RunWorkerAsync(); 
} 

private void StartIdleProcess(object sender, DoWorkEventArgs e) 
{ 
    if (_imap != null && _imap.IsConnected) 
    { 
     _imap.StopIdle(); 
     _imap.Disconnect(); 
    } 

     _imap = new Imap4Client(); 
     _imap.ConnectSsl(server-name, 993); 
     _imap.Login(username, passwort); 

     var inbox = _imap.SelectMailbox("INBOX"); 

     _imap.NewMessageReceived += new NewMessageReceivedEventHandler(NewMessageReceived); 

     inbox.Subscribe(); 

     _imap.StartIdle(); 
    } 

    public static void NewMessageReceived(object source, NewMessageReceivedEventArgs e) 
    { 
     // Do something with the source... 
    } 
+0

Se si desidera che la funzionalità del server-push (tempo reale spinta, le notifiche push) e si desidera ospitare auto allora dovreste dare un'occhiata a: * [WebSync] (http: //www.frozenmountain.com) * [XSockets] (http://xsockets.net) * [Pokin] (http://pokein.com/) Se non si desidera installare e gestire il proprio tempo reale infrastruttura quindi potresti guardare [Pusher] (http://pusher.com), per chi lavoro. È possibile utilizzare la nostra [libreria .NET] (http://pusher.com/docs/rest_libraries#cs) e fare una semplice chiamata alla nostra API REST, che quindi spingere l'email/notifica a qualsiasi client di ascolto.Vale anche la pena di controllare il mio [re – leggetter

risposta

14

Si sta avvicinando questo dall'angolo sbagliato.

SMTP non supporta la ricezione della posta (non importa la posta PUSH). POP3 è quello che puoi usare per recuperare la posta, ma non ha nemmeno il supporto per PUSH (quindi dovresti tirare per la posta).

L'estensione IMAP4 IDLE è quella che più si riferisce alla posta PUSH, quindi sarà necessario trovare una libreria per C# che supporti IMAP4 IDLE. Ho trovato alcune informazioni che vi farti andare nella giusta direzione (nessuna ragione per duplicare qui):

Tenete a mente quando si sceglie una soluzione che ha bisogno di supporto IDLE. Mi piace molto l'aspetto di MailSystem.Net in quanto soddisfa le vostre esigenze.

Ricorda che anche il tuo server di posta deve avere IMAP4 e IMAP4 IDLE abilitati. Alcuni server di posta non lo supportano, quindi potresti essere sfortunato (e dovresti usare POP3 che tira).

0

Si potrebbe inviare una copia delle email (cioè utilizzando file/etc/aliases in Postfix.) Ad un server di posta si può gestire. Una volta lì, puoi implementare un MAIL PROCESSOR che fa ciò che vuoi in qualsiasi momento arrivi una mail che CONTIENE CERTE CONDIZIONI.

Spero che questo aiuti,

+0

Puoi spiegare cosa intendi con il processore di posta e come posso implementarlo? –

+0

Guarda Procmail per esempio. – tripleee

0

Si può provare questo:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.IO; 
using EAGetMail; //add EAGetMail namespace 

namespace receiveemail 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Create a folder named "inbox" under current directory 
      // to save the email retrie enter code here ved. 
      string curpath = Directory.GetCurrentDirectory(); 
      string mailbox = String.Format("{0}\\inbox", curpath); 

      // If the folder is not existed, create it. 
      if (!Directory.Exists(mailbox)) 
      { 
       Directory.CreateDirectory(mailbox); 
      } 

      // Gmail IMAP4 server is "imap.gmail.com" 
      MailServer oServer = new MailServer("imap.gmail.com", 
       "[email protected]", "yourpassword", ServerProtocol.Imap4); 
      MailClient oClient = new MailClient("TryIt"); 

      // Set SSL connection, 
      oServer.SSLConnection = true; 

      // Set 993 IMAP4 port 
      oServer.Port = 993; 

      try 
      { 
       oClient.Connect(oServer); 
       MailInfo[] infos = oClient.GetMailInfos(); 

       for (int i = 0; i < infos.Length; i++) 
       { 
        MailInfo info = infos[i]; 
        Console.WriteLine("Index: {0}; Size: {1}; UIDL: {2}", 
         info.Index, info.Size, info.UIDL); 

        // Download email from GMail IMAP4 server 
        Mail oMail = oClient.GetMail(info); 

        Console.WriteLine("From: {0}", oMail.From.ToString()); 
        Console.WriteLine("Subject: {0}\r\n", oMail.Subject); 

        // Generate an email file name based on date time. 
        System.DateTime d = System.DateTime.Now; 
        System.Globalization.CultureInfo cur = new 
         System.Globalization.CultureInfo("en-US"); 
        string sdate = d.ToString("yyyyMMddHHmmss", cur); 
        string fileName = String.Format("{0}\\{1}{2}{3}.eml", 
         mailbox, sdate, d.Millisecond.ToString("d3"), i); 

        // Save email to local disk 
        oMail.SaveAs(fileName, true); 

        // Mark email as deleted in GMail account. 
        oClient.Delete(info); 
       } 

       // Quit and purge emails marked as deleted from Gmail IMAP4 server. 
       oClient.Quit(); 
      } 
      catch (Exception ep) 
      { 
       Console.WriteLine(ep.Message); 
      } 
     } 
    } 
} 
+0

È necessario aggiungere una spiegazione alla soluzione. –

+0

Ci sono commenti nel codice, che spiegano cosa fa ogni riga di codice ... –

Problemi correlati