現在、私はディレクトリをリッスンするコードを書いています。ディレクトリが.apkファイルで更新されると、この.apkファイルを含むメールをGmailアカウントに送信します。私はJnotifyとJavaメールをプログラムで使用しています。
私が得ているエラーは、
javax.mail.MessagingException: IOException while sending message;
nested exception is:
javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed; boundary="----=_Part_0_145238.1392728439484"
Stackoverflowで提供されている解決策を探しましたが、役に立つものはありませんでした。
前もって感謝します
public void fileCreated(int wd, String rootPath, String name) {
print("created " + rootPath + " : " + name);
if (name.contains(".apk"))
SendEmail(name);
else
System.out.println("Not the APK file");
}
void SendEmail(String strname){
String Path = "D:/POC/Email/apk folder/"+strname;
System.out.println("Path->" + Path);
Properties props = new Properties();
props.put("mail.smtp.Host","173.194.78.108");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth","true");
props.put("mail.smtp.port","465");
System.out.println("Properties has been set properly");
Session session = Session.getDefaultInstance(props,
new javax.mail.Authenticator(){
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication("[email protected]", "senderPassword");
}
}
);
System.out.println("Session Created successfully");
try{
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("[email protected]"));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("[email protected]"));
message.setSubject("Android : " + strname);
MimeBodyPart msgbody = new MimeBodyPart();
msgbody.setText("This is the message content which is sent using Java MAIL 1.4.5");
Multipart mulpart = new MimeMultipart();
mulpart.addBodyPart(msgbody);
//Attachement Starts here.
msgbody = new MimeBodyPart();
javax.activation.DataSource source = new FileDataSource(Path);
msgbody.setDataHandler(new DataHandler(source));
msgbody.setFileName(strname);
message.setContent(mulpart);
System.out.println("Attached the message going to start transporting the mail");
//If I've the code before sending the email is getting sent but without attachment.
//Thread.currentThread().setContextClassLoader( getClass().getClassLoader() );
Transport.send(message);
System.out.println("Mail Sent successfully");
}
catch(MessagingException msg){
msg.printStackTrace();
}
catch(Exception e){
e.printStackTrace();
}
}
この問題は、以下の2つのステップを踏むことで解決策を得ることができます。
JavaMailは、MIMEタイプをJavaクラス(たとえば、multipart/mixed
からjavax.mail.internet.MimeMultipart
)。これらの構成ファイルは、アプリケーションのClassLoaderを使用してロードされます。 ClassLoaderが正しく機能しない場合、これらの構成ファイルは見つかりません。
以下の行を追加するだけで問題を解決できます。
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-Java-content-handler=com.Sun.mail.handlers.text_html");
mc.addMailcap("text/xml;; x-Java-content-handler=com.Sun.mail.handlers.text_xml");
mc.addMailcap("text/plain;; x-Java-content-handler=com.Sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-Java-content-handler=com.Sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-Java-content- handler=com.Sun.mail.handlers.message_rfc822");
私はJava 8プロジェクトをJava 10.に変換するのに忙しい。同時に、すべての依存関係を更新している。上記の解決策のどれも私にとってはうまくいきませんでした。
Pom.xmlに次のものがあります。
<dependency>
<groupId>com.Sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.1</version>
</dependency>
私はもう少し研究をして、次のリンクを見つけました:
http://www.jguru.com/faq/view.jsp?EID=237257
そこで、pom.xmlに次の依存関係を追加してみました。
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
これで問題が解決し、添付ファイル付きのメールを再度送信できました。
メールを送信する前に現在のスレッドを追加することが解決策です。
Thread.currentThread().setContextClassLoader( getClass().getClassLoader() );
Androidプロジェクトの場合、プロガードが誤って未使用のクラスを削除した可能性が高いため、コードを直接変更せずに問題を修正するためにプロガードファイルに次の行を追加してください。
-keep class com.Sun.mail.handlers.**
-dontwarn com.Sun.mail.handlers.handler_base
OSGIでは、次の回避策により、javax.activationバンドルがjavax.mailバンドルから「META-INF/mailcap」リソースをロードできます。
Thread.currentThread().setContextClassLoader(javax.mail.Message.class.getClassLoader());
Somの回答(MailcapCommandMap
)は、Liferay 7.1 ga1のSpring war Portletsで機能しました。ただし、Tomcatのmail.jar
をTomcat/lib/ext
から削除してjavax.mail-1.6.2.jar
に置き換え、プロジェクトのpom.xmlで提供されているように依存関係のスコープを確認する必要がありました。
<dependency>
<groupId>com.Sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
<scope>provided</scope>
</dependency>
Build.xmlがこれを行う場合:zipfileset src = "javamail-1.4.7/mail.jar" excludes = "META-INF /" **
次に、構成情報を取り除きます。
コードが実行されている環境について詳しく教えてください。どのJDKを使用していますか?アプリケーションサーバーで実行していますか?
JavaBeans Activation Framework(JAF)は、MIMEタイプをそれらを処理するJavaクラス(DataContentHandlers)にマッピングする方法を指示する構成ファイルを探します。ClassLoaderを使用して構成ファイルを見つけます。 ClassLoaderに問題がある場合、構成ファイルが見つからない可能性があります。
here で説明されている回避策を試すこともできますが、もちろん、問題の根本原因を特定する方が良いでしょう。
最後に、これらの 一般的なJavaMailの間違い のいくつかを修正して、プログラムを単純化することもできます。
Som からの答えは私のために働いた。ただし、JavaMail DSNを使用しているときにマッピングを変更する必要があり、それらのmailcapエントリも必要でした(Somの回答を含む、以下を含む)。
// Original answer from Som:
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-Java-content-handler=com.Sun.mail.handlers.text_html");
mc.addMailcap("text/xml;; x-Java-content-handler=com.Sun.mail.handlers.text_xml");
mc.addMailcap("text/plain;; x-Java-content-handler=com.Sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-Java-content-handler=com.Sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-Java-content-handler=com.Sun.mail.handlers.message_rfc822");
// Additional elements to make DSN work
mc.addMailcap("multipart/report;; x-Java-content-handler=com.Sun.mail.dsn.multipart_report");
mc.addMailcap("message/delivery-status;; x-Java-content-handler=com.Sun.mail.dsn.message_deliverystatus");
mc.addMailcap("message/disposition-notification;; x-Java-content-handler=com.Sun.mail.dsn.message_dispositionnotification");
mc.addMailcap("text/rfc822-headers;; x-Java-content-handler=com.Sun.mail.dsn.text_rfc822headers");
結局のところ、DSN JARをfatJAR(shadowJar/Gradleを使用)に追加していたことが問題の原因でした。DSNjarのMETA-INF/mailcapがコアのJARを上書きしていました。