※ 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)



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




