Java 雅各布致命错误

Java 雅各布致命错误,java,com,drag-and-drop,outlook,jacob,Java,Com,Drag And Drop,Outlook,Jacob,我正在尝试构建一个可以处理Outlook电子邮件的Java拖放。我一直在使用Jacob,因为无法使用标准AWT事件将数据从Outlook传输到Java。也就是说,我从这里或其他站点获得的所有解决方案都在Java中造成了致命的崩溃。代码如下: import java.awt.dnd.*; import javax.swing.*; import java.awt.event.*; import java.awt.*; import java.awt.datatransfer.*; import j

我正在尝试构建一个可以处理Outlook电子邮件的Java拖放。我一直在使用Jacob,因为无法使用标准AWT事件将数据从Outlook传输到Java。也就是说,我从这里或其他站点获得的所有解决方案都在Java中造成了致命的崩溃。代码如下:

import java.awt.dnd.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.datatransfer.*;
import java.io.*;
import java.util.List;
import sun.awt.datatransfer.*;
import com.jacob.com.*;
import com.jacob.activeX.*;
public class D2 extends JFrame
{

private static final String DIR = "FILES";

private static void saveSelectedOutlookMails(String directory) {

    Dispatch xl = new Dispatch("Outlook.Application");

    //Dispatch selection = Dispatch.get(xl, "Selection").toDispatch();

    System.out.println(xl);
    System.out.println(xl==null);
    //PROGRAM CRASHES AFTER THIS LINE
    Dispatch explorer = Dispatch.get(xl,"ActiveExplorer").toDispatch();
    System.out.println("explorer");
    Object selection = Dispatch.get(explorer, "Selection").toDispatch();
    Variant count = Dispatch.get(selection, "Count");

    for (int mailIndex = 1; mailIndex <= count.toInt(); mailIndex++ ) {
        Object mailItem = Dispatch.call(selection, "Item", new Variant(mailIndex)).toDispatch();

        Variant senderName = Dispatch.get(mailItem, "SenderName");
        Variant subject = Dispatch.get(mailItem, "Subject");
        Variant body = Dispatch.get(mailItem, "Body");

        String emailFileName = subject.toString() +".txt"; 

        String fullPath = directory + "/" + emailFileName;
        try {
            File email = new File(fullPath);
            PrintWriter writer = new PrintWriter( new FileWriter(email) );
            writer.println("From: "+ senderName );
            writer.println("Subject: "+ subject);
            writer.println("");
            writer.print( body );
            writer.close();
        }
        catch (IOException e) {

            System.out.println(e.getMessage());
            //logger.error("IOException writing e-mail with subject: '"+ subject +"'", e);
            continue;
        }

        Object attachments = Dispatch.get(mailItem, "Attachments").toDispatch();
        Variant attachmentCount = Dispatch.get(attachments, "Count");

        if ( attachmentCount.toInt() > 0 ) {

            for( int attachmentIndex = 1; attachmentIndex<=attachmentCount.toInt(); attachmentIndex++ ) {

                Object attachment = Dispatch.call(attachments, "Item", new Variant(attachmentIndex)).toDispatch();
                Variant fileNameVariant = Dispatch.get(attachment, "FileName");
                String fileName = fileNameVariant.toString();

                Variant saveResult = Dispatch.call(attachment, "SaveAsFile", directory,  "/", fileName);
            }
        }
    }


}
public D2() throws Exception
{
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setBounds(0,0,300,300);
    this.setVisible(true);

    DropTarget dropTarget=new DropTarget();
    dropTarget.setComponent(this);
    dropTarget.addDropTargetListener(new DropTargetAdapter()
            {
                public void drop(DropTargetDropEvent dtde){

                    saveSelectedOutlookMails(DIR);

                }



            });
}


public static void main(String[] args) 

{

    try{

        new D2();
    }catch(Exception e){
        e.printStackTrace();
    }
}
}


好的,首先,您正在以一种我从未见过的方式创建Outlook.Application-我只见过Active X组件的方式:

e、 g

其次,您的代码并没有保存邮件,而是拉出所有字段和附件,并试图重新创建邮件,这充其量看起来不准确,只能近似于邮件内容


为什么不使用COM对象将整个.msg文件保存到磁盘?然后,如果您需要再次访问它,您可以使用JDIC之类的工具启动Outlook,并在其原始状态下弹出消息,包括所有附件?

我猜您正在尝试获取名为ActiveExplorer的属性,但这是一种方法!以下是该特定方法的文档。尝试使用.call Jacob方法调用MS对象上的方法。

让我们缩小范围。在哪一行发生了致命的崩溃?正在实例化资源管理器。之前的两个打印被执行,之后的一个没有。看起来问题可能在于如何访问Outlook应用程序。就我个人而言,VB.NET比Java更流利,但在使用他们的方法时也存在同样的问题。我们知道jacob是否与当前版本的Java兼容吗?这不是一个典型的抛出异常-这是一个Java VM致命错误/异常访问冲突。。非常感谢你的回答。这样做的目的并不是你想象的那样,所以不要太担心它看起来在做什么。我可能应该用不同的措辞来回答这个问题,但是ActiveX和直接发送都会导致致命的错误。您知道Jacob是否与当前版本的Java兼容吗?因为这是一个相当严重的崩溃——不是你典型的例外。我们在Java 6和7的生产环境中运行它,在所有版本的Windows XP、2008、Vista、7、8上运行它。不过,我们只使用32位JVM。我认为没有必要,但我总是确保在运行任何代码之前显式加载DLL。我只是运行了代码的第一部分,使用jacob.jar、jacob-1.17-x86.DLL和JDK 32位1.7.045,并打印出:com.jacob.com。Dispatch@a4e743,false,explorerIt肯定已加载:我尝试通过静态{}加载它由于有一个重复的库或其他原因,它崩溃了。目前,为了方便起见,我将.dll保存在同一个目录中。我们目前正在使用64位JVM。你认为这会是个问题吗?可能是个问题,我想不出还有什么不同。也许值得你尝试一下这种情况,至少消除它。我们的软件在Windows的所有32/64版本和Office 2000以后的所有Outlook版本上都有数百名用户使用,我们的代码从来没有出现过问题-我们唯一要求的是我们的软件在32位JVM上运行。


    ActiveXComponent xl = new ActiveXComponent("Outlook.Application");
    Dispatch explorer = Dispatch.get(xl,"ActiveExplorer").toDispatch();
    Dispatch selection = Dispatch.get(explorer, "Selection").toDispatch();
    Variant count = Dispatch.get(selection, "Count");

    // loop over selected mail items.
    for (int mailIndex = 1; mailIndex <= count.getInt(); mailIndex++ ) {
        Dispatch mailItem = Dispatch.call(selection, "Item", new Variant(mailIndex)).toDispatch();
        Variant subject = Dispatch.get(mailItem, "Subject");
        // .... and so on
    }