Java アプリケーションから電子メールを送信することは一般的な要件です。コア Java アプリケーション、Web アプリケーション、エンタープライズ Java アプリケーションのいずれで作業しているかは関係ありません。エラーについてサポート スタッフに警告するために電子メールを送信するか、登録時にユーザーに電子メールを送信する必要がある場合があります。パスワードをリセットするか、登録後に電子メール アドレスを確認するよう依頼してください。Java アプリケーションから電子メールを送信する機能が必要になるシナリオは数多くあります。 既製のアプリケーションには、添付ファイル、電子メールの署名やリッチ テキストを含む画像を送信する機能など、電子メールを送信するためのすべての機能と連携するモジュールまたはライブラリがすでにありますが、何かを最初から作成する必要がある場合は、その場合、Java Mail API は優れたオプションです。この記事では、メール API ( javax.mail )を使用して Java アプリケーションから電子メールを送信する方法を学習します。コードを記述する前に、電子メールがどのように機能するかについていくつかの基本を理解しておく必要があります。たとえば、SMTP (Simple Mail Transfer Protocol)サーバーが必要です。Linux 上で Java アプリケーションを実行している場合は、SMTP デーモンがポート25を使用することを知っておく必要があります。Java を使用してメッセージを送信するには、GMail、Yahoo、その他のサービス プロバイダーなどのパブリック メール サーバーを含む任意のメール サーバーを使用できます。必要なのは、ホスト名、ポート、接続パラメータなどのSMTP サーバーの詳細です。SSL ( Secure Sockets Layer ) やTLS ( Transport Layer Security )を使用して電子メールを安全に接続して送信することもできますが、この例はシンプルにして、Java アプリケーションからレターを送信するための最小限のロジックに焦点を当てました。今後の記事では、添付ファイルを使用してメールを送信する方法、HTML 形式のメールを送信する方法、メールに画像を添付する方法、SSL 認証を使用して GMail サーバーに接続してメールを送信する方法などを学習します。ここで、この単純なJava Mail API の例を理解 (議論) してみましょう。
電子メールを送信するための Java コードの例
Java プログラムからレターを送信するには、 Java Mail APIとJava Activation Framework (JAF)が必要です。より正確には、mail-1.4.5.jar、smtp-1.4.4.jar、およびactivity-1.1.jarが必要になります。このプログラムを実行するには、これらの JAR ファイルをダウンロードし、クラスパスに含める必要があります。あるいは、依存関係の管理に Maven を使用し、そこにすべての依存関係を含めることもできます。これらの JAR ファイルをすべて入手したら、以下の手順に従って Java を使用して電子メールを作成し、送信します。-
Session
を呼び出してオブジェクトを作成しますSession.getDefaultInstance(properties)
。properties
- には、SMTP サーバーのホスト名など、すべての重要なプロパティが含まれます。 -
前の手順で取得した
MimeMessage
オブジェクトを渡してオブジェクトを作成します。Session
このオブジェクトには、電子メール受信者、件名、メッセージ本文、添付ファイルなどのさまざまなプロパティのセットがあります。 -
これを使用して
javax.mail.Transport
、静的メソッドを呼び出して電子メールを送信しますsend(email)
。電子メールはオブジェクトにすることができますMimeMessage
。
Session
、SMTP サーバーのタイプによって異なります。たとえば、認証を必要としない SMTP サーバーを使用している場合は、Session
smtp などのプロパティを 1 つだけ持つオブジェクトを作成できます。 .mail.host ですが、デフォルトでポート 25 が設定されているため、ポートを指定する必要はありません。一方、GMail の SMTP ホストなど、TLS または SSL 認証を必要とする SMTP サーバーに接続している場合は、TLS とメール用に mail.smtp.port=547 など、もう少し多くのプロパティを指定する必要があります。 SSL の場合は smtp.port= 457。これは、認証なしで標準 SMTP サーバーに接続し、Java Mail API を使用してテキスト メッセージを送信する完全な Java プログラムです。
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/**
* Java Program to send text mail using default SMTP server and without authentication.
* You need mail.jar, smtp.jar and activation.jar to run this program.
*
* @author Javin Paul
*/
public class EmailSender{
public static void main(String args[]){
String to = "receive@abc.om"; // sender email
String from = "sender@abc.com"; // receiver email
String host = "127.0.0.1"; // mail server host
Properties properties = System.getProperties();
properties.setProperty("mail.smtp.host", host);
Session session = Session.getDefaultInstance(properties); // default session
try {
MimeMessage message = new MimeMessage(session); // email message
message.setFrom(new InternetAddress(from)); // setting header fields
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject("Test Mail from Java Program"); // subject line
// actual mail body
message.setText("You can send mail from Java program by using mail API, but you need" +
"couple of more JAR files e.g. smtp.jar and activation.jar");
// Send message
Transport.send(message); System.out.println("Email Sent successfully....");
} catch (MessagingException mex){ mex.printStackTrace(); }
}
}
出力: このプログラムをコンパイルして実行すると、Java プログラムから簡単な電子メールを送信できます。
$ javac EmailSender.java
$ java EmailSender
電子メールは正常に送信されました.... ご覧のとおり、Java プログラムから電子メールを送信するのは非常に簡単です。オブジェクトを作成したら、受信者を追加する必要があります。受信者は、、、、MimeMessage
で指定できます。受信者の指定が完了したら、レターの件名を指定し、最後にメソッドを呼び出してレター自体の内容を指定する必要があります。複数のメール送信を行う場合は、次の方法を使用して受信者を指定できます。 TO
CC
BCC
message.setText()
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
TO
を使用して フィールドにユーザーを追加し、 を使用してMessage.RecipientType.TO
フィールドに追加し、-を使用してユーザーを追加できます。 CC
Message.RecipientType.CC
BCC
Message.RecipientType.BCC
エラーと例外
多くの Java プログラマーが初めて電子メールを送信するプログラムを書き始めると、エラーに遭遇します。これは、Java アプリケーションから電子メールを送信するには、mail.jar とactivation.jar だけで十分だと考えているためですが、実際はそうではありません。特に Linux のローカル SMTP サーバー経由で電子メールを送信する場合はそうです。CLASSPATH に mail.jar と activity.jar のみを指定してこのプログラムを実行すると、このエラーが発生する可能性が高くなります。例外 1:
com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 25; timeout -1;
nested exception is:
java.net.ConnectException: Connection refused: connect
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1984)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:656)
at javax.mail.Service.connect(Service.java:345)
at javax.mail.Service.connect(Service.java:226)
at javax.mail.Service.connect(Service.java:175)
at javax.mail.Transport.send0(Transport.java:253)
at javax.mail.Transport.send(Transport.java:124)
at Testing.main(Testing.java:62)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579) at java.net.Socket.connect(Socket.java:528)
at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:301)
at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:229)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1950)
... 7 more
このエラーの解決策は非常に簡単ですが、混乱する可能性があります。java.net.ConnectException: Connection refused: connect
通常、サーバーが動作していない場合、または接続先のポートが正しく指定されていない場合にクラッシュします。解決策: mail-1.4.5.jar に加えて、smtp-1.4.4.jar と activity-1.1.jar も必要です。
例外 2:
これは と呼ばれる別のエラーでNoClassDefFoundError
、通常はクラスパスに JAR ファイルが存在しないことを指します。
Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/MessagingException
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2521)
at java.lang.Class.getMethod0(Class.java:2764)
at java.lang.Class.getMethod(Class.java:1653)
at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: javax.mail.MessagingException
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
解決策:問題はなんとか解決できました。原因はクラスパスが間違っていたためです。必要な 3 つの JAR とプログラムの Java クラス ファイルをすべて同じディレクトリに配置し、そこからプログラムを実行したにもかかわらず、Java はそれを認識できませんでした。次のコマンドを試したところ、プログラムは正常に動作しました。
java -cp mail-1.4.5.jar:smtp-1.4.4.jar:activation-1.1.jar:. JavaMailSender
電子メールは正常に送信されました。現在のディレクトリには、クラスパス引数の末尾にドットが付いていることに注意してください。Linux でプログラムを実行していたので、(Windows の場合のように) セミコロン (;) の代わりにコロン (:) を使用しました。メール API を使用して Java アプリケーションから電子メールを送信する方法については以上です。必要な JAR ファイルは 3 つだけなので、これは非常に簡単だと思われるかもしれません。Gradle または Maven を使用して依存関係を管理すると、はるかに簡単になります。次のチュートリアルでは、レポートや表を送信するための、添付ファイル付きの電子メール、画像付きの電子メール、および美しくフォーマットされた電子メールを送信する Java Mail API のより複雑な例を見ていきます。記事の翻訳: Java プログラムから電子メールを送信する方法と例
GO TO FULL VERSION