※ BasicImapLogon => BasicPopLogon, ImapClient => PopClient で POP3 も同じです DataGridView の作成方法の注意点は、『C# でDataTable と DataSource を使用して、DataGridView にデータを表示するテンプレート( 行をダブルクリックしてダイアログを表示して行データを処理 )』を参照して下さい 画面のテンプレートのダウンロード 行をダブルクリックすると、本文を表示します。ここでは、サンプルして行のカラムに本文を保存していますが、本来は外部に保存します。 ▼ スプリットコンテナを使用していますが、配置方法は基本的に直感的なものと逆です。 ※ 重要 Gmail では安全性の低いアプリの許可を『有効』にする必要があります ※ サーバーは imap.gmail.com ※ Yahoo! メールでは、接続はできるのですが、メールが取得できません ( imap.mail.yahoo.co.jp )。 ※ BasicImapLogon => BasicPopLogon, ImapClient => PopClient に変更すると、Yahoo! で接続できました ( POP3 : pop.mail.yahoo.co.jp : 995 ) .NET用メール送受信クラスライブラリ (TKMP.DLL) ※ 2018-06-20 時点で 3.1.8( 2017/02/15 作成 )
using System; using System.ComponentModel; using System.Data; using System.Drawing; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using TKMP.Net; using TKMP.Reader; namespace MailRecTest { public partial class Form1 : Form { // ****************************************************** // 画面レイアウト作成方法は以下を参照 // http://logicalerror.seesaa.net/article/459948736.html // ****************************************************** private DataTable table; private DataColumn column; private DataRow row; private SynchronizationContext sc = null; private ImapClient client = null; private int mailCounter = 0; private string[] bodyText = new string[20]; // 接続解除用 private int endCounter = 0; private int maxCount = 20; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // 非同期内からの UI スレッドへのアクセス用 sc = SynchronizationContext.Current; this.toolStripStatusLabel1.Text = "ツールバーのボタンで受信してください"; } private void toolStripButton1_Click(object sender, EventArgs e) { if (MessageBox.Show("メールを受信しますか?", "確認", MessageBoxButtons.OKCancel) == DialogResult.Cancel) { return; } // IMAP 用基本認証 BasicImapLogon logon = new BasicImapLogon("アカウント", "パスワード"); // IMAP 用ログイン( 993 は、SSL 用 ) ImapClient client = new ImapClient(logon, "サーバードメイン", 993); // SSL で接続する client.AuthenticationProtocol = AuthenticationProtocols.SSL; try { if (!client.Connect()) { MessageBox.Show("接続できませんでした"); return; } } catch (Exception ex) { MessageBox.Show("接続エラーが発生しました"); return; } // メールデータ一覧を格納するオブジェクト IMailData[] mailData = client.GetMailList(); // データがありません if (mailData == null) { MessageBox.Show("データがありません"); return; } // メールデータの数 toolStripStatusLabel1.Text = mailData.Length.ToString(); mailCounter = mailData.Length; if (mailCounter < maxCount) { maxCount = mailCounter; } // 読込み制限 int idx = 0; // DataTable の作成 table = new DataTable("TKMP"); // 列情報 の作成 column = new DataColumn(); column.DataType = Type.GetType("System.String"); column.ColumnName = "差出人"; table.Columns.Add(column); // 列情報 の作成 column = new DataColumn(); column.DataType = Type.GetType("System.String"); column.ColumnName = "件名"; table.Columns.Add(column); // 列情報 の作成 column = new DataColumn(); column.DataType = Type.GetType("System.String"); column.ColumnName = "受信日時"; table.Columns.Add(column); // 列情報 の作成 column = new DataColumn(); column.DataType = Type.GetType("System.String"); column.ColumnName = "本文"; table.Columns.Add(column); // 非同期でメールデータを表示するループ foreach (var data in mailData) { 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, false); if (reader.FileCount == 0) { Console.WriteLine("添付ファイルはありません"); } //添付ファイルのコレクションを検査します foreach (TKMP.Reader.File file in reader.FileCollection) { // 保存場所は事前に作成する必要があります // (メールとの関連は、アプリケーション側で工夫する必要があります) file.FileSave(@"c:\temp\data\"); } //Console.WriteLine(reader.MainText); // UI スレッドへの処理( この場合、post_state は null ) sc.Post((object post_state) => { // 新規行 row = table.NewRow(); // 本文をメモリ内保存( 本来はファイルかデータベースに書きだす ) row["本文"] = reader.MainText; // ヘッダの一覧より、目的のヘッダを探す foreach (TKMP.Reader.Header.HeaderString headerdata in reader.HeaderCollection) { if (headerdata.Name == "From") { row["差出人"] = headerdata.Data; } if (headerdata.Name == "Subject") { row["件名"] = headerdata.Data; } if (headerdata.Name == "Date") { Console.WriteLine(headerdata.Data); string target = headerdata.Data; target = target.Replace(" (JST)", ""); target = target.Replace(" (PDT)", ""); try { DateTime dt = System.DateTime.ParseExact(target, "ddd, d MMM yyyy HH':'mm':'ss zzz", System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.None); row["受信日時"] = string.Format("{0}", dt); } catch (Exception ex) { row["受信日時"] = headerdata.Data; Console.WriteLine("フォーマット変換できませんでした"); } } } // 行を追加 table.Rows.Add(row); // 接続解除用 endCounter++; if (endCounter == maxCount) { endCounter = 0; // 受信終了 client.Close(); // データーソース経由で DataGridView を表示 dataGridView1.DataSource = table; this.dataGridView1.Columns[3].Visible = false; // 第3カラム(受信日)で逆ソート dataGridView1.Sort(dataGridView1.Columns[2], ListSortDirection.Descending); // 自動整列 dataGridView1.AutoResizeColumns(); } }, null); // イベント削除 MailData.BodyLoaded -= new EventHandler(MailData_BodyLoaded); } private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { int rowNumber = e.RowIndex; if (rowNumber < 0 ){ return; } this.textBox1.Text = this.dataGridView1["本文",rowNumber].Value.ToString(); } } }
関連する記事 C# と VB.net : TKMP.DLL を使って IMAP でメール本文の一覧を取得する( コンソール ) C# : TKMP.DLLを使った、メール送信テンプレート
|
【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# : TKMP.DLLを使った、メール送信テンプレート
- C# と VB.net : TKMP.DLL を使って IMAP でメール本文の一覧を取得する( コンソール )
- C# でDataTable と DataSource を使用して、DataGridView にデータを表示するテンプレート( 行をダブルクリックしてダイアログを表示して行データを処理 )
- (C#) / VS2010 または VS2012 : TKMP.DLL(3.1.2 または 3.1.8)を使った、『さくらインターネット』用メール送信テンプレート
- C# でDXライブラリを使って簡単なシューティングをクラス化して標準化 / メインループとプレイヤー (4)