2016-05-11 3 views
0

私は仕事のためにJavaプログラムにフィードバックボタンを追加しようとしています。私はこのボタンを実際に自分自身や他の人にメールを送りたいと思う。すべての従業員が同じデフォルトのメールアプリケーションを使用しているため、デスクトップのメール方法を使用するとうまく動作します。Java Desktop mailtoを2人の受信者に使用する

私は1つの電子メールアドレスでこれを動作させることができました。それは、電子メールクライアントを適切に開き、新しい電子メールを開始し、アドレス行に宛先を入れます。問題は2つの電子メールアドレスを追加しようとするときです。

int result = JOptionPane.showOptionDialog(null, panel, "Feedback", JOptionPane.YES_NO_OPTION, 
         JOptionPane.INFORMATION_MESSAGE, null, options1, null); 

       if(result == JOptionPane.NO_OPTION){ 
        try { 
         Desktop.getDesktop().mail(new URI("mailto:[email protected]")); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (URISyntaxException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 

そうすることで、完璧に動作します。

私は単純に、このようなコンマでアドレスを分離する試みた:

Desktop.getDesktop().mail(new URI("mailto:[email protected]","[email protected]")); 

が、これは私にエラーを与え、唯一のオプションは、実際に第二引数を削除することです。

は、最後に私は、文字列[]このような使用して試してみた:

String[] mailAddressTo = {"[email protected]","[email protected]"}; 

をしてから、このようなmailtoの方法にその挿入:

Desktop.getDesktop().mail(new URI("mailto:"+mailAddressTo)); 

が、電子メールアドレスは

であることが出てきます
[Ljava.lang.String; @5e9394f7 

電子メールクライアントが開かれた後。

私はオンラインで検索しようとしましたが、Desktop.mail以外の方法でJavaを使用してメールを送信することに関するいくつかの解決策を見つけましたが、デスクトップでこれを達成する方法は何も見つかりませんでした。

誰でも私にこの仕事をする方法を教えてもらえれば、私は大いに感謝します!

答えて

2

推測の代わりにドキュメントを見ることを助けます。

list of URI constructorsは、2つの文字列をとるURIコンストラクタがないことを示しています。それがあなたの最初のアプローチが失敗した理由です。

Javaでは、すべての配列がObjectを継承し、default toString method of Objectを継承します。 +でオブジェクトを連結すると、自動的に各オブジェクトのtoStringメソッドが呼び出されます。これは、2番目のアプローチが結果をもたらした理由です。

mailto:の形式の公式の定義は、RFC 2368であり、コンマで区切って複数の受信者を指定することができます。それで、あなたは正しい道を歩いていました。

は、Java 8のとおり、あなたは単に String.joinであなたのアドレスに参加することができます。

String[] mailAddressTo = {"[email protected]","[email protected]"}; 
Desktop.getDesktop().mail(new URI("mailto:" + String.join(",", mailAddressTo))); 

しかし、URIクラスのドキュメントは単一引数のコンストラクタが既に適切にエスケープされたその文字列引数を想定していると述べています。あなたが提供した例の電子メールアドレスはエスケープする必要はありませんが、すべての可能なアドレスでその仮定を行うことは安全ではありません。あなたが8よりも古いバージョンのJavaを使用している場合は、文字列を構築することができます

String[] mailAddressTo = { "[email protected]", "[email protected]" }; 
Desktop.getDesktop().mail(new URI("mailto", String.join(",", mailAddressTo), null)); 

:これに対処するには、あなたは正しいあなたのためのURIはエスケープ行います複数の引数URIのコンストラクタを使用することができますあなた自身:

String[] mailAddressTo = { "[email protected]", "[email protected]" }; 

StringBuilder addressList = new StringBuilder(); 
String separator = ""; 
for (String address : mailAddressTo) { 
    addressList.append(separator).append(address); 
    separator = ","; 
} 

Desktop.getDesktop().mail(new URI("mailto", addressList.toString(), null)); 
+0

ええ、私はドキュメントを考えていませんでした。私はそれが過去に非常に混乱していたので、私はそれを嫌う傾向があります。それは実際にあなたに最終的な解決策を示す何かをする方法の詳細な説明には入りません。 あなたの答えをありがとう! – jesric1029

関連する問題