34

Email.java に送信

package helper;

//Mail.java - smtp sending starttls (ssl) authentication enabled
//1.Open a new Java class in netbeans (default package of the project) and name it as "Mail.java"
//2.Copy paste the entire code below and save it.
//3.Right click on the file name in the left side panel and click "compile" then click "Run"

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public class sendToEmail
{
    String  d_email = "sample@gmail.com",
     d_password = "mysamplepassword",
     d_host = "smtp.gmail.com",
     d_port  = "465",
     //m_to = "sample@yahoo.com",
     m_subject = "trial",
     m_text = "Hey, this is the testing email.";

    public sendToEmail(String strEmailAddress)
    {


        Properties props = new Properties();
        props.put("mail.smtp.user", d_email);
        props.put("mail.smtp.host", d_host);
        props.put("mail.smtp.port", d_port);
        props.put("mail.smtp.starttls.enable","true");
        props.put("mail.smtp.auth", "true");
        //props.put("mail.smtp.debug", "true");
        props.put("mail.smtp.socketFactory.port", d_port);
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");

        SecurityManager security = System.getSecurityManager();

        try
        {
            Authenticator auth = new SMTPAuthenticator();
            Session session = Session.getInstance(props, auth);
            //session.setDebug(true);

            MimeMessage msg = new MimeMessage(session);
            msg.setText(m_text);
            msg.setSubject(m_subject);
            msg.setFrom(new InternetAddress(d_email));
            msg.addRecipient(Message.RecipientType.TO, new InternetAddress(strEmailAddress));
            Transport.send(msg);
        }
        catch (Exception mex)
        {
            mex.printStackTrace();
        } 
    }

    public class SMTPAuthenticator extends javax.mail.Authenticator
    {
        public PasswordAuthentication getPasswordAuthentication()
        {
            return new PasswordAuthentication(d_email, d_password);
        }
    }
}

私のcontroller.javaの一部

/* Send to Email will run properly soon */
            sendToEmail email = new sendToEmail(strEmailAddress);

Web アプリケーションを実行すると、次のようなエラー メッセージが表示されました。

タイプ例外レポート

メッセージ

サーバーで内部エラー () が発生したため、この要求を実行できませんでした。

例外 javax.servlet.ServletException: サーブレットの実行で例外がスローされました

根本的な原因 java.lang.NoClassDefFoundError: javax/mail/Authenticator controller.RegisterTenantController.doPost(RegisterTenantController.java:108) javax.servlet.http.HttpServlet.service(HttpServlet.java:709) javax.servlet.http.HttpServlet.service (HttpServlet.java:802)

私は今何をしますか?この Web アプリケーションを成功させるために誰か助けてもらえますか?

4

7 に答える 7

51

2 つの jar を WEB-INF/lib ディレクトリまたは webapp (またはサーバーの lib ディレクトリ) に追加する必要があります。

于 2009-10-27T11:09:29.530 に答える
27

これはクラスパスにない jar ファイルが原因である可能性がありますが、そうでない場合もあります。

この場合、2 つまたは 3 つの異なる例外を頭の中に入れておくことが重要です。

  1. java.lang.ClassNotFoundException この例外は、クラスパスでクラスが見つからなかったことを示します。これは、クラス定義をロードしようとしていて、そのクラスがクラスパスに存在しなかったことを示しています。

  2. java.lang.NoClassDefFoundError この例外は、JVM が内部クラス定義データ構造でクラスの定義を探したが、見つからなかったことを示します。これは、クラスパスからロードできなかったということとは異なります。通常、これは、以前にクラスパスからクラスをロードしようとしたが、何らかの理由で失敗したことを示しています。今は再試行していますが、以前にロードに失敗したため、ロードしようとさえしません。以前の障害は、ClassNotFoundExceptionまたはExceptionInInitializerError(静的初期化ブロックでの障害を示す)、またはその他のさまざまな問題である可能性があります。要点は、 aNoClassDefFoundErrorは必ずしもクラスパスの問題ではないということです。

のソースを見javax.mail.Authenticatorて、それが静的初期化子で何をしているのかを確認します。(もしあれば、静的変数の初期化と静的ブロックを見てください。) のClassNotFoundException前に を取得していない場合はNoClassDefFoundError、静的初期化の問題であることがほぼ保証されます。

hosts ファイルが localhost アドレスを誤って定義し、静的初期化ブロックが に依存している場合、同様のエラーが頻繁に発生しますInetAddress.getLocalHost()。127.0.0.1 は 'localhost' (およびおそらく localhost.localdomain) を指す必要があります。マシンの実際のホスト名を指すべきではありません (ただし、何らかの理由で、多くの古い RedHat Linux インストーラーは誤って設定することを好んでいました)。

于 2009-10-27T16:08:43.110 に答える
22

あなたのmaven依存関係に以下を追加してください

    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.5</version>
    </dependency>

    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
于 2012-08-13T23:29:53.433 に答える
8

私はかつてこの状況に遭遇し、クラスパスに依存関係がありました。解決策は、コンテナー (例: tomcat) の lib フォルダーに javax.mail および javax.activation ライブラリを含めることでした。maven を使用して、それらを提供されたスコープに設定すると、機能するはずです。すべてのプロジェクトのクラスパスで電子メール ライブラリを共有します。

有用なソース: http://haveacafe.wordpress.com/2008/09/26/113/

于 2011-09-13T23:29:31.143 に答える