2014-10-20 3 views
0

Я пытаюсь создать перетаскивание Java, которое работает с электронными письмами Outlook. Я использовал Джейкоба из-за невозможности перенести данные из Outlook в Java, используя стандартные события AWT Event. Тем не менее, все решения, которые я выбрал здесь или на других сайтах, вызывают фатальный сбой на Java. Вот код:Jacob Fatal Error

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(); 
    } 
} 

}

The crash

+0

Позволяет сузить его. На какой линии вы получаете фатальный сбой? –

+0

Продвинутый исследователь. Два отпечатка до этого выполняются, а после - нет. – MarkDacek

+0

Похоже, проблема в том, как вы обращаетесь к приложению Outlook. Я более свободно владею VB.NET, чем Java, но [Checkout this pre posting] (http://stackoverflow.com/questions/17361340/delete-and-update-outlook-contact-using-jacob-library) –

ответ

0

Итак, во-первых, вы создаете Outlook.Application таким образом, я никогда не видел раньше - я только когда-либо видел Active X Компонентный путь:

eg



    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 
    } 


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

Почему бы вам просто не использовать COM-объекты для SaveAs всего .msg-файла на диск? Затем, если вам нужно снова получить к нему доступ, вы можете использовать что-то вроде JDIC для запуска Outlook и всплывать сообщение в оригинальной славе, включая все вложения?

+0

Прежде всего .. Большое спасибо за ваш ответ. Цель этого - на самом деле не то, что вы предполагаете, так что не беспокойтесь о том, что он делает. Я, вероятно, должен был сформулировать вопрос немного по-другому, но оба пути (ActiveX и прямая отправка) вызывают фатальные ошибки. Вы знаете, совместим ли Jacob с текущими версиями Java? Потому что это довольно неприятный крах - не ваше типичное исключение. – MarkDacek

+0

Мы запускаем его в производстве на Java 6 и 7, на всех версиях Windows (XP, 2008, Vista, 7,8). Однако мы используем только 32-разрядные JVM. Я не думаю, что это необходимо, но я всегда убеждаюсь, что DLL загружается явно перед запуском какого-либо кода. – antsbull

+0

Я просто побежал первую часть кода, используя jacob.jar, Яков-1,17-x86.dll и JDK 32-битную 1.7.0_45 и распечатан: [email protected] , false , explorer – antsbull

0

Я предполагаю, что вы пытаетесь получить PROPERTY с именем «ActiveExplorer», но это метод! Вот документация этого особого метода https://msdn.microsoft.com/en-us/library/office/ff870017.aspx. Попытайтесь использовать метод .call() Jacob для вызова МЕТОДОВ на объекты MS.