Jacob Com Outlook отправляет почту с помощью Dispatch.call - PullRequest
0 голосов
/ 20 ноября 2018

Привет всем, что я пытаюсь отправить Outlook по электронной почте из Java с использованием кода JACOB COM activex.

В настоящее время это мой код:

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

Итак, что же я не нашел в гобле, чтобы отправить его, а не сохранить?

1 Ответ

0 голосов
/ 22 ноября 2018

Вы можете обратиться к приведенному ниже коду:

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

...