2012-08-07 38 views
3

我有我的主要活動中的一個線程,這將創建一個類SendMailJava.lang.NoClassDefFoundError - JavaMail的

package Logic; 

import java.util.Date; 
import java.util.Properties; 

import javax.activation.DataHandler; 
import javax.activation.FileDataSource; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Multipart; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.AddressException; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 

import android.util.Log; 

public class SendMail { 

String from; 
String to; 
String subject; 
String bodyText; 
String fileName; 

public SendMail(String to, String fileName, String PCN) { 

    this.to = to; 
    this.fileName = fileName; 
    this.from = "[email protected]"; 
    this.bodyText = "FILE"; 
    this.subject = PCN; 
} 

public void sendMailWithAttatchment() { 

    Properties properties = new Properties(); 
    properties.put("mail.smtp.host", "IP_ADDRESS"); 
    properties.put("mail.smtp.port", "25"); 
    Session session = Session.getDefaultInstance(properties, null); 

    MimeMessage message = new MimeMessage(session); 

    try { 

     message.setFrom(new InternetAddress(from)); 

     message.setRecipient(Message.RecipientType.TO, new InternetAddress(
       to)); 
     message.setSubject(subject); 
     message.setSentDate(new Date()); 

     MimeBodyPart messagePart = new MimeBodyPart(); 
     messagePart.setText(bodyText); 

     MimeBodyPart attachmentPart = new MimeBodyPart(); 

     FileDataSource fileDataSource = new FileDataSource(fileName) { 
      @Override 
      public String getContentType() { 
       return "application/octet-stream"; 

      } 
     }; 

     attachmentPart.setDataHandler(new DataHandler(fileDataSource)); 
     attachmentPart.setFileName(fileDataSource.getName()); 

     Multipart multipart = new MimeMultipart(); 
     multipart.addBodyPart(messagePart); 
     multipart.addBodyPart(attachmentPart); 
     message.setContent(multipart); 
     Transport.send(message); 
    } catch (AddressException e) { 
     Log.e("ADDRESS_EXCEPTION: ", e.getMessage()); 
    } catch (MessagingException e) { 
     Log.e("MESSAGING_EXCEPTION: ", e.getMessage()); 
    } 
} 

}

的對象,但編譯器會引發異常說:Java.lang.NoClassDefFoundError. javax.activation.Datahandler

我讀過這個線程:NoClassDefFoundError - Eclipse and Android.jar filesjavamail.jarjavax.activation.jar位於下我libs文件夾,但是,這將引發一個例外? ñ即使我清理該項目。

任何想法?

這些都是引發的異常:

08-07 10:19:49.870: E/AndroidRuntime(17736): java.lang.NoClassDefFoundError: javax.activation.DataHandler 
08-07 10:19:49.870: E/AndroidRuntime(17736): at javax.mail.internet.MimeBodyPart.setContent(MimeBodyPart.java:647) 
08-07 10:19:49.870: E/AndroidRuntime(17736): at javax.mail.internet.MimeBodyPart.setText(MimeBodyPart.java:892) 
08-07 10:19:49.870: E/AndroidRuntime(17736): at javax.mail.internet.MimeBodyPart.setText(MimeBodyPart.java:680) 
08-07 10:19:49.870: E/AndroidRuntime(17736): at javax.mail.internet.MimeBodyPart.setText(MimeBodyPart.java:668) 
08-07 10:19:49.870: E/AndroidRuntime(17736): at sendMailWithAttatchment(SendMail.java:56) 
08-07 10:19:49.870: E/AndroidRuntime(17736): at sendMailWithAttatchment(SendMail.java:56) 
08-07 10:19:49.870: E/AndroidRuntime(17736): at CreateNistFile(MyActivity.java:530) 

回答

2

是的,這是因爲你的.jar文件中沒有正確導入。只要按照我現有的answer它肯定會幫助你。而且,下面的快照是非常重要的(它通知另外的jar文件應該是這樣的圖像) -

image

重要的是,每當你最好上述一個Java.lang.NoClassDefFoundError例外是處理解決方案。

+0

謝謝你的回答,但這不適合我。在拋出異常之前,我得到了這個調試信息:解析Ljavax/activation/DataHandler失敗;接口272'Ljava/awt/datatransfer/Transferable;' – 2012-08-07 07:26:17

+0

您是否正在嘗試[this](http://stackoverflow.com/questions/2020088/sending-email-in-android-using-javamail-api-without-using-the-default-built-in-a) – Praveenkumar 2012-08-07 07:31:42

+0

不,我正在學習本教程:[鏈接](http://www.kodejava.org/examples/243.html)我不想在手機上進行任何用戶交互或彈出安裝的電子郵件客戶端。郵件應該包含主題,身體文本和贊助。 – 2012-08-07 07:34:05

0

如果您使用的是Eclipse,請右鍵單擊項目>選擇屬性> Java build Path>庫>添加Jar並添加罐子。然後清理項目

+0

我已經這樣做了,事實上這不是我所要求的。你的回答太明顯了。 – 2012-08-07 07:20:58

+0

@TobiasMoeThorstensen大部分時間解決了我的問題,所以只是在幫助。沒有問題。 – Kamal 2012-08-07 07:24:12

2

的Java引入新的方式用來爲JavaMail爲Android:

你只需要添加THI線gradle這個:

android { 
    packagingOptions { 
     pickFirst 'META-INF/LICENSE.txt' // picks the JavaMail license file 
    } 
} 

repositories { 
    jcenter() 
    maven { 
     url "https://maven.java.net/content/groups/public/" 
    } 
} 

dependencies { 
    compile 'com.sun.mail:android-mail:1.5.5' 
    compile 'com.sun.mail:android-activation:1.5.5' 
} 

並做你喜歡的smtp郵件... 祝你好運。