The project of U-WA-
http://uwa.potetihouse.com/
トップページ > 過去ログ > 記事閲覧
アイコン 【TKMP.dll】message/rfc822を含むメール
日時: 2011/09/02 10:37
名前: みーとも   <tomo-i@type-r.co.jp>

初めまして。TKMP.dllを使ってアプリケーション開発をさせていただいている者です。

受信したメールをパートごとに分解してデータベースに記録するプログラムを書いていますが、
message/rfc822 を含むメールを受信したときに、その子パートを抽出・分解できず途方に暮れております。

「message/rfc822 を含むメール」は次のように作成しました。
(1) ひとまず自分宛にメールを送る(テキストでもHTMLでも再現します)
(2) 受信したメールを Becky! の「元のメールを添付して転送」(rfc822)でもう一回自分に送る

こうしてできた message/rfc822 を含むメールをTKMPで受信します。
コードの抜粋はこんな感じです。(C#)

/* ---------- ここから ---------- */
void ReceiveThread()
{
:
foreach(TKMP.Net.MailData msg in pop3server.MailData)
{
msg.ReadBody();
TKMP.Reader.MailReader reader = new TKMP.Reader.MailReader(msg.DataStream);
if(reader.PartCollection.Count > 0)
{
// マルチパート
foreach(TKMP.Reader.MailReader subPart in reader.PartCollection)
{
ParseChild(subPart);
}
}
else
{
// 単一パート
// reader.FirstTextPart を取り出して終了
}
:
}
}

void ParseChild(TKMP.Reader.MailReader subPart)
{
switch(subPart.ContentType.Types)
{
case TKMP.Reader.Header.ContentType.MIMETypes.Text: // テキストパート
// subPart.MainData が使えればそこから、使えなければ subPart.FileCollection から抽出
break;

case TKMP.Reader.Header.ContentType.MIMETypes.Message:
// ここ!
break;

default: // その他のものはここで拾う
// subPart.FileCollection から抽出
break;
}
}
/* ---------- ここまで ---------- */

上記の「ここ!」の部分で
(1) subPart.PartCollection を見てみたが、subPart.PartCollection.Count は0
(2) subPart.FileCollection を見てみたが、subPart.PartCollection.Count も0
(3) subPart.MainData は有効(内容と一致している模様)なので、
MemoryStream ms = new MemoryStream(subPart.MainData);
StreamReader sr = new StreamReader(ms);
  TKMP.Reader.MailReader childPart = new TKMP.Reader.MailReader(sr.ReadToEnd());
としてみたが、childPart では内容物にアクセスできない
という状態です。


お忙しいところとは思いますが、
a) まずそもそもこの読み出し方で合っているのかどうか
b) 合っていない場合は正しい読み出し方
c) 合っている場合は回避の方法
をご教授いただければ幸いです。

以上、よろしくお願いいたします。

Page: 1 |

ファイル 補足です ( No.1 )
日時: 2011/09/02 14:24
名前: みーとも  <tomo-i@type-r.co.jp>

先ほど、ver3.0.1 が公開されているのを発見したので、.dllを入れ替えて再実験しました。
message/rfc822 については、状況は変わっていないようでした。

取り急ぎ。
ファイル 自己解決 ( No.2 )
日時: 2011/09/02 15:53
名前: みーとも  <tomo-i@type-r.co.jp>

何度もすみません。

もしやと思い、childPart を作成するところを、MemoryStreamからではなく
保存したファイルからに変えてみました。

// 変更前
MemoryStream ms = new MemoryStream(subPart.MainData);
StreamReader sr = new StreamReader(ms);
TKMP.Reader.MailReader childPart = new TKMP.Reader.MailReader(sr.ReadToEnd());

// 変更後
using(FileStream fs = tempEml.OpenWrite()) // tempEml は一時保存用のFileInfoオブジェクト
{
fs.Write(subPart.MainData, 0, subPart.MainData.Length);
fs.Close();
}
TKMP.Reader.MailReader childPart = new TKMP.Reader.MailReader(tempEml.FullName);


この方法で childPart.PartCollection にアクセスすると中身が取れました!

「読み出し方が正しくない」が正解だったようです。
お騒がせをいたしました。
ファイル またまた補足 ( No.3 )
日時: 2011/09/02 17:39
名前: みーとも  <tomo-i@type-r.co.jp>

MemoryStream から childPart を作るところも再挑戦しました。

MemoryStream ms = new MemoryStream(subPart.MainData);
TKMP.Reader.MailReader childPart = new TKMP.Reader.MailReader(ms);

これで読み出せました。
StreamReaer を入れてしまったところが間違いの始まりだったようです。


大変お騒がせしました。

Page: 1 |