2011-09-09 6 views
13

特定のCC受信者を持つASP.NETアプリケーションですべての電子メールを取得したい。将来の電子メールにこれを使用するために、私はそれらを取得するために常にポーリングしたくなかった。しかし、私は方法を見つけることができません、どのように即座に電子メールを取得するためにプッシュを使用することができます。 C#のそれらのフレームワークは私にこれを手伝ってくれますか?SMTPサーバーが新しい電子メールを受信したときにC#クライアントに通知する

私のアプリケーションとメールサーバーを接続し、メソッド 'X'を登録したいとします。常に新しいメッセージがメールサーバーに到着したとき、私のアプリケーションに通知する必要があり、私のアプリケーションはメソッド 'X'を実行する必要があります。

私がこのようなコードを持つことが可能であることを願っています:

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

EDIT:

私はMailSystem.Netでそれをやりました。非常にうまく動作し、実装が非常に簡単です。

サンプルコード:

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

を: //www.frozenmountain.com) * [XSockets](http://xsockets.net) * [Pokin](http://pokein.com/)自分のリアルタイムをインストールして管理したくないあなたが私のために働いている[Pusher](http://pusher.com)を見ることができます。私たちの[.NETライブラリ](http://pusher.com/docs/rest_libraries#cs)を使用してREST APIを簡単に呼び出すことができます.REST APIを使用すると、リッスンするすべてのクライアントに電子メール/通知を送信します。また、私のチェックアウトの価値があります[再 – leggetter

答えて

14

これは間違った角度から近づいています。

SMTPは受信メールをサポートしていません(PUSHメールは決して気にしません)。 POP3はメールの取得に使用できるものですが、PUSHのサポートもありません(メールを引き出す必要があります)。

IMAP4 IDLE拡張子はPUSHメールとよく呼ばれているので、IMAP4 IDLEをサポートするC#のライブラリを探す必要があります。私はあなたが正しい方向に軌道に乗るだろういくつかの情報を見つけました(理由はここでそれを複製していないため):

に注意してください、それはする必要があるソリューションを選択するときIDLEをサポートします。 私は本当にあなたの要件を満たすようにMailSystem.Netの外観が好きです。

メールサーバーでもIMAP4とIMAP4 IDLEが有効になっている必要があります。いくつかのメールサーバーはそれをサポートしていないので、運が悪いかもしれません(そしてPOP3のプルを使用する必要があります)。

0

あなたが扱うことができるメールサーバにあなたの電子メールのコピー(。Postfixの中すなわち使用しての/ etc/aliasesファイル)を送信することができます。いったんそこにいけば、あなたはいつでもメールが特定の条件に合ったときにいつでも何でもできるメールプロセッサを実装することができます。

希望するもの、

+0

メールプロセッサの意味を説明して、それをどうやって実装できますか? –

+0

例えば、Procmailを見てください。 – tripleee

0

あなたはこの試みることができます:* [WebSync](HTTP:サーバー・プッシュ機能が必要(リアルタイムプッシュ、プッシュ通知)し、自己ホストにしたい場合は、あなたが見てみる必要があります

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

ソリューションに説明を追加する必要があります。 –

+0

コードの各行が何をしているかを説明するコードにはコメントがあります... –

関連する問題