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

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

ただいまの
回答率

90.62%

  • Java

    13466questions

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

  • メール

    245questions

    メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Exchange Web Service API(Java)を利用して、メールを返信すると、返信対象となる受信メールの時刻がUTC時刻になる

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,503

shanxia

score 978

Exchange Web Service APIを利用して、メールの添付ファイルを処理して、結果を返信するプログラムを作成しています。

// 初期化
service = new ExchangeService(ExchangeVersion.Exchange2010_SP1,
        TimeZone.getDefault());
ExchangeCredentials credentials = new WebCredentials(username,
        password, domain);
service.setCredentials(credentials);
service.setUrl(new URI("https://" + url + "/ews/Exchange.asmx"));
service.getInboxRules();

// メール受信
Folder inbox = Folder.bind(service, WellKnownFolderName.Inbox);
ItemView view = new ItemView(100);// 100通まで
List<SearchFilter> searchFilterCollection = new ArrayList<SearchFilter>();
searchFilterCollection.add(new SearchFilter.IsEqualTo(
        EmailMessageSchema.IsRead, false)); // 未読のみ取得
SearchFilter s = new SearchFilter.SearchFilterCollection(
        LogicalOperator.And, searchFilterCollection);
m = inbox.findItems(s, view);

// 受信メールの処理
for (Item item : findResults.getItems()) {
    EmailMessage message = EmailMessage.bind(service, item.getId());
    // いろいろな処理

    // 返信処理
    ResponseMessage responseMessage = message.createReply(false);
    responseMessage.setSubject("タイトル");
    responseMessage.setBodyPrefix("メール本文");
    Folder outbox = Folder.bind(service, WellKnownFolderName.Outbox);
    EmailMessage newMessage = responseMessage.save(outbox.getId());
    newMessage.sendAndSaveCopy();
}

このプログラムで返信すると、返信メールの本文に、受信メールのヘッダー情報が記録されますが、そこに書かれている時刻がUTC時刻になってしまいます。


メール本文
________
差出人: John Smith
送信日時: 2015年8月12日 8:36:06
宛先: Suzumiya
件名: test txt as excel


↑このようなイメージです。「8:36:06」がUTC時刻になってしまっています。
おそらく受信メールのヘッダー情報だと思いますが、
受信メールのヘッダーを見ると、受信時刻欄には、上の時刻の末尾に「+0800」と書かれているので、受信メールには問題ないと思います。

そもそも受信メールのヘッダーが、返信メールに追加されるような処理は記述していないので、Exchangeサーバーで設定があるのかとも思いましたが、見つけられませんでした。

調査も行き詰まってしまったので、何かわかる事はありませんでしょうか。
「xxxを調べてみたら?」と言うだけでも結構です。

よろしくお願いします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

このライブラリを使っているということで良いでしょうか?
使ったことがないので、的はずれかも知れません。

一つ気になるのが、
responseMessage.setBodyPrefix("メール本文");
となっていますが、ここにある実装例では、
responseMessage.setBody(MessageBody.getMessageBodyFromText("メール本文"));
のようになっていることです。
想像ですが、BodyPrefixに"メール本文"が入っていてBodyが空なので、
Bodyが自動で設定された、というようなことかも知れません。

それが原因でなかった場合の調べ方としては、
ドキュメントを見て分からなければ、
ソースコードを取得して、デバッガを使ってステップ実行するなどして、
どのタイミングで、どの様に差出人などが設定されるかを見ることで、
原因調査するのがよいかな、と思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/21 15:39

    回答ありがとうございます。
    ご指摘の通り、そのライブラリを利用しています。

    今回の要件だと、返信メッセージには、受信メールの内容を含める必要があるため、新たに追加するメッセージは、setBodyPrefix()で前方に挿入しています。
    そのため、setBody()は使えないと思っています。

    デバッグができれば良いのですが、Exchangeサーバーに接続できる環境が特殊な場所のため、デバッグ可能な環境で動かすことが非常に難しい状況です。

    なので、タイミングごとに、メールの内容を保存しているオブジェクトの中身を見たくても、EWSの中身がObject型でやり取りしているみたいなので、どう確認したら良い物かな。。。と悩んでいます。
    toString()で無理矢理出しても、わからなかったので。。。

    キャンセル

  • 2015/08/21 17:45 編集

    なるほど、了解です。

    他に情報を得る手段として、
    microsoft.exchange.webservices.data.core.enumeration.misc.TraceFlags
    を使って、トレースを出力できそうです。
    トレースから何か分かるかも知れません。

    microsoft.exchange.webservices.data.misc.EwsTraceListenerでcommons loggingのログが出る設定にして、ソースで以下の様にすれば良いようです。

    service.setTraceEnabled(true);
    service.setTraceFlags(EnumSet.range(TraceFlags.EwsRequest,TraceFlags.AutodiscoverRequestHttpHeaders));

    ソースを見て調べた方法で、動作確認はしていないので、
    動かないかも知れません。

    キャンセル

  • 2015/08/21 17:58

    単純にresponseMessageやnewMessageに対してgetBody().getText()して、
    ログを出してみても良いかも知れません。

    キャンセル

  • 2015/08/21 23:51

    ところで、どういう形のメールにしたいのか、
    理解できていないので、教えていただけませんか?

    受信メールの内容を、返信メールでの本文で使いたいのであれば、
    受信メールから内容を取得して本文を作成する処理を
    自分で書けば良いと思うのですが、それができない、あるいはそうしたくない
    理由があるのでしょうか?

    それと、UTCとの差は9時間だと思うので、
    +0900ではないかと思うのですが、どうでしょうか?

    キャンセル

  • 2015/08/25 10:06

    リプライが遅くて申し訳ありません。
    返信メールの形は、単純に受信したメールの上に返信内容を付けた、普段メーラーで返信する際に使用する、おなじみの形です。

    >自分で書けば良いと思うのですが、それができない、あるいはそうしたくない
    >理由があるのでしょうか?
    最悪そうしようと思っていますが、何故その様にしなくてはならないのか、説明できないため、控えていました。

    あと、Exchangeサーバーは上海にあるので、タイムゾーンが Asia/Shanghai になっています。そのため、+0800となっています。

    指摘していただいたトレースを入れて、これから結果を見てみます。

    キャンセル

  • 2015/08/25 10:46

    メールの形は了解です。

    説明できないので、自力で実装しないという点も、
    良き分かりました。

    タイムゾーンの件も、了解です。

    トレースで何か分かると良いのですが。。

    キャンセル

  • 2015/09/16 18:15

    トレースを取りましたが、メールのコンテンツタイプがhtmlなので、内容がまったくわかりませんでした。
    その代わり、メール送信元の取得APIでgetDateTimeSent()が返すDateオブジェクトが次の様になっていました。

    > 14:28:32 [main] DEBUG httpclient.wire.header - << "Date: Mon, 14 Sep 2015 06:28:31 GMT[\r][\n]"
    > 14:28:32 Mon Sep 14 06:28:01 CST 2015

    これは上海ロケーションのPC上で実行した結果なのですが、メールヘッダーでは標準時06:28になっているにもかかわらず、DateオブジェクトをtoStringで出力すると、CST(北京時間)06:28となっていて、APIが返すDateがおかしいという事を証明できました。

    質問に書いた、「メール本文に時刻が書かれてしまう」という事と関係は無いと思うのですが、EWS APIに問題があるということを証明できたので、現在の処理を取りやめ、自分で返信メールをすべて作成するという形に変更が許可されました。

    根本解決はできていませんが、トレース出力を教えていただいたeripongさんをベストアンサーとして、この質問はクローズします。

    キャンセル

  • 2015/09/16 19:44

    そうでしたか。

    今さらですが、Timezoneに関するissueが結構上がっていましたね。

    https://github.com/OfficeDev/ews-java-api/issues/398
    あたりは関連してるかもしれません。

    キャンセル

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13466questions

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

  • メール

    245questions

    メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

  • トップ
  • Javaに関する質問
  • Exchange Web Service API(Java)を利用して、メールを返信すると、返信対象となる受信メールの時刻がUTC時刻になる