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

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

К сожалению, это для клиентского приложения, написанного на 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);
    }
}

Ответы

Ответ 1

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

Ответ 2

1. Добавить строку темы

Вы можете заполнить строку темы в электронном письме, добавив тему, после которой "? subject =" после адреса электронной почты.

Итак, теперь ссылка становится:

<a href="mailto:[email protected]?subject=Mail from Our Site">Email Us</a> 

2. Отправить нескольким получателям

Почта может быть отправлена ​​дополнительным получателям либо в виде копий с копией (куб. см), либо в виде слепых копий (ОЦК).

Это делается аналогичным образом, поместив "[email protected]" после первоначального адреса.

Итак, ссылка выглядит так:

<a href="mailto:[email protected][email protected]">Email Us</a>

cc можно просто заменить ОЦК, если вы хотите отправить слепые копии.

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

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

<a href="mailto:[email protected][email protected], [email protected], [email protected]">Email Us</a> 

Получено из Получение большего количества из 'mailto', которое теперь 404s. Я получил содержимое из waybackmachine.

3. Объединение кода

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

Таким образом, добавив

[email protected]?subject=Hello&[email protected]&[email protected]

отправил бы мне электронное письмо с темой "Привет", вы и она.

4. Напишите электронную почту

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

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

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

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

<a href="mailto:[email protected][email protected]
&[email protected]&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 и разместил его здесь, t потеряться. Кроме того, ОП заявила, что это не для веб-сайта, что и есть эти примеры, но некоторые из этих методов могут по-прежнему быть полезными.

Ответ 3

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

start mailto:"?subject=My%20Subject&body=The%20Body"

Ответ 4

Мне пришлось повторно реализовать 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

Ответ 5

Я не знаю, имеет ли 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.

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

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

  • Введите аргумент.
  • Побег любой "внутри кавычек с \.
  • Побег любого \, который предшествует значению "или конец строки с помощью..

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

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

Не уверен о других ОС.

Ответ 6

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

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

Ответ 7

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 символа или что-то в этом роде. Если вы ожидаете иметь более длинную строку, чем это, тогда вам нужно будет взглянуть на альтернативы.

Кстати, вам не нужно прибегать к выходу script, чтобы сделать это, пока вы можете выложить команду из Java (я не знаю, можно ли с тех пор, как я не делаю Java).

Ответ 8

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

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 links

Ответ 9

Я реализовал это, и он хорошо работает на 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.