java - Jacob Com Outlook 使用 Dispatch.call 发送邮件

标签 java eclipse outlook jacob

嘿,我正在尝试使用 JACOB COM activex 代码从 Java 发送 Outlook 电子邮件。

这是目前我的代码:

import com.ibm.rational.test.lt.kernel.services.ITestExecutionServices;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;    
import java.util.HashMap;
import java.util.Map;

public class MailOut implements com.ibm.rational.test.lt.kernel.custom.ICustomCode2 {
    Map<String, Object> params = new HashMap<String, Object>();
    String attachment[] = new String[1];
    String to[] = new String[1];

    public MailOut() {
    }

    public String exec(ITestExecutionServices tes, String[] args) {
        //---------------------------------------------------------------------
        params.put("subject", "Test subject");
        params.put("body", "Please see attached.");

        attachment[0] = "C:\\temp\\about_blank.pdf";
        params.put("attachments", attachment);

        to[0] = "me@here.com";
        params.put("to", to);

        OutlookJACOB mail = new OutlookJACOB();
        mail.createEmail(params);
        //---------------------------------------------------------------------

        return "";
    }

    public class OutlookJACOB
    {
        private ActiveXComponent ol;
        private Dispatch outlook;
        private Object mapi[] = new Object[1];
        private Object email[] = new Object[1];

        public OutlookJACOB()
        {
            mapi[0] = "MAPI";
            email[0] = 0;

            ol = new ActiveXComponent("Outlook.Application");
            //ol.setProperty("Visible", new Variant(true));
            outlook = ol.getObject();
            Dispatch.call(outlook,"GetNamespace",mapi).toDispatch();
        }

        public void createEmail(Map<String, Object> params)
        {
            Dispatch mail = Dispatch.call(outlook,"CreateItem",email).toDispatch();
            Dispatch.put(mail, "Subject", params.get("subject"));
            Dispatch.put(mail, "HTMLBody", params.get("body"));

            String to[] = (String[]) params.get("to");
            String attachments[] = (String[]) params.get("attachments");

            if(to != null)
            {
                if(to.length>0)
                {
                    String _to = "";

                    for(Object t : to)
                    {
                        _to += t + ";";
                    }

                    Dispatch.put(mail, "To", _to);
                }
            }

            if(attachments != null)
            {
                if(attachments.length>0)
                {
                    Dispatch attachs = Dispatch.get(mail, "Attachments").toDispatch();

                    for(Object attachment : attachments)
                    {
                        Dispatch.call(attachs, "Add", attachment);
                    }
                }
            }

            //Dispatch.call(mail, "Send");
            try {
                Dispatch.call(mail, "Send");  
            } catch (com.jacob.com.ComFailException e) {  
                e.printStackTrace();  
            }  

        }
    }
}

该行错误是这一行:

Dispatch.call(mail, "Send"); 

错误状态:

com.jacob.com.ComFailException:
A COM exception has been encountered:
At Invoke of: Send
Description: 80004004 / Operation aborted

现在我知道我的代码是正确的,因为如果我这样做:

Dispatch.call(mail, "Save");

然后它会将我创建的电子邮件放入 Outlook 的草稿文件夹中: enter image description here

那么,为了发送而不保存它,我在这里错过了什么?

最佳答案

您可以引用以下代码:

ActiveXComponent oOutlook = new ActiveXComponent("Outlook.Application");
        try { 
            DispatchEvents events = new DispatchEvents( oOutlook,
                    new InvocationProxy() {
                        public Variant invoke(String name, Variant[] args) {
                            _log.debug("Outlook got a "+name);
                            return null;
                        }
                    }
            );
        } catch (ComException cex) { 
            System.err.println("HR: " + Integer.toHexString(cex.getHResult())); 
            cex.printStackTrace();
        }
        Dispatch mail = Dispatch.invoke( oOutlook.getObject(), "CreateItem", Dispatch.Get, new Object[] { "0" }, new int[0]).toDispatch();

        Dispatch.put(mail, "To", email );
        Dispatch.put(mail, "Cc", cc );
        Dispatch.put(mail, "Subject", "I am broke" );
        Dispatch.put(mail, "Body", "Dear Beloved, Please send me cash.  I am King of Nigeria.  Thanks.");
        Dispatch.put(mail, "ReadReceiptRequested", "true" );

        Dispatch attachments = Dispatch.get(mail, "Attachments").toDispatch();
        Dispatch.call(attachments, "Add", attachment );
        Dispatch.call(mail,"Send");
        oOutlook.safeRelease();
        ComThread.Release();

欲了解更多信息,请参阅此链接:

JACOB - Java COM Bridge

关于java - Jacob Com Outlook 使用 Dispatch.call 发送邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53399112/

相关文章:

java - BufferedReader.readLine 不工作

java - getResourceAsStream 方法之间的区别

java - Swagger ApiModel属性访问

java - Eclipse 上的自动代码完成

c++ - 使用 boost.test 时如何让 std::cout 显示在 eclipse IDE 控制台中?

javascript - 使用ActiveX在Outlook 2010中打开.eml文件

java - JFrame 点绘图的奇怪行为

vba - 在Outlook 2013中使用VBA将电子邮件添加密件抄送

c# - 如何使用 ASP.NET 访问 Outlook 邮件?

java - org.openqa.selenium.NoSuchElementException