Запустить почтовый клиент с вложением?

#java #email #email-client #jdic

#java #Адрес электронной почты #почтовый клиент #jdic

Вопрос:

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

Из-за ограничений RFC java.awt.Desktop.mail-Метод не работает с вложениями. Проект JDIC мертв, а проект JMAPI довольно неясен в процессе создания. (Требуется 1.4 Mozilla-Исходники) И мне приходится самому создавать его для 64-битных систем.

Есть ли альтернатива? Я уже читал статьи здесь, но используя rundl32.dll и такие «решения» — это не то, что я хочу внедрять в производственный код.

Комментарии:

1. Определите параметры проблемы. Может ли решение быть только для Windows? Обязательно ли это должна быть чистая java? Обязательно ли не зависеть от разрядности?

2. Рабочее решение только для Windows тоже было бы неплохо. Но он должен работать на 32/64 битах и Windows XP и Windows Vista / 7.

3. Это должно сильно зависеть от платформы.

Ответ №1:

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

В Windows можно использовать интерфейс JNI для MAPI, который обеспечит больший контроль над открытием электронной почты в почтовом приложении. Как вы упомянули, одной из таких библиотек является JMAPI — однако, похоже, существует множество библиотек с таким названием и схожими целями. Я обнаружил один, который недавно поддерживается и кажется довольно простым. Он включает в себя предварительно созданную двоичную DLL и сопутствующую библиотеку на основе Java JNI.

https://github.com/briandealwis/jmapi

Похоже, что с помощью этого кода вам нужно будет только создать объект message и вызвать метод для его запуска в почтовом приложении: import jmapi.*; …

     if (JMAPI.isMapiSupported()) {
        Message msg = new Message();
        msg.setSubject("test!");
        msg.setBody("Hello world");

        List<String> toAddresses = new LinkedList<String>();
        toAddresses.add("example@example.com");
        msg.setToAddrs(toAddresses);

        List<String> attachPaths = new LinkedList<String>();
        //Must be absolute paths to file
        attachPaths.add("C:UsersDocumentsfile.jpg");
        msg.setAttachments(attachPaths);

        JMAPI.open(msg);
    }
  

Другая возможность, которая может сработать для Windows и Mac (и, возможно, других операционных систем), заключается в создании файла «.eml» или «.msg» с содержимым и вложениями, которые вы хотели бы включить, уже закодированными как часть электронного письма. Затем этот файл можно было бы запустить с обработчиком по умолчанию для соответствующего формата файла электронной почты. Однако при этом не гарантируется открытие обработчика электронной почты по умолчанию, а формат файла не будет совместим со всеми почтовыми клиентами.

Комментарии:

1. Этот JMapi — это именно та библиотека, о которой я упоминал выше, поэтому он не работает с 64-разрядными системами, что является обязательным. И решение с файлом eml, как вы указали, небезопасно. Например. на моем компьютере не установлен почтовый клиент, совместимый с EML.

2. 1 за вырезанный чистый код и -1 за игнорирование того, что решение должно работать в 64-разрядной системе

3. Я пытаюсь использовать в своем веб-приложении Java (среда разработчика: Ubuntu 12.04 , Jdk6 ). Однако я получаю следующую ошибку. java.lang.UnsatisfiedLinkError: org.jdesktop.jdic.desktop.internal.impl.WinAPIWrapper.RegOpenKey(I[BI)[I

4. @vissu К сожалению, это решение только для Windows, поскольку оно использует JNI для использования собственных библиотек Windows (не JVM).

Ответ №2:

(насколько я знаю) В настоящее время невозможно добавить предопределенное вложение, но вы можете выполнить другие действия, о которых вы упомянули (запустить почтовый клиент по умолчанию с определенным получателем, темой и телом), используя java.awt.Desktop.mail.. Я полагаю, что вы уже проверили здесь. Хотя это было бы очень полезно.

Комментарии:

1. Вопрос в том, есть ли рядом с Desktop-API какой-либо надежный способ сделать это.

Ответ №3:

Возможно, уже слишком поздно, но на всякий случай, если кто-нибудь все еще обнаружит эту проблему:

 Desktop.getDesktop().mail(new URI("mailto:email@example.com?subject=attachment_exampleamp;body=see_attached_fileamp;attachment=/path/to/attachment"));
  

должно сработать независимо от платформы.

Комментарии:

1. Это не сработает (я даже тестировал), поскольку mailto не поддерживает вложения.

2. @ScriptKiddy: вы правы — mailto RFC не реализует расширение «вложение». Но некоторые почтовые клиенты соблюдают это. Например, Evolution для Linux работает (по крайней мере, для меня!). Thunderbird этого не делает. Спасибо, что указали!