SQLの窓

2018年06月20日


C# : DataGridView に TKMP.DLL の IMAP で受信したメールを非同期に表示する

DataGridView の作成方法の注意点は、『C# でDataTable と DataSource を使用して、DataGridView にデータを表示するテンプレート( 行をダブルクリックしてダイアログを表示して行データを処理 )』を参照して下さい

行をダブルクリックすると、本文を表示します。ここでは、サンプルして行のカラムに本文を保存していますが、本来は外部に保存します。



▼ スプリットコンテナを使用していますが、配置方法は基本的に直感的なものと逆です。


※ 重要
Gmail では安全性の低いアプリの許可を『有効』にする必要があります

.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
	{
		private DataTable table;
		private DataColumn column;
		private DataRow row;

		private SynchronizationContext sc = null;
		private ImapClient client = null;
		private int mailCounter = 0;
		private int endCounter = 0;
		private string[] bodyText = new string[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;
			}

			BasicImapLogon logon = new BasicImapLogon("アカウント", "パスワード");
			client = new ImapClient(logon, "サーバードメイン", 993);
			client.AuthenticationProtocol = AuthenticationProtocols.SSL;

			if (!client.Connect())
			{
				return;
			}

			// メールデータ一覧を格納するオブジェクト
			IMailData[] md = client.GetMailList();

			// データがありません
			if (md == null)
			{
				return;
			}

			// メールデータの数
			toolStripStatusLabel1.Text = md.Length.ToString();
			mailCounter = md.Length;

			// 読込み制限
			int maxCount = 20;
			int idx = 0;

			// 接続解除用
			endCounter = 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 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, false);

			//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")
					{
						string target = headerdata.Data;
						target = target.Replace(" (JST)", "");
						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 == mailCounter)
				{
					// 受信終了
					client.Close();

					// データーソース経由で DataGridView を表示
					dataGridView1.DataSource = table;

					// カラム定義側の非表示では無く、DataGridView から見たカラムの非表示
					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 でメール本文の一覧を取得する( コンソール )




posted by lightbox at 2018-06-20 13:29 | Pleiades | このブログの読者になる | 更新情報をチェックする
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり