Ответ 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 или в пределах переключателя профиля нескольких предварительно настроенных отправителей. По умолчанию он просто использует ваш профиль по умолчанию.
Скажите, если это поможет.