Aviser le Client C#, lorsque le serveur SMTP reçoit un nouveau courriel

je veux avoir tous les e-mails dans mon ASP.NET demande qui ont un certain CC-bénéficiaire. Pour utiliser ceci pour les e-mails futurs Je ne voulais pas sonder tout le temps pour les obtenir. Mais je n'arrive pas à trouver un moyen, comment je peux utiliser push pour obtenir les e-mails instantanément. Y a des cadres en C# pour m'aider pour cela?

je veux me connecter avec mon application à un serveur de messagerie et enregistrer une méthode 'X'. Toujours quand un nouveau message est arrivé au serveur de messagerie, mon application doit être notifié et mon application doit exécuter la méthode 'X'.

j'espère que c'est possible avec ce code:

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

EDIT:

je l'ai fait avec le MailSystem.Net. Il fonctionne très très bien et est très facile à mettre en œuvre.

Exemple De Code:

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...
    }
16
demandé sur mr springer 2011-09-09 11:17:41

3 réponses

vous vous en approchez sous le mauvais angle.

SMTP ne supporte pas la réception de courrier (peu importe PUSH mail). POP3 est ce que vous pouvez utiliser pour récupérer le courrier, mais il n'a pas de support pour PUSH non plus (donc vous devriez tirer pour le courrier).

IMAP4 IDLE l'extension est ce que la plupart appellent PUSH mail - donc vous aurez besoin de trouver une bibliothèque pour C# qui supporte IMAP4 IDLE. J'ai trouvé quelques informations qui vous aideront à aller dans la bonne direction (pas de raison de le reproduire ici):

gardez à l'esprit lors du choix d'une solution qu'il doit soutenir IDLE. J'aime vraiment le look de MailSystem.Net comme il répond à vos exigences.

rappelez-vous que votre serveur de messagerie doit également avoir IMAP4 et IMAP4 IDLE activé. Certains serveurs de messagerie ne prennent pas en charge il, de sorte que vous pourriez être propre de la chance (et devra utiliser POP3 tirant).

16
répondu Jonathan Dickinson 2017-05-23 11:46:58

vous pouvez envoyer une copie de vos e-mails(c.-à-d. en utilisant le fichier /etc/aliases dans PostFix) à un serveur de messagerie que vous pouvez gérer. Une fois là-bas, vous pouvez implémenter un processeur de courrier qui fait ce que vous voulez à tout moment un courrier qui répond à certaines CONDITIONS arrive.

Hope qui aide,

0
répondu Ramon Araujo 2011-09-09 07:42:24

Vous pouvez essayer ceci:

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",
                "gmailid@gmail.com", "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);
            }
        }
    }
}
-1
répondu king zecole 2017-01-06 17:17:41