SkyDrive へ移動 メールサーバーは GMail の IMAP を使用してテストしています MainWindow.xaml.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Net; using System.Windows; using System.Windows.Input; using System.Collections.ObjectModel; using TKMP.Net; using System.IO; using TKMP.Reader; using System.Threading; namespace WPF_DataGrid1 { public partial class MainWindow : Window { private MainViewModel mvm = new MainViewModel(); private SynchronizationContext sc = null; private ImapClient client = null; private int endCounter = 0; // ********************************************* // コンストラクタ // ********************************************* public MainWindow() { InitializeComponent(); this.dataGrid1.DataContext = mvm; } // 接続および、メールヘッダの取得 private void actButton_Click(object sender, RoutedEventArgs e) { mvm.mail_data.Clear(); BasicImapLogon logon = new BasicImapLogon(this.userName.Text, this.password.Password ); client = new ImapClient(logon, "imap.gmail.com", 993); client.AuthenticationProtocol = AuthenticationProtocols.SSL; if (!client.Connect()) { return; } // メールデータ一覧を格納するオブジェクト IMailData[] md = client.GetMailList(); // データがありません if (md == null) { return; } // メールデータの数 mailCount.Text = md.Length.ToString(); // 読込み制限 int maxCount = 20; int idx = 0; // 接続解除用 endCounter = 0; // 非同期で全て表示 foreach( var data in md ) { idx++; if (idx > maxCount) { break; } // 個別にイベント登録 data.BodyLoaded += new EventHandler(MailData_BodyLoaded); // 非同期処理開始 data.ReadBodyAnsync(); } } private void MailData_BodyLoaded(object sender, EventArgs e) { IMailData MailData = (IMailData)sender; // 本文無し( 本文が必要な場合は、false で、reader.MainText ) MailReader reader = new MailReader(MailData.DataStream, true); //Console.WriteLine(reader.MainText); // UI スレッドへの処理( この場合、post_state は null ) sc.Post((object post_state) => { string from = ""; string subject = ""; string mdate = ""; // ヘッダの一覧より、目的のヘッダを探す foreach (TKMP.Reader.Header.HeaderString headerdata in reader.HeaderCollection) { if (headerdata.Name == "From") { from = headerdata.Data; } if (headerdata.Name == "Subject") { subject = headerdata.Data; } if (headerdata.Name == "Date") { mdate = headerdata.Data; } } // 行追加 mvm.mail_data.Add(new ItemViewModel() { from = from, subject = subject, mdate = mdate }); }, null); // イベント削除 MailData.BodyLoaded -= new EventHandler(MailData_BodyLoaded); // 接続解除用 endCounter++; if (endCounter == 20) { client.Close(); } } // UI スレッドへの処理用 private void Window_Loaded(object sender, RoutedEventArgs e) { sc = SynchronizationContext.Current; } // ダブルクリック private void dataGrid1_MouseDoubleClick(object sender, MouseButtonEventArgs e) { Debug.WriteLine(dataGrid1.SelectedIndex); } } }
非同期でのサーバーとの通信処理はすべてキューとして扱われるため、 前の処理が終了する前に次の要求を発行すると、要求順に順次処理が行われます関連する記事 WPF(C#) : 『DataGrid に、バインド用クラスを使って自動的にカラムと行を生成する』 テンプレート
|
【VS(C#)の最新記事】
- Replit : cs-list
- C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する
- C#( Form ) : ウインドウ枠の無い吹き出しの作成
- C# のタプル( Visual Studio 2017 でテスト )
- C# : インターネット上の JSON ファイルのフォーマットを クラスとして定義して1行でオブジェクト化して使用する
- C# の文法的文字列処理
- C# : System.Data.Odbc によるデータベースのテーブルからのデータ取得処理( サンプルの SQL は MySQL 用です )
- C# : Excel を データベースとして DataGridView に読み込む
- C# : dynamic 型 による Excel へのアクセス
- C# : フォームを表示せずに、通知領域にアイコンを表示させる常駐プログラム
- Microsoft Access に対してSQLを入力してその結果を DataGridView に表示する最も簡単なコード
- C# : System.Data.Odbc データ取得(SELECT)処理( MySQL ) : ※ using 無し( Dispose 実行 )
- C# : SQL 文を外部テキストにして、String.Format でデータ部分を置き換えて利用する
- C# コンソールアプリを AN HTTPD で実行
- C# : SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する
- C# : DataGridView に TKMP.DLL の IMAP(POP3) で受信したメールを非同期に表示する( 添付ファイルも取得 )
- C# : TKMP.DLLを使った、メール送信テンプレート
- C# と VB.net : TKMP.DLL を使って IMAP でメール本文の一覧を取得する( コンソール )
- C# でDataTable と DataSource を使用して、DataGridView にデータを表示するテンプレート( 行をダブルクリックしてダイアログを表示して行データを処理 )
- (C#) / VS2010 または VS2012 : TKMP.DLL(3.1.2 または 3.1.8)を使った、『さくらインターネット』用メール送信テンプレート