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

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

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

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

メール

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

Q&A

解決済

1回答

4407閲覧

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

shanxia

総合スコア1038

Java

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

メール

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

0グッド

0クリップ

投稿2015/08/20 06:04

編集2015/08/20 06:06

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

java

1// 初期化 2service = new ExchangeService(ExchangeVersion.Exchange2010_SP1, 3 TimeZone.getDefault()); 4ExchangeCredentials credentials = new WebCredentials(username, 5 password, domain); 6service.setCredentials(credentials); 7service.setUrl(new URI("https://" + url + "/ews/Exchange.asmx")); 8service.getInboxRules(); 9 10// メール受信 11Folder inbox = Folder.bind(service, WellKnownFolderName.Inbox); 12ItemView view = new ItemView(100);// 100通まで 13List<SearchFilter> searchFilterCollection = new ArrayList<SearchFilter>(); 14searchFilterCollection.add(new SearchFilter.IsEqualTo( 15 EmailMessageSchema.IsRead, false)); // 未読のみ取得 16SearchFilter s = new SearchFilter.SearchFilterCollection( 17 LogicalOperator.And, searchFilterCollection); 18m = inbox.findItems(s, view); 19 20// 受信メールの処理 21for (Item item : findResults.getItems()) { 22 EmailMessage message = EmailMessage.bind(service, item.getId()); 23 // いろいろな処理 24 25 // 返信処理 26 ResponseMessage responseMessage = message.createReply(false); 27 responseMessage.setSubject("タイトル"); 28 responseMessage.setBodyPrefix("メール本文"); 29 Folder outbox = Folder.bind(service, WellKnownFolderName.Outbox); 30 EmailMessage newMessage = responseMessage.save(outbox.getId()); 31 newMessage.sendAndSaveCopy(); 32}

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


メール本文


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

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

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

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

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

一つ気になるのが、

lang

1responseMessage.setBodyPrefix("メール本文");

となっていますが、ここにある実装例では、

lang

1responseMessage.setBody(MessageBody.getMessageBodyFromText("メール本文"));

のようになっていることです。
想像ですが、BodyPrefixに"メール本文"が入っていてBodyが空なので、
Bodyが自動で設定された、というようなことかも知れません。

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

投稿2015/08/20 13:04

eripong

総合スコア1546

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

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

shanxia

2015/08/21 06:39

回答ありがとうございます。 ご指摘の通り、そのライブラリを利用しています。 今回の要件だと、返信メッセージには、受信メールの内容を含める必要があるため、新たに追加するメッセージは、setBodyPrefix()で前方に挿入しています。 そのため、setBody()は使えないと思っています。 デバッグができれば良いのですが、Exchangeサーバーに接続できる環境が特殊な場所のため、デバッグ可能な環境で動かすことが非常に難しい状況です。 なので、タイミングごとに、メールの内容を保存しているオブジェクトの中身を見たくても、EWSの中身がObject型でやり取りしているみたいなので、どう確認したら良い物かな。。。と悩んでいます。 toString()で無理矢理出しても、わからなかったので。。。
eripong

2015/08/21 08:51 編集

なるほど、了解です。 他に情報を得る手段として、 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)); ソースを見て調べた方法で、動作確認はしていないので、 動かないかも知れません。
eripong

2015/08/21 08:58

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

2015/08/21 14:51

ところで、どういう形のメールにしたいのか、 理解できていないので、教えていただけませんか? 受信メールの内容を、返信メールでの本文で使いたいのであれば、 受信メールから内容を取得して本文を作成する処理を 自分で書けば良いと思うのですが、それができない、あるいはそうしたくない 理由があるのでしょうか? それと、UTCとの差は9時間だと思うので、 +0900ではないかと思うのですが、どうでしょうか?
shanxia

2015/08/25 01:06

リプライが遅くて申し訳ありません。 返信メールの形は、単純に受信したメールの上に返信内容を付けた、普段メーラーで返信する際に使用する、おなじみの形です。 >自分で書けば良いと思うのですが、それができない、あるいはそうしたくない >理由があるのでしょうか? 最悪そうしようと思っていますが、何故その様にしなくてはならないのか、説明できないため、控えていました。 あと、Exchangeサーバーは上海にあるので、タイムゾーンが Asia/Shanghai になっています。そのため、+0800となっています。 指摘していただいたトレースを入れて、これから結果を見てみます。
eripong

2015/08/25 01:46

メールの形は了解です。 説明できないので、自力で実装しないという点も、 良き分かりました。 タイムゾーンの件も、了解です。 トレースで何か分かると良いのですが。。
shanxia

2015/09/16 09: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さんをベストアンサーとして、この質問はクローズします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問