Как мне отправить вложение электронной почты, используя указанный клиент, программно с Java
-
09-06-2019 - |
Вопрос
Я хотел бы призвать пользователей нашего приложения RCP отправлять подробную информацию о проблеме в наш отдел поддержки.С этой целью я добавил виджет "Связаться со службой поддержки" в наш стандартный диалог об ошибках.
Мне удалось использовать заголовки URI для отправки stacktrace с помощью вызова JDIC в Java 6: Desktop.getDesktop().mail(java.net.URI)
.Это запустит почтовый клиент пользователя, готовый к добавлению им своих комментариев, и нажмет отправить.
Мне нравится запускать почтовый клиент, потому что это то, к чему пользователь привык, он многое рассказывает службе поддержки о пользователе (sigs, контактные данные и т.д.), И я действительно не хочу для отправки с Java Mail.
Что я хотел бы сделать, так это прикрепить файл журнала и stacktrace в виде файла, чтобы не было требований к максимальной длине, и пользователь видел красивое, чистое электронное письмо, а у отдела поддержки было намного больше информации для работы.
Могу ли я сделать это с тем подходом, который я использую?Или есть способ получше?
Редактировать:Я нахожусь в контексте OSGi, поэтому было бы необходимо объединить JDIC.Если возможно, я бы хотел поставлять как можно меньше зависимостей, а объединение JDIC для нескольких платформ звучит неинтересно, особенно для такой небольшой функции.
JavaMail может подойти, но для того, чтобы это было на рабочих столах наших корпоративных клиентов.Тот Самый настройка / обнаружение конфигурации она должна быть прозрачной, автоматической и надежной.Что касается JavaMail, настройка, похоже, выполняется только вручную.Так ли это на самом деле?
Ответ, который мне нравится больше всего, заключается в использовании Desktop.open()
для файла *.eml.К сожалению Outlook Express (а не Outlook) открывает файлы eml.Я понятия не имею, является ли это обычным или по умолчанию для настройки Windows на открытие подобных EML-файлов.Это обычное дело?Или есть другой текстовый формат, который а) легко сгенерировать, б) открывается по умолчанию в том же почтовом клиенте, который уже используют пользователи?
Решение
Вы могли бы сохранить временный eml-файл и Desktop.getDesktop().open(emlFile)
Редактировать: Как вы указали, это, к сожалению, приведет к открытию Outlook Express вместо outlook.
Однако, если у вас установлена Windows Live Mail, она будет использовать это.
Другие советы
Если вы используете JDK 6 (вам действительно следует это сделать), Desktop API теперь является частью JRE.Видишь http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/desktop_api/ для получения дополнительной информации.
В качестве совершенно другого способа решения той же проблемы мы используем багтрекер с интерфейсом XML-RPC, и наше приложение (кстати, также RCP) взаимодействует с ним, используя пользовательский диалог отправки.Это означает, что мы можем отправить файлы журналов, чтобы помочь диагностировать проблему, без необходимости поиска их пользователем.
Я уверен, что у большинства багтрекеров есть что-то подобное.Мы используем Jira, и она отлично работает (по-видимому, они только что выпустили бесплатную персональную версию, которая упрощает ее использование).
Используя этот метод, вы можете задать строку темы и основной текст с помощью URI, подобного
mailto:me@here.com?SUBJECT=Support mail&BODY=This is a support mail
Однако длина темы и основного текста будет есть некоторые ограничения
Я не могу придумать, как прикрепить файл, используя этот метод или что-то подобное (без добавления javamail в ваше приложение)
JDIC не всегда может быть доступен на платформе вашего пользователя.Хороший способ сделать это - использовать javamail API.Вы можете отправить электронное сообщение, состоящее из нескольких частей, как описано в этом руководстве SUN:
import java.awt.Desktop;
import java.io.File;
import java.net.URI;
public class TestMail {
public static void main(String[] args) {
try {
Runtime.getRuntime().exec(
new String[] {"rundll32", "url.dll,FileProtocolHandler",
"mailto:a@a.de?subject=someSubject&cc=a@a.de&bcc=a@a.de&body=someBodyText&Attach=c:\\test\\test.doc"}, null
);
} catch (Exception e) {
e.printStackTrace();
}
}
}