質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

解決済

2回答

2797閲覧

Exchange Web Service API(Java)を利用して、outlookメールの添付ファイル(zipファイル)を保存したい

kuronoss

総合スコア14

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

0グッド

0クリップ

投稿2019/07/20 01:52

編集2019/07/22 11:23

javaを使ってoutlookメールから添付ファイルを保存したいのですが、調べても情報が少なく苦戦しています。
outlookのメール情報が取得できて、その中に添付ファイルの情報が取得できているようなのですが、
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipfile));
を使うとFileNotFoundExceptionが発生するため、
Exchange Web Services APIを使って実現しなくてはいけないようなのですが、その情報が見つかりません。
参考情報やサンプルソースなどがありましたらご教授いただけると助かります。
(以下のソースに「添付ファイル」の情報を指定するのかと思うのですが…。)

public void savetmpFile(ExchangeService service, Item item) throws Exception {
// AttachmentCollection tmpData = item.getAttachments();
// List<Attachment> tmpFiles = tmpData.getItems();
// とりあえず上記で添付ファイルのデータが取得できているようだが…。

// 添付ファイルを保存したい EmailMessage message = EmailMessage.bind(service, item.getId()); // message.getAttachments()の中には添付ファイルの情報があるが…。 message.load(new PropertySet(ItemSchema.MimeContent)); MimeContent mc = message.getMimeContent(); FileOutputStream fos = new FileOutputStream("保存先のパス"); fos.write(mc.getContent(), 0, mc.getContent().length); fos.close();

}

~追記~
バイト列を取得し保存する方法を模索
【ソース】
public void savetmpFile(ExchangeService service, Item item) throws Exception {
Stream<Attachment> fis = item.getAttachments().getItems().stream();
byte[] bytes = fis.toString().getBytes();
FileOutputStream fos = new FileOutputStream(saveFilePath);
for (byte b : bytes) {
fos.write(b);
}
fos.flush();
fos.close();
}

【実行結果(zipファイル)】
zipファイルの中身が空です。(解凍不能)

【実行結果(テキストファイル)】
java.util.stream.ReferencePipeline$Head@32193bea

また、上記ソースのbytesを以下に変更して実行
byte[] bytes = item.getAttachments().getItems().toString().getBytes();

【実行結果(zipファイル)】
zipファイルの中身が空です。(解凍不能)

【実行結果(テキストファイル)】
[microsoft.exchange.webservices.data.property.complex.FileAttachment@1bb5a082]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

なぜ zip の outputstream を作成する必要があるのでしょう.
"zip 化されたファイル" のバイト列が取得できるのでしたら, 保存(拡張子"zip")すれば zip ファイルになっていると思います.


C# ですが, 読めなくは無いと思いますので, 以下を参考にされては如何でしょうか.

Exchange で EWS を使用して添付物を取得する

投稿2019/07/20 02:25

編集2019/07/22 13:54
jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuronoss

2019/07/22 11:24

回答ありがとうございます。 バイト列で保存というのは追記の方法であってますかね…?
kuronoss

2019/07/24 00:59

そのサイトを参考にしたのが最初に書いたコードで、うまくいかずに質問しました。C#では、File.WriteAllByteでファイル作成から書き込み処理まで全てやっているみたいですが、javaだとFileOutputStreamで、全バイト書き込みするんじゃないんですよね…?
jimbe

2019/07/24 03:00 編集

参照されていましたか, 失礼しました. 最初の // 添付ファイルを保存したい EmailMessage message = EmailMessage.bind(service, item.getId()); // message.getAttachments()の中には添付ファイルの情報があるが…。 message.load(new PropertySet(ItemSchema.MimeContent)); MimeContent mc = message.getMimeContent(); FileOutputStream fos = new FileOutputStream("保存先のパス"); fos.write(mc.getContent(), 0, mc.getContent().length); fos.close(); で( message が取得されていれば)ファイルへの書き出しは出来そうに思うのですが, これも FileOutputStream で FileNotFound 例外なのでしょうか. FileOutputStream は "保存先のパス" がフォルダだったり, 同名のファイルがあって書き込みできなかったり, 同名ファイルが無くてもファイルの新規作成が出来なかったりすると FileNotFound 例外になるようです. 指定したパスがそのような状態かどうかを確認されては如何でしょう.
kuronoss

2019/07/24 04:26

度々の返信失礼します。 ファイルは作成されるのですが、zipファイルは空で解凍できず、テキストファイルはここには載せられないようなメール情報が出力されています…。
jimbe

2019/07/24 04:49

現状のコードには何のエラー処理も行われておりませんし, 内容を確認するログも入っておりません. 各行において, 想定通りに情報を取得出来ているかをご確認されて, 「データが取得できているようだ」では無く出来ているのかいないのか, どこで何が起きているかを確実にチェックすることから進められるのが良いかと思います. 本文も添付もダメとなりますと, item (の取得)自体が間違っているという可能性もあります.
kuronoss

2019/07/24 06:42

拡張子を「eml」にするとメールメッセージとして保存され、その中に添付ファイルも正常に保存されていました。ただ、今回やりたいこととしてはメールメッセージではなく、添付ファイルのみを保存したいのです…。
jimbe

2019/07/24 09:12

確認ですが, message.load(new PropertySet(ItemSchema.MimeContent)); MimeContent mc = message.getMimeContent(); FileOutputStream fos = new FileOutputStream("保存先のパス"); fos.write(mc.getContent(), 0, mc.getContent().length); fos.close(); } で保存先のパスのファイル名の拡張子をeml とすると, 添付ファイルを含めたメール全体が保存されたのでしょうか.
jimbe

2019/07/24 11:38

google で検索して見ているのですが, はっきり「こう」とご紹介できそうな記事が見つかりません. 「ews api java FileAttachment」のキーワードでスニペットのある stack overflow 等の記事が出ますので, お試し頂けるものがありましたら, やってみては如何でしょうか.
kuronoss

2019/07/25 12:05

回答ありがとうございました。 自己解決いたしましたので、これで解決済みとさせていただきます。
guest

0

自己解決

以下の方法で自己解決しました。

public void saveTmpFile(ExchangeService service, Item item) throws Exception {
// メール情報を取得
EmailMessage message = EmailMessage.bind(service, item.getId());
// メールに添付してある全ファイルを保存する。
List<Attachment> tmpFiles = message.getAttachments().getItems();
for(Attachment tmpFileAttachment : tmpFiles){
// 添付ファイル名によって、zipファイルでもtxtファイルでも保存可能
String tmpName = tmpFileAttachment.getName();
// 保存場所を指定する。
String savePath = "保存したい場所のパス" + tmpName;
// AttachmentをFileAttachmentに変更
FileAttachment tmpFile = (FileAttachment) tmpFileAttachment;
// FileAttachmentのloadで保存できる
tmpFile.load(savePath);
}
}

投稿2019/07/25 12:02

kuronoss

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問