12

クロスプラットフォームの方法で件名と本文を指定してデフォルトのメール プログラムを開くにはどうすればよいですか?

残念ながら、これは Web サイトではなく、Java で記述されたクライアント アプリ用です。

これがクロスプラットフォームの方法で動作することを望みます (つまり、Windows と Mac、申し訳ありませんが Linux)。Windows で VBScript を実行したり、OS X で AppleScript を実行したりできてうれしく思います。しかし、それらのスクリプトに何を含めるべきかわかりません。Outlookなどを検索するだけでなく、ユーザーのデフォルトプログラムを実行したいと思います。

OS X では、次のコマンドを実行してみました。

open mailto:?subject=MySubject&body=TheBody

スペースを に置き換えるには、URL エスケープが必要です%20

更新startWindows では、正しく実行するためにあらゆる種類のゲームをプレイする必要があります。適切な Java の呪文は次のとおりです。

class Win32 extends OS {
    public void email(String subject, String body) throws Exception {
        String cmd = "cmd.exe /c start \"\" \"" + formatMailto(subject, body) + "\"";
        Runtime.getRuntime().exec(cmd);
    }
}
4

9 に答える 9

10

Java 1.6 では、プラットフォームのデフォルトのメーラーを開く標準的な方法があります: Desktop.mail(URI) メソッドです。URI を使用して、メールのすべてのフィールド (送信者、受信者、本文、件名) を設定できます。Java 1.6 でのデスクトップ統合の完全な例は、Using the Desktop API in Java SE 6 で確認できます。

于 2008-08-26T11:38:21.250 に答える
4

startWindows では正常に動作します (以下を参照)。Java の組み込み UrlEscape を使用してから、「+」文字の 2 番目の置換を実行します。

start mailto:"?subject=My%20Subject&body=The%20Body"
于 2008-08-20T04:53:10.837 に答える
4

Runtime.exec(String)Mac OS X またはその他のオペレーティング システムでは使用しないでください。その場合、すべての引数文字列を適切に引用する方法などを理解する必要があります。それは苦痛であり、非常にエラーが発生しやすいです。

代わりに、Runtime.exec(String[])既に分離された引数の配列を取る which を使用してください。これは、事実上すべての用途に適しています。

于 2008-08-26T03:34:25.907 に答える
4

1.件名を追加する

電子メール アドレスの後に「 ?subject= 」で始まる件名を追加することにより、電子メールの件名を事前に入力できます。

したがって、リンクは次のようになります。

<a href="mailto:someone@yoursite.com?subject=Mail from Our Site">Email Us</a> 

2. 複数の宛先に送信する

メールは、カーボン コピー (cc) またはブラインド カーボン コピー (bcc) として追加の受信者に送信できます。

これは、最初のアドレスの後に ' ?cc=someoneelse@theirsite.com ' を配置することにより、同様の方法で行われます。

したがって、リンクは次のようになります。

<a href="mailto:someone@yoursite.com?cc=someoneelse@theirsite.com">Email Us</a>

ブラインド カーボン コピーを送信する場合は、cc を bcc に置き換えるだけです。

これは、テーマが異なるページにリンクがある場合に非常に便利です。各ページの電子メールを社内の適切な人に送信する一方で、すべての電子メールのコピーを中央のアドレスにも送信することができます。

もちろん、受信者のリストをコンマで区切るだけで、複数の追加の受信者を指定できます。

<a href="mailto:someone@yoursite.com?cc=someoneelse@theirsite.com, another@thatsite.com, me@mysite.com">Email Us</a> 

Get More From 'mailto'から取得しました。現在は 404 です。waybackmachine からコンテンツを取得しました。

3. コードの結合

それぞれの間に「&」を追加することで、上記のさまざまなコードを組み合わせることができます。

したがって、追加

me@mysite.com?subject=Hello&cc=you@yoursite.com&bcc=her@hersite.com

「こんにちは」という件名のメールを私とあなたと彼女に送信します。

4. メールを書く

メールの本文にメッセージの冒頭を事前に入力することも、必要に応じてメッセージ全体を書くこともできます。メールの本文に何かを追加するには、上記と同じように簡単です。メール アドレスの後に' ?body= ' を追加します。ただし、そのメールの書式設定は少し難しい場合があります。単語間にスペースを作成するには、16 進コードを使用する必要があります。たとえば、各単語の間に' %20 ' を使用し、新しい行を作成するには ' %0D ' を追加することを意味します。同様に、 $記号などの記号は 16 進コードで記述する必要があります。

件名を追加してコピーを複数の受信者に送信する場合は、コードが非常に長くなり、記述が困難になる可能性があります。

件名とメッセージを入力して 3 人にメッセージを送信します。名前を追加するだけです。

コードを見るだけ!

<a href="mailto:abbeyvet@outfront.net?CC=spooky@outfront.net
&BCC=thomasbrunt@outfront.net&Subject=Please%2C%20I%20insist
%21&Body=Hi%0DI%20would%20like%20to%20send%20you%20
%241000000%20to%20divide%20as%20you%20see%20fit%20among
%20yourselves%20and%20all%20the%20moderators.%0DPlease%
20let%20me%20know%20to%20whom%20I%20should%20send
%20the%20check.">this link</a> 

注: これを見つけた元のソース URL は現在 404ing になっているため、waybackmachine からコンテンツを取得してここに投稿し、失われないようにしました。また、OP は、これらの例は Web サイト用ではないと述べていますが、これらの手法のいくつかはまだ役立つ場合があります。

于 2008-08-20T03:42:35.547 に答える
3

Javaに文字列をurlencodingするための組み込みメソッドがあるかどうかはわかりませんが、このリンクhttp://www.permadi.com/tutorial/urlEncoding/には、エンコードする最も一般的な文字のいくつかが示されています。

mailto URIのhnameとhvalueのパーセントエンコードについては、http: //shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#encodingのルールを使用します。http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#implementationsの下に、役立つ可能性のあるJavaの例があります。

基本的に、私は以下を使用します:

private String encodex(final String s) {
    try {
        return java.net.URLEncoder.encode(s, "utf-8").replaceAll("\\+", "%20").replaceAll("\\%0A", "%0D%0A");
    } catch (Throwable x) {
        return s;
    }
}

渡される文字列は、\ r \ nの文字列であり、\rはすでに\nに正規化されている必要があります。

また、上記のような例外で元の文字列を返すことは、コマンドラインで渡すmailto URI引数が適切にエスケープされ、引用符で囲まれている場合にのみ安全であることに注意してください。

Windowsでは、次のことを意味します。

  1. 議論を引用しなさい。
  2. 引用符内の「」はすべて\でエスケープします。
  3. "の前の\または文字列の終わりを\でエスケープします。

また、Windowsでは、JavaのようにUTF-16文字列を処理している場合は、ShellExecuteWを使用してmailtoURIを「開く」ことができます。例外でsを返さない場合(一部のhvalueが完全にパーセントエンコードされていない場合、一部のワイド文字を絞り込んで情報を失う可能性があります。ただし、すべてのメールクライアントがUnicode引数を受け入れるわけではないため、理想的にはShellExecuteで適切にパーセントエンコードされたutf8ASCII引数を渡す。

「start」と同様に、「open」を指定したShellExecuteは、デフォルトのクライアントでmailtoURIを開く必要があります。

他のOSについてはよくわかりません。

于 2008-08-20T07:51:04.857 に答える
3

URLencode を再実装する必要がありました。これは、Java ではスペースに + が使用され、Mail では文字どおりに使用されるためです。

Java に文字列を urlencoding するための組み込みメソッドがあるかどうかはわかりませんが、このリンクhttp://www.permadi.com/tutorial/urlEncoding/は、エンコードする最も一般的な文字のいくつかを示しています。

;       %3B
?       %3F
/       %2F
:       %3A
#       %23
&       %24
=       %3D
+       %2B
$       %26
,       %2C
space   %20 or +
%       %25
<       %3C
>       %3E
~       %7E
%       %25
于 2008-08-20T04:03:44.200 に答える
2

Mailto は悪いルートではありません。ただし、前述のとおり、正しくエンコードされていることを確認する必要があります。

mailto を使用する際の主な問題は、改行です。キャリッジ リターンには %0A を使用し、スペースには %20 を使用します。

また、mailto は一種の URL と同じと見なされるため、長さには同じ制限があることに注意してください。http://support.microsoft.com/kb/208427を参照して ください。URL の最大長は 2083 文字です。これは、次の記事の mailto でも確認されています: http://support.microsoft.com/kb/279460/en-us。また、一部のメール クライアントにも制限がある場合があります (古いバージョンの Outlook Express では、483 文字などのはるかに小さな制限があったと思います。それよりも長い文字列が予想される場合は、代替手段を検討する必要があります。 .

ところで、Java からコマンドをシェルアウトできる限り、それを行うためにスクリプトを追い出すことに頼る必要はありません (私は Java をやっていないので、できるかどうかはわかりません)。

于 2008-08-20T03:30:31.487 に答える
1

あなたはこれを使うかもしれません...

main(string[] args){    
String forUri = String.format("mailto:?subject=%s&body=%s",  urlEncode(sub), urlEncode(mailBody));
                        Desktop.getDesktop().mail(new URI(forUri));
}

private static final String urlEncode(String str) {
        try {
            return URLEncoder.encode(str, "UTF-8").replace("+", "%20");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

また、書式設定については、Java でメールを送信する簡単な方法: mail-to リンクを参照してください。

于 2012-08-24T10:02:08.487 に答える
0

私はこれを実装しましたが、OS X で問題なく動作します (URL の最大長に関する Ryan の言及は成文化されていません)。

public void email(String subject, String body) throws Exception {
    String cmd = "open mailto:";        
    cmd += "?subject=" + urlEncode(subject);
    cmd += "&body=" + urlEncode(body);
    Runtime.getRuntime().exec(cmd);
}

private static String urlEncode(String s) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        char ch = s.charAt(i);
        if (Character.isLetterOrDigit(ch)) {
            sb.append(ch);
        }
        else {
            sb.append(String.format("%%%02X", (int)ch));
        }
    }
    return sb.toString();
}

URLencode を再実装する必要がありました。これは、Java が+スペースを使用し、Mail がそれらを文字どおりに使用するためです。Windows ではまだテストしていません。

于 2008-08-20T03:56:38.460 に答える