Как открыть почтовую программу по умолчанию с темой и текстом кросс-платформенным способом?
Как открыть почтовую программу по умолчанию с темой и текстом кросс-платформенным способом?
К сожалению, это не веб-сайт, а клиентское приложение, написанное на 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)9
В Java 1.6 у вас есть стандартный способ открыть почтовую программу платформы по умолчанию: метод Desktop.mail (URI) . URI может использоваться для установки всех полей письма (отправитель, получатели, тело, тема). Вы можете проверить полный пример интеграции рабочего стола в Java 1.6 в Использование API рабочего стола в Java SE 6
1. Добавьте строку темы
Вы можете предварительно заполнить строку темы в электронном письме, добавив тему, которой предшествует " ? Subject = " после адреса электронной почты.
Таким образом, теперь ссылка становится такой:
<a href="mailto:[email protected]?subject=Mail from Our Site">Email Us</a>
2. Отправить нескольким получателям
Письмо может быть отправлено дополнительным получателям в виде копии (cc) или скрытой копии (bcc).
Это делается аналогичным образом, помещая « [email protected] » после начального адреса.
Итак, ссылка выглядит так:
<a href="mailto:[email protected][email protected]">Email Us</a>
cc можно просто заменить на bcc, если вы хотите отправлять слепые копии.
Это может быть очень полезно, если у вас есть ссылки на страницах разной тематики. У вас может быть электронная почта на каждой странице, отправляемая соответствующему лицу в компании, но с копиями всех писем, отправленных также на центральный адрес.
Вы, конечно, можете указать более одного дополнительного получателя, просто разделите список получателей запятой.
<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-адрес источника, по которому я нашел это, теперь 404ing, поэтому я взял контент с waybackmachine и разместил его здесь, чтобы он не потерялся. Кроме того, в OP заявлено, что это не для веб-сайта, каковы эти примеры, но некоторые из этих методов все еще могут быть полезны.
Вы можете использовать это ...
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: ссылки на почту
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).
Мне пришлось заново реализовать 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
Я не знаю, есть ли в Java какой-либо встроенный метод для urlencoding строки, но эта ссылка http://www.permadi.com/tutorial/urlEncoding/ показывает некоторые из наиболее распространенных символов для кодирования:
Для процентного кодирования hnames и hvalue URI mailto я использую правила 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.
Также обратите внимание, что простой возврат исходной строки для исключения, подобного приведенному выше, является безопасным только в том случае, если аргумент URI mailto, который вы передаете в командной строке, правильно экранирован и заключен в кавычки.
В окнах это означает:
- Процитируйте аргумент.
- Избегайте "внутри кавычек" с помощью \.
- Экранируйте любые символы \, которые предшествуют "или конец строки" \.
Кроме того, в Windows, если вы имеете дело со строками UTF-16, как в Java, вы можете использовать ShellExecuteW для «открытия» URI mailto. Если вы этого не сделаете и вернете s при исключении (где некоторое hvalue не полностью закодировано в процентах, вы можете сузить некоторые широкие символы и потерять информацию. Но не все почтовые клиенты принимают аргументы Unicode, поэтому в идеале вы хотите чтобы передать правильно закодированный в процентах-utf8 аргумент ascii с помощью ShellExecute.
Как и «start», ShellExecute с «open» должен открывать URI mailto в клиенте по умолчанию.
Не уверен насчет других ОС.
Я реализовал это, и он хорошо работает в 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.
Никогда не используйте Runtime.exec(String)
Mac OS X или любую другую операционную систему. Если вы это сделаете, вам нужно будет выяснить, как правильно заключить в кавычки все строки аргументов и так далее; это больно и очень подвержено ошибкам.
Вместо этого используйте Runtime.exec(String[])
which принимает массив уже разделенных аргументов. Это гораздо больше подходит практически для всех целей.