今回は、airxmailを使って受信したメールから添付ファイルを取り出す方法です。
メールを受信する方法は、こちらを参照してください。
さて、ここでは、実際にメールを受信したハンドラの部分だけを見ていきます。
private function messageHandler(e:POP3MessageEvent):void{
var msg:MimeMessage = e.getMimeMessage();
// ここでメッセージに添付された子パートの一覧を取得する
var attaches:Array = msg.attachmentChildren;
if(attaches.length > 0){
for each(var attach:MimeBodyPart in attaches){
if(attach is MimeBinaryPart){
var binPart:MimeBinaryPart = attach as MimeImagePart;
var bytes:ByteArray = attach.bodyByteArray;
// v0.6 もしくは r69 以前では getHeader("Content-Disposition"); を使う(バグのため)
var contentDisposition:MimeHeader = binPart.contentDisposition;
if(contentDisposition){
var filename:String = contentDisposition.getParameter("filename");
filename = MimeUtils.decodeMimeHeader(filename);
log.debug("Filename => " + filename );
var file:File = File.desktopDirectory.resolvePath(filename);
var fs:FileStream = new FileStream();
fs.open(file,FileMode.APPEND);
fs.writeBytes(bytes);
fs.close();
}
}
}
}
}
となります。
ここでは、あくまでも例なので、デスクトップに保存しています。



airxmailを使わせていただいております。
Gmailになります。
なんとかメールは、受信できるようになったのですが
connect関連のエラー処理と
添付ファイルの取り出しに苦戦してます(^_^;)
添付ファイルを取り出すサンプルで動作させようとしているのですが、
for each(var attach:MimeBodyPart in attaches){
のあとの
if(attach is MimeBinaryPart){
での
attachの内容が、MimeBodyPartの為
以下の処理が実行されることなく終了してしまいます。
Gmailだとなにか違うのでしょうか?
お手数ですが、ヒントをいただければ助かるのですが
よろしくお願いします。
airxmailを使ってもらってありがとうございます。
gmailだと違うというか、受信しているメール1通1通で構造も違うので何ともいえないのですが、開いているメールの構造(メールのソース)を調べながら中身をみていくしか方法がありません。
ただ、添付ファイルの一覧が欲しいだけならば、
MimeMessage.attachmentChildren()
というgetterがありますので、そちらを使うと便利だと思います。
ちなみに、Arrayとして、MimeBinaryPartのオブジェクトがかえってきます。
こちらでどうでしょうか?
どうしてこのようなメソッドがあるかというと、
たまに、Multipartの中にさらにMultipartがあって、
そこに添付ファイルがあるメールがある場合があります。
これだと、さらに深くたどっていく必要があるのでそのようにしました。
ただし、こちらに入ってくるデータはcontentDispositionがattachmentのパートのみです。
まず、いわゆる添付ファイルというものはこれで大丈夫だと思いますが、
HTMLメールなどと一緒についてくる画像などはこれでとれないとは思います。
(この辺りの記憶は100%ではないので、すいません)
早速おレスありがとうございます。
まとを得ない質問で申し訳ありません。
MimeMessage.attachmentChildren()は、上記にメールから
添付ファイルを取り出す方法で記載されてるものですよね。
使わせていただいているのですが….
3種類のファイルを添付したところ
for each(var attach:MimeBodyPart in attaches){
後のattachの内容が
1.画像:MimeImagePart
2.テキスト:MimeTextPart
3.エクセル等:MimeBodyPart
になっている事を確認しました。
実際取得したいのは、3番になるのですが
for each(var attach:MimeBodyPart in attaches){
後
実際の添付メールの内容
attachの内容をみると
attach
L _hederkeys (object)
L content-disposison (MimeHeader)
L _params (object)
L filename (”Book.Xls”)
という形になっていることは、分かりました。
ただここから上記のサンプルを使っての方法が
なかなか苦戦しております(;´∀`)
contentDispositionに対しての設定だけと思うのですが….
var filename:String = contentDisposition.getParameter(“filename”);
filename = MimeUtils.decodeMimeHeader(filename);
var file:File = File.desktopDirectory.resolvePath(filename);
以下省略
よろしくお願いします。
返事が遅れてすいません。
>MimeMessage.attachmentChildren()は、上記にメールから
>添付ファイルを取り出す方法で記載されてるものですよね。
そうですね。
自分が書いたものですが、多少勘違いして、
前回、重複して同じようなことを書いてしまいました。
(かれこれ1年前の内容だったりするので、勘違いしてしまいました。すいません)
ただ、ほとんど、うまくいっているように見えるのですが、
具体的にどこか、はまっているところがあるのでしょうか?
よろしくお願いします