29

現在、ディレクトリをリッスンするコードを書いています。ディレクトリが .apk ファイルで更新されたら、この .apk ファイルを含むメールを gmail アカウントに送信します。プログラムで Jnotify と JAVA Mail を使用しています。

私が得ているエラーは、

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"

助けを求めてスタックオーバーフローで提供されている解決策を探しましたが、どれも役に立ちませんでした。

前もって感謝します

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("SenderEmailID@gmail.com", "senderPassword");
            }
        }
    );

    System.out.println("Session Created successfully");

    try{
        Message message = new MimeMessage(session); 
        message.setFrom(new InternetAddress("SenderEmailID@gmail.com"));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("ToReceiverEmailID@gmail.com"));
        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();
    }
}
4

13 に答える 13

26

この問題は、次の 2 つの手順を実行することで解決できます。

  1. Java メールが 1.4.7 であることを確認します (以前は 1.4.5 を使用していたため、混乱が生じました)。http://www.oracle.com/technetwork/java/index-138643.htmlからダウンロードして ください。
  2. メッセージを送信する前に、次のコードを追加します。
    Thread.currentThread().setContextClassLoader( getClass().getClassLoader() );
于 2014-02-20T05:30:26.400 に答える
7

電子メールを送信する前に現在のスレッドを追加することが解決策です。

Thread.currentThread().setContextClassLoader( getClass().getClassLoader() );
于 2015-11-12T17:25:58.367 に答える
1

コードが実行されている環境について詳しく教えてください。どのJDKを使用していますか? アプリケーションサーバーで実行していますか?

JavaBeans Activation Framework (JAF) は、MIME タイプを、それらを処理する Java クラス (DataContentHandlers) にマップする方法を示す構成ファイルを探します。ClassLoader を使用して構成ファイルを見つけます。ClassLoader に問題がある場合、構成ファイルが見つからない可能性があります。

こちらで説明されている回避策を試すこともできますが、もちろん、問題の根本原因を特定することをお勧めします。

最後に、これらの一般的な JavaMailの間違いのいくつかを修正して、プログラムを簡素化することをお勧めします。

于 2014-02-18T22:01:53.703 に答える
0

私も同じ問題に直面していました。さまざまなバージョンの javamail を試しましたが、うまくいきませんでした。問題は、古いメールキャップ ファイルをロードするデフォルトの Java jdk (私の場合は Java 8) のクラスをTransport.send()使用することでした。MailCapCommandMap

そこで、JAVA の最新バージョンを使用した後、正しい mailcap ファイルをロードしたアクティベーションMailCapCommandMapパッケージから使用しました。

将来誰かが同じ問題に直面した場合は、MailCapCommandMap利用可能なクラスにブレークポイントを追加して、使用しているmailcapファイルを把握してください。

于 2020-08-20T06:27:18.033 に答える