ジャカルタメール

Jakarta Mail(旧称JavaMail)は、SMTPPOP3IMAP経由でメールを送受信するためのJakarta EE APIです。Jakarta MailはJakarta EEプラットフォームに組み込まれていますが、 Java SEで使用するためのオプションパッケージも提供しています。[ 1 ]

現在のバージョンは2.1.3で、2024年2月29日にリリースされました。[ 2 ]別のオープンソースのJakarta Mail実装(GNU JavaMail)も存在し、これは廃止されたJavaMail 1.3仕様のみをサポートしていますが、唯一の無料のNNTPバックエンドを提供しており、この技術を使用してニュースグループの記事を読んだり送信したりすることができます。

2019年現在、このソフトウェアはJakarta Mailとして知られており、Jakarta EEブランド(旧称Java EE)の一部です。リファレンス実装はEclipse Angusプロジェクトの一部です。

操作に必要な関連プロジェクトの Maven 座標は次のとおりです。

  • メールAPI:jakarta.mail:jakarta.mail-api:2.1.3
  • メール実装: org.eclipse.angus:angus-mail:2.0.3
  • マルチメディア拡張機能: jakarta.activation:jakarta.activation-api:2.1.3

ライセンス

Jakarta MailはEclipse.orgオープンソースプロジェクトとしてホストされており、新しい名前はJakarta Mailです。[ 3 ]

Jakarta Mail のソースコードのほとんどは、以下のライセンスの下でライセンスされています。

  • EPL-2.0
  • GPL-2.0(クラスパス例外ライセンス付き)
  • デモプログラムのソースコードはBSDライセンスに基づいてライセンスされています。

パッケージorg.wikipedia.examples ;java.time.Clockをインポートします。java.time.LocalDateTimeをインポートします。java.time.ZoneOffsetインポートします。java.util.Dateインポートします。java.util.Propertiesインポートしますjakarta.mail.Messageをインポートします。jakarta.mail.MessagingExceptionインポートします。jakarta.mail.Sessionインポートします。jakarta.mail.Transportインポートします。jakarta.mail.internet.InternetAddressインポートします。jakarta.mail.internet.MimeMessageインポートします// 単純な、単一部分のテキスト/プレーン電子メールを送信します。public class TestEmail { static Clock clock = Clock . systemUTC ();パブリック静的void main 文字列[]引数{// ここでメールアドレスを置き換えますString to = "sendToMailAddress" ; String from = "sendFromMailAddress" ; // ここで ISP メールサーバーを置き換えますString host = "smtp.yourisp.invalid" ;// プロパティを作成し、セッションプロパティを取得します。props = new Properties ();// 静的 Transport.send() を使用する場合、 //送信先のホストを指定する必要がありますprops.put ( "mail.smtp.host" host ); //舞台裏で何が起こっているか確認するにはprops.put ( "mail.debug" " true" ); Session session = Session.getInstance ( props ) ;try { // メッセージをインスタンス化しますMessage msg = new MimeMessage ( session );//メッセージ属性を設定しますmsg.setFrom ( new InternetAddress ( from ) ) ; InternetAddress [ ] address = { new InternetAddress ( to ) } ; msg.setRecipients ( Message.RecipientType.TO , address ) ; msg.setSubject ( " Test E - Mail through Java " ) ; Date now = Date.from ( LocalDateTime.now ( clock ) .toInstant ( ZoneOffset.UTC ) ) ; msg.setSentDate ( now ) ;// メッセージの内容を設定しますmsg . setText ( String . format ( "これは、Java を介してプレーンテキストの電子メールを送信するテストです。\%nここが 2 行目です。" );// メッセージを送信します。Transport.send ( msg ) ; } catch ( MessagingException e ) { //ネストされた(連鎖された)例外もすべて出力します。mex.printStackTrace ( ) ; }} } }

マルチパートメール、HTMLメール、ファイル添付を送信するためのサンプルコード

パッケージorg.wikipedia.examples ;java.io.ByteArrayInputStreamをインポートします。java.io.IOExceptionをインポートします。java.text.MessageFormatをインポートします。java.time.Clockインポートします。java.time.LocalDateTimeインポートします。java.time.ZoneOffsetをインポートします。java.util.Dateをインポートします。java.util.Propertiesインポートますjakarta.activation.DataHandlerをインポートしますjakarta.activation.DataSourceをインポートしますインポートjakarta.activation.FileDataSource ; jakarta.mail.Messageをインポートしますインポートjakarta.mail.MessagingException ; jakarta.mail.Multipartをインポートしますjakarta.mail.Sessionをインポートしますjakarta.mail.Transportをインポートしますインポートjakarta.mail.internet.InternetAddress ; jakarta.mail.internet.MimeBodyPartをインポートしますjakarta.mail.internet.MimeMultipartをインポートしますパブリッククラスSendMailUsage { static Clock clock = Clock . systemUTC ();パブリック静的void main 文字列[]引数{// ここで電子メール アドレスを置き換えますString to = "sendToMailAddress" ; String from = "sendFromMailAddress" ; // ここで ISP メール サーバーを置き換えますString host = "smtpserver.yourisp.invalid" ;// セッションのプロパティを作成します。Properties props = new Properties ( );// 静的な Transport.send() を使用する場合、// ここでメール サーバーを指定する必要がありますprops.put ( "mail.smtp.host" , host ); // 舞台裏で何が起こっているかを確認するには、 props.put ( " mail.debug " , " true" );// セッションを取得するSession session = Session.getInstance ( props ) ;try { // 電子メールを送信するためのトランスポートオブジェクトを取得します。Transport bus = session.getTransport ( " smtp " );// ここでは 1 回だけ接続します// Transport.send() は送信ごとに切断します// 通常、SMTP にはユーザー名とパスワードは必要ありませんbus . connect (); // bus.connect("smtpserver.yourisp.net", "username", "password");// メッセージをインスタンス化します。Message msg = new MimeMessage ( session ) ;// メッセージ属性を設定しますmsg.setFrom ( new InternetAddress ( from ) ) ; InternetAddress [ ] address = { new InternetAddress ( to ) }; msg.setRecipients ( Message.RecipientType.TO , address ) ; //カンマで区切らメール アドレスのリストを解析します。厳密にしてください。msg.setRecipients ( Message.RecipientType.CC , InternetAddress.parse ( to , true ) ); //カンマ/スペース区切らリストを解析します。緩めてくださいmsg.setRecipients ( Message.RecipientType.BCC , InternetAddress.parse ( to , false ) ) ;msg . setSubject ( "Java による電子メールのテスト" ); msg . setSentDate ( Date . from ( LocalDateTime . now ( clock ). toInstant ( ZoneOffset . UTC )));//メッセージの内容設定して送信します。setTextContent ( msg ) ; msg.saveChanges (); bus.sendMessage ( msg , address );setMultipartContent ( msg ) ; msg.saveChanges ( ) ; bus.sendMessage ( msg , address ) ;setFileAsAttachment ( msg , "C:/WINDOWS/CLOUD.GIF" ); msg . saveChanges (); bus . sendMessage ( msg , address );setHTMLContent ( msg ) ; msg.saveChanges ( ) ; bus.sendMessage ( msg , address ) ;バス.close ( );} catch ( MessagingException e ) { // ネストされた(連鎖された)例外もすべて出力しますe . printStackTrace (); // ネストされた例外にアクセスする方法while ( e . getNextException () != null ) { // 連鎖内の次の例外を取得しますException ex = e . getNextException () ; ex . printStackTrace (); if ( ! ( ex instanceof MessagingException )) { break ; } else { e = ( MessagingException ) ex ; } } } }// シンプルな、単一パートのテキスト/プレーン メール。public static void setTextContent ( Message msg ) throws MessagingException { // メッセージ コンテンツを設定しますString mytxt = String . format ( "これは、Java を介してプレーン テキストの電子メールを送信するテストです。%nここが 2 行目です。" ); msg . setText ( mytxt );// 代替形式msg . setContent ( mytxt , "text/plain" );}// シンプルなマルチパート/混合メール。本文は両方とも text/plain です。public static void setMultipartContent ( Message msg ) throws MessagingException { //最初の部分を作成し、入力します。MimeBodyPart p1 = new MimeBodyPart ( ) ; p1 . setText ( "これはテスト用マルチパートメールのパート1です。" );// 2 番目の部分を作成して入力しますMimeBodyPart p2 = new MimeBodyPart (); // テキスト コンテンツに文字セットを設定する方法は次のとおりですp2 . setText ( "This is the second part" , "us-ascii" );// マルチパートを作成します。BodyParts を追加します。Multipart mp = new MimeMultipart ( ) ; mp . addBodyPart ( p1 ) ; mp . addBodyPart ( p2 ) ;// メッセージのコンテンツとしてマルチパートを設定しますmsg . setContent ( mp ); }// ファイルを添付ファイルとして設定します。JAF FileDataSource を使用します。public static void setFileAsAttachment ( Message msg , String filename ) throws MessagingException {// 最初の部分を作成して入力しますMimeBodyPart p1 = new MimeBodyPart (); p1 . setText ( "これは、テストのマルチパート電子メールの第 1 部です。第 2 部は添付ファイルです" );// 2 番目の部分を作成します。MimeBodyPart p2 = new MimeBodyPart ();// 2 番目の部分にファイルを配置します。FileDataSource fds = new FileDataSource ( filename ); p2 . setDataHandler ( new DataHandler ( fds )); p2 . setFileName ( fds . getName ());// マルチパートを作成します。BodyPartsを追加します。Multipart mp = new MimeMultipart ( ) ; mp . addBodyPart ( p1 ) ; mp . addBodyPart ( p2 ) ;// メッセージのコンテンツとしてマルチパートを設定しますmsg . setContent ( mp ); }// 単一部分の HTML コンテンツを設定します。//任意のタイプのデータの送信も同様です。public static void setHTMLContent ( Message msg ) throws MessagingException {String html = String . format ( "<html><head><title>{0></title></head><body><h1>{0></h1><p>これは、Java を介して HTML 電子メールを送信するテストです。</body></html>" msg . getSubject () 、msg . getSubject () );// HTMLDataSource は静的なネストされたクラスですmsg . setDataHandler ( new DataHandler ( new HTMLDataSource ( html ))); }/*  * HTML 電子メール コンテンツを送信するための JAF データ ソースとして機能する静的ネスト クラス */ static class HTMLDataSource implements DataSource { private String html ;パブリックHTMLDataSource (文字列htmlString ) { html = htmlString ; }// InputStream に HTML 文字列を返します。//毎回新しいストリームを返す必要があります。public InputStream getInputStream () throws IOException { if ( html == null ) { throw new IOException ( " Null HTML " ) ; } return new ByteArrayInputStream ( html . getBytes ()); }public OutputStream getOutputStream ()はIOExceptionをスローします{ throw new IOException ( "この DataHandler は HTML を書き込めません" ); }パブリック文字列getContentType () { "text/html"を返します; }public String getName () { return "電子メールのみを送信するためのJAF text/html dataSource" ; } } }

参考文献

  1. ^ 「JavaEEの包含」 。 2014年11月12日閲覧
  2. ^ 「ジャカルタメールホームページ」 。 2023年9月5日閲覧
  3. ^ 「Jakarta Mail」 . 2019年9月3日閲覧