The project of U-WA-
http://uwa.potetihouse.com/
トップページ > 過去ログ > 記事閲覧
アイコン TKMP添付ファイル処理
日時: 2008/02/18 11:35
名前: noridon

TKMP 2.4.11 を使用させて頂いています。
本当に便利なものを提供して下さって感謝です。
過去LOGも目を通したのですが、該当のものがありませんでしたので、ここに質問させて頂きます。

TKMPを利用して、POPを叩き、メールを読み込んで、添付された画像ファイルを抽出して保存という事をしたいのですが、YahooのWebメールで添付された画像ファイルは、TKMP.Reader.MailReaderのFileCollectionには入らず、PartCollectionの方に入っている様です。
それで、PartCollectionも色々見てみましたが、[0]番目が本文?、[1]番目が最初の添付ファイル、となっている様でしたので、[1]番目以降を添付ファイルとして取り出しています。
そこで、part.MainDataがデータだと言う事で、BinaryWriterを用いてそのままデータをファイルに書き出しているのですが、どうやらBase64でエンコードされたテキストが入っているらしいのです。
ただし、複数のjpgファイルを添付させると、ちゃんとバイナリレベルでjpgとなっている場合もありました。
なので、PartCollectionに入っている添付データを、添付元の完全なファイルとして抽出、保存するには、どのようにすれば良いでしょうか?

ご教授願えれば幸いです。

Page: 1 |

ファイル Re: TKMP添付ファイル処理 ( No.1 )
日時: 2008/02/18 22:30
名前: Toki◆pRU.c9X.EOI

>TKMPを利用して、POPを叩き、メールを読み込んで、添付された画像ファイルを抽出して保存という事をし>たいのですが、YahooのWebメールで添付された画像ファイルは、TKMP.Reader.MailReaderのFileCollectionには入らず、PartCollectionの方に入っている様です。

YahooのWebメールで添付した画像ファイルはContent-Dispositionが「inline」となるため
「添付ファイル」としては処理されません。
このため、添付ファイルの情報であるFileCollectionプロパティでは読み出すことが出来ません。
ただし、各パートのヘッダ情報からファイル名などは取得できます。

>それで、PartCollectionも色々見てみましたが、[0]番目が本文?、[1]番目が最初の添付ファイル、となっている様でしたので、[1]番目以降を添付ファイルとして取り出しています。
>そこで、part.MainDataがデータだと言う事で、BinaryWriterを用いてそのままデータをファイルに書き出しているのですが、どうやらBase64でエンコードされたテキストが入っているらしいのです。
>ただし、複数のjpgファイルを添付させると、ちゃんとバイナリレベルでjpgとなっている場合もありました。

PartCollectionのインディックスはメールの構造によって変化する可能性がありますが、基本的はその手順で問題ありません。
MainDataプロパティはデコードされたバイナリデータが入るはずなので、Base64でエンコードされたテキストが入ることはないと思います。


ファイル Re: TKMP添付ファイル処理 ( No.2 )
日時: 2008/02/19 10:44
名前: noridon

ご回答有難うございます。

>MainDataプロパティはデコードされたバイナリデータが入るはずなので、Base64でエンコードされたテキストが入ることはないと思います。

との事なんですが、実際に吐かせてみたデータをアップしてみますね。
以下のコードで吐いたものです。中身はテキストで、Base64っぽい雰囲気なんですけど。
うまくバイナリ化される事もあるんです。
なので、どうしたらいいものかと思いまして。

http://www.engelsstimme.net/test/capture.jpg


一応、取り出している関数のコードをアップさせて頂きますね。
VisualStudio2008、.NetFrameWorkは、最新の3.5です。

public void GetFiles(System.IO.Stream MailStream)
{
//メールデータの解析クラスを作成します
TKMP.Reader.MailReader reader = new TKMP.Reader.MailReader(MailStream, false);

string strTmpFoler = Path.GetTempPath();

if (reader.FileCount == 0)
{
if (reader.ContentType.Types ==
TKMP.Reader.Header.ContentType.MIMETypes.Multipart)
{
int nCount = reader.PartCollection.Count;
if (nCount > 1)
{
for (int i = 1; i < nCount; i++)
{
TKMP.Reader.MailReader part = reader.PartCollection[i];
string fname = part.ContentType.FileName;
string ext = Path.GetExtension(fname);
if (ext.Length > 0)
{
byte[] data = part.MainData;
string ofile = strTmpFoler+fname;
using (BinaryWriter w = new BinaryWriter(File.OpenWrite(@ofile)))
{
w.Write(data);
}

}
}
}
}
}
else
{
//添付ファイルのコレクションを検査します
foreach (TKMP.Reader.File file in reader.FileCollection)
{
// tmpフォルダへ書き出し
file.FileSave(@strTmpFoler);
}
}
}
ファイル Re: TKMP添付ファイル処理 ( No.3 )
日時: 2008/03/13 00:38
名前: Toki◆pRU.c9X.EOI

なかなか返事が出せなくて申し訳ありません。

引越しのため開発用PCがなかなか準備できないので、憶測になりますが、

Ver 2.4.11で修正したつもりのセパレータ処理に不具合があるため、

Base64デコードに失敗し、ソースを直接返しているかもしれません。

同様の現象を他の方からも報告いただいたので、近日中に修正したいと思います。

ファイル Re: TKMP添付ファイル処理 ( No.4 )
日時: 2008/05/08 10:50
名前: noridon

久しぶりに見に来たら、レスがあって、とても嬉しいです。
早速、最新版のDLLを差し替えたら、見事に上手く動きました!!
本当に、本当に、有難うございます!!!!

Page: 1 |