2011-09-09 19 views
13

Quiero obtener todos los correos electrónicos en mi aplicación ASP.NET que tienen un determinado destinatario CC. Para usar esto para futuros correos electrónicos, no quería sondear todo el tiempo para obtenerlos. Pero no puedo encontrar la manera, cómo puedo usar push para obtener los correos instantáneamente. ¿Hay algún marco en C# que me ayude para esto?Notificar al cliente C#, cuando el servidor SMTP recibe un nuevo correo electrónico

Quiero conectar con mi aplicación a un servidor de correo y registrar un método 'X'. Siempre que llega un nuevo mensaje al servidor de correo, mi aplicación debe ser notificada y mi aplicación debe ejecutar el método 'X'.

espero que esto es posible con un código como éste:

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

EDIT:

lo hice con la MailSystem.Net. Funciona muy bien y es muy fácil de implementar.

Código de ejemplo:

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

Si desea la funcionalidad de servidor push (empujar en tiempo real, notificaciones push) y que desea alojar uno mismo, entonces debería echar un vistazo a: * [WebSync] (http: //www.frozenmountain.com) * [XSockets] (http://xsockets.net) * [Pokin] (http://pokein.com/) Si no quieres instalar y administrar tu propio tiempo real infraestructura, entonces podrías mirar a [Pusher] (http://pusher.com), para quien trabajo. Puede usar nuestra [.NET library] (http://pusher.com/docs/rest_libraries#cs) y hacer una simple llamada a nuestra API REST, que luego enviaría el correo electrónico/notificación a cualquier cliente que esté escuchando.También vale la pena revisar mi [re – leggetter

Respuesta

14

Se está acercando a esto desde el ángulo equivocado.

SMTP no admite la recepción de correo (no importa el correo PUSH). POP3 es lo que puede usar para recuperar correo, pero tampoco tiene soporte para PUSH (por lo que tendrá que extraer el correo).

La extensión IMAP4 IDLE es lo que más se conoce como correo PUSH, por lo que deberá encontrar una biblioteca para C# que sea compatible con IMAP4 IDLE. He encontrado alguna información que le conseguirá que va en la dirección correcta (no hay razón para duplicar aquí):

que tener en cuenta al elegir una solución que necesita soporte IDLE. Me gusta mucho el aspecto de MailSystem.Net ya que cumple con sus requisitos.

Recuerde que su servidor de correo también necesita tener IMAP4 e IMAP4 IDLE habilitados. Algunos servidores de correo no son compatibles, por lo que puede estar limpio de mala suerte (y tendrá que utilizar POP3 tirando).

0

Usted puede enviar una copia de los mensajes de correo electrónico (es decir, utilizando el archivo/etc/alias en PostFix.) A un servidor de correo que puede manejar. Una vez allí, puede implementar un PROCESADOR DE CORREO que haga lo que quiera en cualquier momento que llegue un correo que CUMPLA CONDICIONES.

Espero que ayude,

+0

¿Puede explicar a qué se refiere con el procesador de correo y cómo puedo implementarlo? –

+0

Mira Procmail por ejemplo. – tripleee

0

Puede probar esto:

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

Debe agregar una explicación a su solución. –

+0

Hay comentarios en el código que explican qué hace cada línea de código ... –

Cuestiones relacionadas