2014/11/13 Yahoo! のアカウントを使用して、SSL/465 で送信テストしました。44行〜46行は、SSL を使用する場合に必要です。587 を使用する場合は必要ありません(587でも送信できています)。また、javamail は当時(2011-09-29/1.4.4)のものを使用してテストしています 最新 javamail は こちら(Oracle)からダウンロードします 環境変数の CLASSPATH に、mail.jar のあるディレクトリを設定して下さい ( コマンドラインのオプションでも指定できます )
import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class Main { // ******************************************* // エントリポイント // ******************************************* public static void main(String[] args) { Main thisClass = new Main(); } // ******************************************* // コンストラクタ // ******************************************* public Main() { super(); my_acton(); } // ******************************************* // 初期処理 // ******************************************* private void my_acton() { MyTool out = new MyTool(">>>"); out.println("処理開始"); // ******************************************* // プロパティオブジェクトを作成 // プロパティオブジェクトは、 // extends Hashtable(連想配列) // ******************************************* Properties props = new Properties(); // ******************************************* // * 連想配列に送信用サーバのアドレスをセット // ******************************************* props.put("mail.smtp.host","smtp.mail.yahoo.co.jp"); // ホスト名またはIPアドレス // props.put("mail.smtp.port","587"); // サブミッションポート props.put("mail.smtp.auth", "true" ); // SMTP 認証を行う props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.socketFactory.fallback", "false"); props.put("mail.smtp.socketFactory.port", "465"); // ******************************************* // メール用のセッションを作成 // ******************************************* SimpleAuthenticator sa = new SimpleAuthenticator("ユーザ","パスワード"); Session MailSession = Session.getInstance( props, sa ); try { // ******************************************* // メール用のメッセージオブジェクトを作成 // ******************************************* MimeMessage msg = new MimeMessage(MailSession); // ******************************************* // 宛先 // ******************************************* msg.setRecipients( Message.RecipientType.TO, "ユーザ@nifty.com" ); // ******************************************* // 送信者 // ******************************************* msg.setFrom( new InternetAddress( "ユーザ@yahoo.co.jp" ) ); // ******************************************* // 件名 // ******************************************* msg.setSubject( MimeUtility.encodeText( "日本語件名", "iso-2022-jp", "B" ) ); // ******************************************* // 本文 // ******************************************* msg.setContent( "本文\n本文", "text/plain; charset=\"iso-2022-jp\"" ); // ******************************************* // 送信 // ******************************************* Transport.send( msg ); } catch (Exception e) { out.println("送信エラー"); } out.println("処理終了"); } // ******************************************* // 内部用クラス // ******************************************* private class MyTool { private String mark = null; MyTool(String pm) { mark = pm; } public void println(String str) { System.out.println( this.mark + str ); } } // *********************************************** // 認証用のプライベートクラス // *********************************************** private class SimpleAuthenticator extends Authenticator { private String user_string = null; private String pass_string = null; public SimpleAuthenticator( String user_s, String pass_s ) { super(); user_string = user_s; pass_string = pass_s; } protected PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication( this.user_string, this.pass_string ); } } }
2011-09-29 に記事を作成した時は、パッケージの中にクリップボードへコピーする為の .exe ファイルを同梱していましたが、昨今 Google Chrome のダウンロードで『危険扱い』されるので、.exe を削除し、現状の Windows で同等の clip.exe を使用するようにしました。 JAVA_BUILD.wsf このスクリプトは、Java のコードをバッチでビルドする為に最適化したものです。実行すると、以下のテキストファイルを参照してビルド環境の整ったコマンドプロンプトを開きます。 __targetPath.txtカレントディレクトリにする場所です。 ここでは、カレントにある javamail というディレクトリで、そこに Main.java があります__buildPath.txtjava の sdk のパスです。 ここでは、C:\Program Files\Java\jdk1.7.0_40\bin となっていますが、自分の環境にあわせて変更する必要があります__classPath.txtCLASSPATH 環境変数にセットする内容です ここでは、.;..\mail.jar となっており、カレントと同梱の mail.jar の場所を示しています
<JOB> <COMMENT> 以下の リソースは、コマンドライン用の環境を設定する為のものです </COMMENT> <RESOURCE id="commandList"> <![CDATA[ mode con: cols=120 set PATH=$BIN;%PATH% set CLASSPATH=$CLASSPATH prompt java$G title Java アプリケーションのビルド ]]> </RESOURCE> <OBJECT id="WshShell" progid="WScript.Shell" /> <OBJECT id="Fso" progid="Scripting.FileSystemObject" /> <OBJECT id="Shell" progid="Shell.Application" /> <SCRIPT language=VBScript> ' ************************************************ ' 処理開始( コマンドラインからビルドする為の ' スクリプトです ) ' ************************************************ strPath = WScript.ScriptFullName Set obj = Fso.GetFile( strPath ) Set obj = obj.ParentFolder WshShell.CurrentDirectory = obj.Path ' ************************************************ ' 任意の引数がある場合は、参照用パスを __targetPath.txt に ' 追加する処理が実行されます ' ************************************************ if Wscript.Arguments.Count <> 0 then ' ダイアログ表示 Set objFolder = Shell.BrowseForFolder( 0, "選択する前に __classPath.txt で" & vbCrLf & "必要な CLASSPATH を設定して下さい", 11, 0 ) ' キャンセル if objFolder is nothing then WScript.Quit end if if not objFolder.Self.IsFileSystem then WScript.Echo "ファイルシステムではありません" WScript.Quit end if ' ************************************************ ' 選択したパスが既に一覧にあるかどうかのチェック ' ************************************************ SelectPath = objFolder.Self.Path Set objHandle = Fso.OpenTextFile( obj.Path & "\__targetPath.txt", 1 ) Flg = false Do While not objHandle.AtEndOfStream sTargetPath = objHandle.ReadLine if UCase( sTargetPath ) = Ucase(SelectPath) then Flg = true Exit Do end if Loop objHandle.Close ' ************************************************ ' 一覧に無かった場合の追加処理 ' ************************************************ if Not Flg then Set objHandle = Fso.OpenTextFile( obj.Path & "\__targetPath.txt", 1 ) AddPath = objHandle.ReadAll ' ************************************************ ' 現在のパス一覧の先頭に追加 ' ※ 仕様により、このパスがカレントディレクトリ ' になります ' ************************************************ AddPath = SelectPath & vbCrLf & AddPath objHandle.Close Set objHandle = Fso.OpenTextFile( obj.Path & "\__targetPath.txt", 2, True ) objHandle.Write AddPath objHandle.Close end if end if ' ********************** ' ビルド対象 ' ********************** Set objHandle = Fso.OpenTextFile( obj.Path & "\__targetPath.txt", 1 ) Do While not objHandle.AtEndOfStream sTargetPath = objHandle.ReadLine if Left( sTargetPath, 1 ) <> ";" and sTargetPath <> "" then Exit Do end if Loop objHandle.Close ' ********************** ' SDK の場所 ' ********************** Set objHandle = Fso.OpenTextFile( obj.Path & "\__buildPath.txt", 1 ) Do While not objHandle.AtEndOfStream sPath = objHandle.ReadLine if Left( sPath, 1 ) <> ";" and sPath <> "" then Exit Do end if Loop objHandle.Close ' ********************** ' CLASSPATH ' ********************** Set objHandle = Fso.OpenTextFile( obj.Path & "\__classPath.txt", 1 ) Do While not objHandle.AtEndOfStream sClassPath = objHandle.ReadLine if Left( sClassPath, 1 ) <> ";" and sClassPath <> "" then Exit Do end if Loop objHandle.Close ' ************************************************ ' 先頭にあるリソースの内容を取得します ' ************************************************ aData = Split( GetInline( "commandList" ), vbCrLf ) ' ************************************************ ' 対象ディレクトリがある場合はそこへ移動して ' コマンドラインで1行目を実行するようにします ' ************************************************ if Trim(sTargetPath) <> "" then strCommand = "cmd.exe /k cd """ & sTargetPath & """ & " & aData(0) else strCommand = "cmd.exe /k " & aData(0) end if ' ************************************************ ' 2行目以降の置き換え用文字列を置き換えます ' ************************************************ For I = 1 to Ubound( aData ) if instr( aData(I), "$BIN" ) > 0 then aData(I) = Replace( aData(I), "$BIN", sPath ) end if if instr( aData(I), "$CLASSPATH" ) > 0 then aData(I) = Replace( aData(I), "$CLASSPATH", sClassPath ) end if strCommand = strCommand & "&" & aData(I) Next ' ************************************************ ' 準備されたコマンドプロンプトを開きます ' ************************************************ Call WshShell.Run( strCommand, 3 ) ' ************************************************ ' 関数(全角スペースを含めたトリム) ' ************************************************ Function GetInline( strName ) GetInline = RegTrim( getResource( strName ) ) & vbCrLf End Function Function RegTrim( strValue ) Dim regEx, str Set regEx = New RegExp regEx.IgnoreCase = True regEx.Pattern = "^[ \s]+" str = regEx.Replace( strValue, "" ) regEx.Pattern = "[ \s]+$" RegTrim = regEx.Replace( str, "" ) End Function </SCRIPT> </JOB>
copy_buildline.wsf 通常実行するビルド用のコマンドラインを、__clipCommand.txt から取り出して、クリップポードにコピーするスクリプトです。JAVA_BUILD.wsf で開いたコマンドブロンプト上で右クリックで貼り付けます 関連する記事 コマンドプロンプトの簡易編集モードのデフォルトを on にする
<JOB> <OBJECT id="WshShell" progid="WScript.Shell" /> <OBJECT id="Fso" progid="Scripting.FileSystemObject" /> <SCRIPT language=VBScript> ' **************************************** ' 処理開始( コマンドラインをクリップボードに ' コピーします ) ' **************************************** strPath = WScript.ScriptFullName Set obj = Fso.GetFile( strPath ) Set obj = obj.ParentFolder WshShell.CurrentDirectory = obj.Path Set objHandle = Fso.OpenTextFile( obj.Path & "\__clipCommand.txt", 1 ) strCommand = "" Do While not objHandle.AtEndOfStream strLine = objHandle.ReadLine if Left( strLine, 1 ) <> ";" and strLine <> "" then strCommand = strCommand & strLine & vbCrLf end if Loop objHandle.Close Set objHandle = Fso.OpenTextFile( obj.Path & "\__clipCommand.tmp", 2, True ) objHandle.Write strCommand Call WshShell.Run( "cmd.exe /c type """ & obj.Path & "\__clipCommand.tmp"" | clip.exe", 0, True ) </SCRIPT> </JOB>
java_start.wsf JAVA_BUILD.wsf と同様にして、テキストファイルより情報を集めて、ビルドが終わったアプリケーションを実行します。 これ専用の __java_start.txt の中に実行用のコマンドを複数行で指定し、コマンドプロンプトでは順次実行させます ここではこうなっていますjava Main pause exit
<JOB> <RESOURCE id="commandList"> <![CDATA[ mode con: cols=120 set PATH=$BIN;%PATH% set CLASSPATH=$CLASSPATH prompt java$G title Java アプリケーションの実行 ]]> </RESOURCE> <OBJECT id="WshShell" progid="WScript.Shell" /> <OBJECT id="Fso" progid="Scripting.FileSystemObject" /> <SCRIPT language=VBScript> ' *********************************************** ' 処理開始( 実行する為のスクリプトです ) ' ●参照 : __buildPath.txt(SDK の場所) ' ●参照 : __classPath.txt(CLASSPATH) ' ●参照 : __java_start.txt(実行コマンド( 複数行可 )) ' *********************************************** strPath = WScript.ScriptFullName Set obj = Fso.GetFile( strPath ) Set obj = obj.ParentFolder WshShell.CurrentDirectory = obj.Path ' ビルド対象 Set objHandle = Fso.OpenTextFile( obj.Path & "\__targetPath.txt", 1 ) Do While not objHandle.AtEndOfStream sTargetPath = objHandle.ReadLine if Left( sTargetPath, 1 ) <> ";" and sTargetPath <> "" then Exit Do end if Loop objHandle.Close Set objHandle = Fso.OpenTextFile( obj.Path & "\__buildPath.txt", 1 ) Do While not objHandle.AtEndOfStream sPath = objHandle.ReadLine if Left( sPath, 1 ) <> ";" then Exit Do end if Loop objHandle.Close Set objHandle = Fso.OpenTextFile( obj.Path & "\__classPath.txt", 1 ) Do While not objHandle.AtEndOfStream sClassPath = objHandle.ReadLine if Left( sClassPath, 1 ) <> ";" and sClassPath <> "" then Exit Do end if Loop objHandle.Close aData = Split( GetInline( "commandList" ), vbCrLf ) if Trim(sTargetPath) <> "" then strCommand = "cmd.exe /k cd """ & sTargetPath & """ & " & aData(0) else strCommand = "cmd.exe /k " & aData(0) end if For I = 1 to Ubound( aData ) if instr( aData(I), "$BIN" ) > 0 then aData(I) = Replace( aData(I), "$BIN", sPath ) end if if instr( aData(I), "$CLASSPATH" ) > 0 then aData(I) = Replace( aData(I), "$CLASSPATH", sClassPath ) end if strCommand = strCommand & "&" & aData(I) Next Set objHandle = Fso.OpenTextFile( obj.Path & "\__java_start.txt", 1 ) Do While not objHandle.AtEndOfStream strLine = objHandle.ReadLine if Left( strLine, 1 ) <> ";" then strCommand = strCommand & "&" & strLine end if Loop objHandle.Close Call WshShell.Run( strCommand, 3 ) ' *********************************************** ' 関数 ' *********************************************** Function GetInline( strName ) GetInline = RegTrim( getResource( strName ) ) & vbCrLf End Function Function RegTrim( strValue ) Dim regEx, str Set regEx = New RegExp regEx.IgnoreCase = True regEx.Pattern = "^[ \s]+" str = regEx.Replace( strValue, "" ) regEx.Pattern = "[ \s]+$" RegTrim = regEx.Replace( str, "" ) End Function </SCRIPT> </JOB>
|
【java : 通信関連の最新記事】
- Java : WEB上のテキストファイルを取得する
- Java11 + Visual Studio Code + JavaMail( with JavaBeans Activation Framework )
- Javamail で IMAP 受信
- OkHttp v3.8.0 jar( と okio 1.13.0.jar ) を Eclipse のプロジェクトに追加して一般的な POST 送信を行う
- java をコマンドプロンプトからビルドして実行するサンプル。( メール送信が初心者には楽しいはず )
- Eclipse + JFace : HttpURLConnection で GET
- Java : バッチでテストする Twiiter API の『検索処理』
- google-gson(Java) を使って、JSON を 定義済みクラスのオブジェクトに一括変換する
- Java : RSS(Document) から、item の中の先頭の指定した要素の値を取得するクラス
- google-gson で、JSON 文字列の構成要素の一覧を取り出す処理
- java : Apache commons-net-3.0.1 を使ってごく自然に FTPS(セキュア) でファイルのアップロード/ダウンロード
- javamail 1.4.4 : IMAP で、ユーザから別のユーザへメッセージを全て(範囲指定で)コピーする
- javamail 1.4.4 : IMAP のメール受信イベントでメールを受け取ったら処理を行う
- Java : WEB 上の XML データの内容を取得する