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

StackOverflow https://stackoverflow.com/questions/17373

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

Решение

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

Другие советы

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

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

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

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

Таким образом, связь теперь становится:

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

Получено из Получение большего от "mailto" который сейчас 404-й.Я извлек содержимое из waybackmachine.

3.Комбинирующий код

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

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

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

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

4.Напишите электронное письмо

Вы также можете предварительно заполнить текст письма началом сообщения или написать сообщение целиком, если хотите!Чтобы добавить что-то в текст письма, это опять же так же просто, как описано выше - '?тело=- после адреса электронной почты.Однако форматирование этого электронного письма может быть немного сложным.Чтобы создать пробелы между словами, вам придется использовать шестнадцатеричный код - например '%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-адрес, где я нашел это, теперь 404ing, так что я доступ к содержимому из waybackmachine и разместил это здесь, чтобы оно не потерялось.Кроме того, OP заявил, что это не для веб-сайта, о чем свидетельствуют эти примеры, но некоторые из этих методов все еще могут быть полезны.

Мне пришлось повторно реализовать 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/ показывает некоторые из наиболее распространенных символов для кодирования:

Для имен и hvalues в 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;
    }
}

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

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

В Windows это означает:

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

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

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

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

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

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

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

Основная проблема при использовании mailto заключается в разрыве строк.Используйте %0A для возврата каретки, %20 для пробелов.

Кроме того, имейте в виду, что mailto считается таким же URL-адресом, как и своего рода URL-адрес, и поэтому будет иметь те же ограничения по длине.Видишь http://support.microsoft.com/kb/208427, обратите внимание на максимальную длину URL-адреса в 2083 символа.Это подтверждается и для mailto в этой статье: http://support.microsoft.com/kb/279460/en-us.Кроме того, некоторые почтовые клиенты также могут иметь ограничение (я полагаю, что в более старых версиях Outlook Express было ограничение на что-то намного меньшее, например 483 символа или что-то в этом роде.Если вы ожидаете, что строка будет длиннее этой, вам нужно будет рассмотреть альтернативные варианты.

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

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

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

Я реализовал это, и это хорошо работает в 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 использовала бы + for space и Mail восприняли это буквально.Еще не тестировал в Windows.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top