2014-10-20 13 views
0

Outlook 전자 메일에서 작동하는 Java 끌어서 놓기를 작성하려고합니다. 저는 표준 AWT 이벤트를 사용하여 Outlook에서 Java로 데이터를 전송할 수 없기 때문에 Jacob을 사용했습니다. 즉, 여기 또는 다른 사이트에서 가져온 모든 솔루션은 Java에서 치명적인 오류를 일으키고 있습니다. - 나는 오직 액티브 X 본 적이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에 자바보다 개인적으로 유창하지만 [Checkout this prior Posting] (http://stackoverflow.com/questions/17361340/delete-and-update-outlook-contact-using-jacob-library) –

답변

0

좋아, 첫째로, 당신이 만드는으로 Outlook.Application 전에 본 적이 : 여기 코드는 구성 요소 방식 :

예 :



    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 
    } 


둘째, 코드는 모든 필드와 첨부 파일을 당기고 최고의 부정확 한 것 같다 만 메시지가 무엇인지의 근사치가 될 메일을 다시 시도하고, 메일을 저장하지 않습니다.

전체 .msg 파일을 디스크에 저장하기 위해 COM 개체를 사용하지 않는 이유는 무엇입니까? 그런 다음 다시 액세스해야하는 경우 JDIC과 같은 것을 사용하여 Outlook을 실행하고 모든 첨부 파일을 포함하여 원래의 영광으로 메시지를 팝업 할 수 있습니까?

+0

우선 ... 답변 주셔서 대단히 감사합니다. 이것의 목표는 실제로 그것이 무엇인지 짐작할 수있는 것이 아니므로, 그것이하는 것처럼 보이는 것에 대해 너무 걱정하지 마십시오. 질문을 약간 다르게 표현해야하지만, 두 가지 방법 (ActiveX와 곧은 발송)으로 치명적인 오류가 발생할 수 있습니다. Jacob이 현재 Java 버전과 호환되는지 여부를 알고 있습니까? 그것은 꽤 불쾌한 충돌이기 때문에 - 전형적인 예외는 아닙니다. – MarkDacek

+0

우리는 Java 6 및 7, 모든 버전의 Windows (XP, 2008, Vista, 7,8)에서 프로덕션 환경에서 실행합니다. 우리는 32 비트 JVM만을 사용합니다. 필자는 필자가 필요하다고 생각하지 않지만 모든 코드를 실행하기 전에 DLL이 명시 적으로로드되었는지 항상 확인합니다. – antsbull

+0

방금 ​​jacob.jar, jacob-1.17-x86.dll 및 JDK 32 비트 1.7.0_45를 사용하여 코드의 첫 번째 부분을 실행하여 다음을 출력했습니다. [email protected] , false , explorer – antsbull