Как создать электронную почту в Outlook и сделать ее видимой для пользователя

Я хочу создать E-Mail с Java-приложением, используя Outlook и OLE-клиент.

Я искал примеры и нашел немало. Все они начинаются одинаково:

Создайте экран, оболочку, OLE-кадр и сайт клиента OLE.

Но я получаю сообщение об ошибке с этими несколькими шагами:

Display display = new Display();
Shell shell = new Shell(display);

shell.setText("Outlook Automation");
shell.setLayout(new FillLayout());

OleFrame frm = new OleFrame(shell, SWT.NONE);

OleClientSite site = new OleClientSite(frm, SWT.NONE,
                "Outlook.Application");

Я получаю следующую ошибку:

Exception in thread "main" org.eclipse.swt.SWTException: Failed to create Ole Client. result = -2147221164
at org.eclipse.swt.ole.win32.OLE.error(OLE.java:302)
at org.eclipse.swt.ole.win32.OleClientSite.<init>(OleClientSite.java:242)
at outlooktest.Main.main(Main.java:27)

Я не знаю OLE, и я не уверен, что я делаю неправильно. Есть ли какие-то зависимости, которые мне не хватает? Кто-нибудь знает, что это за ошибка? Я googled для кода ошибки, но ничего не нашел.

ИЗМЕНИТЬ

Ну, если никто не знает, почему OLE не работает для меня, у меня возникает другой вопрос. Возможно ли, или есть библиотека, создать электронную почту Outlook и настроить ее (тему, тело и т.д.), Но не отправлять ее, но сделать ее видимой для пользователя, чтобы изменить что-то?

РЕДАКТИРОВАТЬ 2

Файлы jar x86 и x64 не сработали, такая же ошибка. Также я получил самые новые версии SWT для x86 и x64. OS также является x64 и java, поэтому я не могу использовать библиотеки SWT x86. С x64 происходит ошибка. Версия Outlook - 15 (Outlook 2013).

Надеюсь, это поможет?

Я получил создание E-Mail для работы через Processbuilder, но только с параметром mailto:. Проблема здесь следующая:

  • Я хочу отслеживать статус процесса. Я хочу знать, когда электронная почта закрыта/отправлена ​​вообще.
  • Я хочу вставить изображение (BufferedImage) из буфера обмена в тело, что просто невозможно с аргументом mailto.

Ответ 1

Для меня это хорошо работает в соответствии с учебником на vogella.com. Я также попробовал ваш минимальный образец кода и не получил ошибок при создании клиента OLE. Кстати, я использовал SWT 4.3.

Немного не по теме, но это должен быть Outlook? Я хочу сказать, вы просто хотите автоматизировать отправку электронной почты - вы можете использовать JavaMail и делать это без головного убора, то есть без автоматизации реального графического интерфейса клиент. Единственными причинами, которые я могу себе представить, желая использовать Outlook или другой почтовый клиент, являются:

  • Вам нужно отправить отправленное сообщение в ваш исходный код для справки.
  • Outlook подключен к серверу Exchange, который настроен на то, чтобы не принимать SMTP-подключения, используемые JavaMail.
  • Возможно, вам захочется составить базовое сообщение и показать его пользователю, чтобы она могла добавлять вложения или редактировать текст в интерактивном режиме перед отправкой.

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


Обновление: Я загрузил SWT с домашней страницы , в моем случае последняя стабильная версия 4.3 для Windows. В архиве ZIP вам нужен файл swt.jar.

Мой пример кода выглядит так и работает нормально:

package de.scrum_master.ole;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.OleClientSite;
import org.eclipse.swt.ole.win32.OleFrame;
import org.eclipse.swt.ole.win32.Variant;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class OutlookMail {
    public static void main(String[] args) {
        sendEMail();
    }

    public static void sendEMail() {
        Display display = new Display();
        Shell shell = new Shell(display);
        OleFrame frame = new OleFrame(shell, SWT.NONE);

        // This should start outlook if it is not running yet
//      OleClientSite site = new OleClientSite(frame, SWT.NONE, "OVCtl.OVCtl");
//      site.doVerb(OLE.OLEIVERB_INPLACEACTIVATE);

        // Now get the outlook application
        OleClientSite site2 = new OleClientSite(frame, SWT.NONE, "Outlook.Application");
        OleAutomation outlook = new OleAutomation(site2);

        OleAutomation mail = invoke(outlook, "CreateItem", 0 /* Mail item */).getAutomation();

        setProperty(mail, "BodyFormat", 2 /* HTML */);
        setProperty(mail, "Subject", "My test subject");
//      setProperty(mail, "From", "[email protected]");
        setProperty(mail, "To", "<John Doe> [email protected]");
        setProperty(mail, "HtmlBody", "<html><body>This is an <b>HTML</b> test body.</body></html>");

//      if (null != attachmentPaths) {
//          for (String attachmentPath : attachmentPaths) {
//              File file = new File(attachmentPath);
//              if (file.exists()) {
//                  OleAutomation attachments = getProperty(mail, "Attachments");
//                  invoke(attachments, "Add", attachmentPath);
//              }
//          }
//      }

        invoke(mail, "Display" /* or "Send" */);

    }

    private static OleAutomation getProperty(OleAutomation auto, String name) {
        Variant varResult = auto.getProperty(property(auto, name));
        if (varResult != null && varResult.getType() != OLE.VT_EMPTY) {
            OleAutomation result = varResult.getAutomation();
            varResult.dispose();
            return result;
        }
        return null;
    }

    private static Variant invoke(OleAutomation auto, String command,
            String value) {
        return auto.invoke(property(auto, command),
                new Variant[] { new Variant(value) });
    }

    private static Variant invoke(OleAutomation auto, String command) {
        return auto.invoke(property(auto, command));
    }

    private static Variant invoke(OleAutomation auto, String command, int value) {
        return auto.invoke(property(auto, command),
                new Variant[] { new Variant(value) });
    }

    private static boolean setProperty(OleAutomation auto, String name,
            String value) {
        return auto.setProperty(property(auto, name), new Variant(value));
    }

    private static boolean setProperty(OleAutomation auto, String name,
            int value) {
        return auto.setProperty(property(auto, name), new Variant(value));
    }

    private static int property(OleAutomation auto, String name) {
        return auto.getIDsOfNames(new String[] { name })[0];
    }
}

Я прокомментировал часть вложений в конце, а также первую команду OLE, потому что для меня она также работает без нее. Он не наносит никакого вреда, но, возможно, вам это нужно. Просто попробуйте.

Причина, по которой я прокомментировал строку заголовка "От", состоит в том, что она не имеет никакого эффекта. Для изменения отправителя вам, вероятно, понадобится еще один фрагмент кода для переключения профиля Outlook или в пределах переключателя профиля нескольких предварительно настроенных отправителей. По умолчанию он просто использует ваш профиль по умолчанию.

Скажите, если это поможет.

Ответ 2

ком,

System.Diagnostics.Process.Start("mailto:[email protected]?Subject=Hello%20again&body=your%20textBody%20here")

с указанным выше кодом. Почта Outlook открыта с предопределенным mailto, Subject и Body почты, не могли бы вы объяснить мне, как мы можем добавить адрес в CC.

Ответ 3

Ваш MS Outlook может быть 32-разрядным (x86). Таким образом, 64-битный (x64) SWT не может запускать Outlook. Вам необходимо использовать 32-битный файл SWT Jar, который не будет работать на 64-битной JVM. Поэтому вам необходимо установить 32-разрядную JVM (JRE).

Даже если вы используете 64-разрядную Windows, вы все равно можете загрузить и установить 32-разрядную (x86) JRE и запустить приложение.

Ответ 4

Если вы используете что-то в Интернете, это может помочь вам:

<!DOCTYPE html>
<html>
<body>

<p>
This is an email link:
<a href="mailto:[email protected]?Subject=Hello%20again&body=your%20textBody%20here" target="_top">
Send Mail</a>
</p>

<p>
<b>Note:</b> Spaces between words should be replaced by %20 to ensure that the browser will display the text properly.
</p>

</body>
</html>

но в приложении вы можете запустить процесс mailto:

like

System.Diagnostics.Process.Start("mailto:[email protected]?Subject=Hello%20again&body=your%20textBody%20here")

он будет работать со всеми клиентами электронной почты