Как открыть почтовую программу по умолчанию с темой и телом кросс-платформенным способом? - PullRequest
11 голосов
/ 20 августа 2008

Как открыть почтовую программу по умолчанию с темой и телом кросс-платформенным способом?

К сожалению, это для клиентского приложения, написанного на Java, а не для веб-сайта.

Я бы хотел, чтобы это работало кросс-платформенным способом (что означает Windows и Mac, извините, Linux). Я счастлив выполнить VBScript в Windows или AppleScript в OS X. Но я понятия не имею, что должны содержать эти сценарии. Я хотел бы выполнить пользовательскую программу по умолчанию вместо простого поиска Outlook или чего-то еще.

В OS X я попытался выполнить команду:

open mailto:?subject=MySubject&body=TheBody

Требуется экранирование URL для замены пробелов на %20.

Обновлено В Windows вы должны играть во все виды игр, чтобы start работал правильно. Вот правильное заклинание 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);
    }
}

Ответы [ 9 ]

10 голосов
/ 26 августа 2008

В Java 1.6 у вас есть стандартный способ открыть почтовую программу по умолчанию: метод Desktop.mail (URI) . URI может использоваться для установки всех полей почты (отправитель, получатели, тело, тема). Вы можете проверить полный пример интеграции рабочего стола в Java 1.6 на Использование Desktop API в Java SE 6

4 голосов
/ 20 августа 2008

start отлично работает в Windows (см. Ниже). Я бы использовал встроенный в UrlEscape Java, а затем просто провел бы вторую замену символов '+'.

start mailto:"?subject=My%20Subject&body=The%20Body"
4 голосов
/ 20 августа 2008

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>

Копия может быть просто заменена на bcc, если вы хотите отправить слепые копии.

Это может быть очень полезно, если у вас есть ссылки на страницы различной тематики. На каждой странице вы можете отправить электронное письмо соответствующему лицу в компании, но также с копией всех писем, отправленных на центральный адрес.

Конечно, вы можете указать более одного дополнительного получателя, просто разделите список получателей запятой.

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

Источник от Получение дополнительной информации от 'mailto' , который теперь 404s. Я получил контент от waybackmachine.

3. Код объединения

Вы можете объединить различные биты кода выше, добавив '&' между каждым.

Таким образом добавляя

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

послал бы письмо с темой «Привет» мне и вам.

4. Написать письмо

Вы также можете предварительно заполнить тело письма началом сообщения или написать сообщение целиком, если хотите! Чтобы добавить что-то в тело письма, снова просто, как указано выше - '? Body = ' после адреса электронной почты. Однако форматирование этой электронной почты может быть немного сложнее. Для создания пробелов между словами вы должны будете использовать шестнадцатеричный код - например, '% 20 ' между каждым словом, а для создания новых строк будет означать добавление '% 0D '. Точно так же символы, такие как $ , должны быть записаны в шестнадцатеричном коде.

Если вы также хотите добавить строку темы и отправить копии нескольким получателям, это может сделать очень длинный и трудный для написания кусочек кода.

Он отправит сообщение трем людям с указанием темы и сообщения, все, что вам нужно сделать, это добавить свое имя.

Просто посмотрите на код!

<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 источника, на котором я обнаружил, что теперь он 404, поэтому я перехватил контент с waybackmachine и разместил его здесь, чтобы он не терялся. Кроме того, ФП заявил, что это не для веб-сайта, что и есть эти примеры, но некоторые из этих методов все еще могут быть полезны.

3 голосов
/ 26 августа 2008

Никогда не используйте Runtime.exec(String) в Mac OS X или любой другой операционной системе. Если вы сделаете это, вам придется выяснить, как правильно заключать в кавычки все строки аргументов и т. Д .; это боль и очень подвержена ошибкам.

Вместо этого используйте Runtime.exec(String[]), который принимает массив уже разделенных аргументов. Это гораздо больше подходит практически для всех целей.

3 голосов
/ 20 августа 2008

Я не знаю, есть ли в Java какой-то встроенный метод для urlencoding строки, но эта ссылка http://www.permadi.com/tutorial/urlEncoding/ показывает некоторые из наиболее распространенных символов для кодирования:

Для кодирования процентов в mailto URI hnames и hvalues ​​я использую правила в 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, а stray \ r уже нормализовано до \ n.

Также обратите внимание, что простой возврат исходной строки в исключении, подобном описанному выше, безопасен только в том случае, если аргумент mailto URI, передаваемый в командной строке, правильно экранирован и заключен в кавычки.

На окнах это означает:

  1. Цитировать аргумент.
  2. Escape любой "внутри кавычек с \.
  3. Избегайте любых \, которые предшествуют "или концу строки с помощью \.

Кроме того, в Windows, если вы имеете дело со строками UTF-16, как в Java, вы можете использовать ShellExecuteW для «открытия» mailto URI. Если вы этого не сделаете и вернете s для исключения (где некоторое значение hvalue не полностью закодировано в процентах, вы можете сузить некоторые широкие символы и потерять информацию. Но не все почтовые клиенты принимают аргументы Юникода, так что в идеале вам нужно передать правильно аргумент ascii в процентах-utf8 с ShellExecute.

Как и «start», ShellExecute с «open» должен открыть mailto URI в клиенте по умолчанию.

Не уверен насчет других ОС.

3 голосов
/ 20 августа 2008

Мне пришлось заново реализовать URL-код потому что Java будет использовать + для пространства и Мэйл воспринял это буквально.

Я не знаю, есть ли в 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
2 голосов
/ 20 августа 2008

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).

1 голос
/ 24 августа 2012

Вы можете использовать это ...

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: ссылки на почту

0 голосов
/ 20 августа 2008

Я реализовал это, и он хорошо работает на OS X. (Упоминание Райана о максимальной длине URL не было кодифицировано.)

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...