import java.io.*;
import java.net.*;
public class sendMail
{
public static void main(String [] args)
{
try
{
Socket MailSocket = new Socket((メールサーバのIPアドレス), 25);
BufferdReader BufferIn = new BufferedReader(new InputStreamReader(MailSocket.getInputStream()));
BufferedWriter BufferOut = new BufferedWriter(new OutputStreamWriter(MailSocket.getOutputStream(), "ISO2022JP"));
if(!BufferIn.readLine().startsWith("220"))
System.exit(1);
BufferOut.write("HELO (SMTPクライアントのFQDN)\r\n");
if(!BufferIn.readLine().startsWith("250"))
System.exit(1);
BufferOut.write("MAIL FROM: (送信元メールアドレス)\r\n");
if(!BufferIn.readLine().startsWith("250"))
System.exit(1);
BufferOut.write("RCPT TO: (宛先メールアドレス)\r\n");
if(!BufferIn.readLine().startsWith("250"))
System.exit(1);
BufferOut.write("DATA\r\n");
if(!BufferIn.readLine().startsWith("354"))
System.exit(1);
BufferOut.write("Subject:テスト\r\n\r\n");
BufferOut.write("これはテストメールです。\r\n.\r\n");
if(!BufferIn.readLine().startsWith("250"))
System.exit(1);
BufferOut.write("QUIT\r\n");
if(!BufferIn.readLine().startsWith("221"))
System.exit(1);
BufferOut.flush();
MailSocket.close();
}
catch(Exception e)
{
System.err.println(e);
System.exit(1);
}
}
}
以上のようなプログラムを作ったのですが、「java sendMail」で実行しようとすると、何のエラーも表示されずに止まってしまいます。もちろんメールも送信されていません。(javacは正常にできました。)
どこが悪いのかご指摘ください。よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
APIを使わずにってことですよね。
以前に作ったものを載せて起きますので
参考にしてください。
/*********************************************
* JavaMail (アプリケーション) *
*********************************************/
// ライブラリの利用
import java.net.*;
import java.io.*;
import java.util.*;
/***********************************************************
* Mailクラス *
* Mailクラスは,Mailプログラムの本体です。 *
***********************************************************/
public class JavaMail {
// SMTP接続用ポート番号(25番)
final int intSmtp_Port = 25;
// 送信用サーバ
String strSmtp_Server = "";
// 自分のメールアドレス
String strMy_Email_Addr = "" ;
/***********************************************************************
* sendCommandAndResultCheckメソッド *
* SMTPコマンドをサーバに送信し,返答コードの確認を行います。 *
***********************************************************************/
//SMTPコマンドをサーバに送信し、resultCheckを用いて返答コードを確認する
public void sendCommandAndResultCheck
(Socket smtp, BufferedReader smtp_in,
PrintWriter smtp_out,
String command, int success_code)
throws IOException {
//コマンドの送信
smtp_out.print(command + "\r\n");
/**********************************************
ファイルに対して確実に出力を行うためには,
ストリームのフラッシュを行わなければならない
**********************************************/
smtp_out.flush();
//送信内容の表示
System.out.println("送信内容表示> " + command);
//結果のチェック
resultCheck(smtp, smtp_in, smtp_out, success_code);
}
/***************************************************************
resultCheckメソッド
返答コードをチェックして,エラーならばコネクションを閉じます
***************************************************************/
// resultCheckで返答コードをチェックし、エラーならばコネクションを閉じる
public void resultCheck
(Socket smtp, BufferedReader smtp_in,
PrintWriter smtp_out,
int success_code) throws IOException {
//返答コードの読み取り
String strRes = smtp_in.readLine();
System.out.println("返答コード> " + strRes);
// もし返答コードが期待されるコード(success_code)でなければ・・・
if (Integer.parseInt(strRes.substring(0,3)) != success_code) {
// コネクションを閉じます
smtp.close();
throw new RuntimeException(strRes);
}
}
/*****************************
sendメソッド
SMTPのセッションを進めます
*****************************/
public void send(String subject, String[] to,String[] msgs) throws IOException {
/****************************************
CONNECT
Socketクラスのオブジェクトsmtpを使って、
****************************************/
Socket smtp = new Socket(strSmtp_Server, intSmtp_Port);
//ネットワーク入出力に必要なストリームを作成する
BufferedReader smtp_in = new BufferedReader
(new InputStreamReader(smtp.getInputStream()));
PrintWriter smtp_out = new PrintWriter(smtp.getOutputStream());
//resultCheckメソッドで返答コード(220)をチェックする
resultCheck(smtp, smtp_in, smtp_out, 220);
/**********************************************************
HELOコマンドの送付
getLocalHost,getHostNameで自分のコンピュータ名を取出す
**********************************************************/
String strMyName = InetAddress.getLocalHost().getHostName();
/************************************************
sendCommandAndResultCheckでメールサーバにHELO
コマンドを送付、返答コードをチェック
************************************************/
sendCommandAndResultCheck
(smtp, smtp_in, smtp_out, "HELO " + strMyName, 250);
/*******************************************************
MAIL FROMコマンドの送付
sendCommandAndResultCheckでメールサーバにMAIL FROM
コマンドを送付、返答コードをチェック
*******************************************************/
sendCommandAndResultCheck
(smtp, smtp_in, smtp_out, "MAIL FROM:" + strMy_Email_Addr, 250);
/***************************
RCPT TOコマンドの送付
送先が複数の場合繰返し
***************************/
for (int i = 0; i < to.length; i++) {
// sendCommandAndResultCheckでメールサーバにRCPT TO
sendCommandAndResultCheck(smtp, smtp_in, smtp_out, "RCPT TO:" + to[i], 250);
}
/*********************************************************************
DATAコマンドによるメールの送付
sendCommandAndResultCheckでメールサーバにDATA、Subjectヘッダの送付
*********************************************************************/
sendCommandAndResultCheck(smtp, smtp_in, smtp_out, "DATA", 354);
/***************************************
コマンドを送付、返答コードをチェック
Subjectを送付
***************************************/
smtp_out.print("Subject:" + subject + "\r\n");
System.out.println("送信> " + "Subject:" + subject) ;
//空白を送付
smtp_out.print("\r\n");
/********************************
メッセージ各行の送付
メッセージが複数の場合繰返し
********************************/
for(int i = 0; i<msgs.length - 1; ++i) {
//メッセージmsgsを送付
smtp_out.print(msgs[i]+"\r\n");
System.out.println("送信> " + msgs[i]) ;
}
sendCommandAndResultCheck(smtp, smtp_in, smtp_out, "\r\n.", 250);
/************************************************
QUITコマンドの送付
sendCommandAndResultCheckでメールサーバにQUIT
************************************************/
sendCommandAndResultCheck(smtp, smtp_in, smtp_out, "QUIT", 221);
/**************************************
コネクションのクローズ
コマンドを送付、返答コードをチェック
**************************************/
smtp.close();
}
/*******************************************************************
setAddressメソッド
送信に利用するメールサーバや利用者のメールアドレスをセットします
*******************************************************************/
public void setAddress(){
String strBuf = "" ;
/*******************************************************
* InputStreamReader *
* バイトストリームから文字ストリームへの橋渡し *
*******************************************************/
BufferedReader BufLineread = new BufferedReader(new InputStreamReader(System.in)) ;
boolean blnCnt = true ;
try{
//アドレス入力のループ
while(blnCnt) {
System.out.println("メールサーバのアドレスを入力して下さい") ;
//メールサーバを取得,smtp_serverに格納
strSmtp_Server = BufLineread.readLine() ;
System.out.println("あなたのメールアドレスを入力して下さい") ;
//利用者メールを取得,my_email_addressに格納
strMy_Email_Addr = BufLineread.readLine() ;
System.out.println(" メールサーバのアドレス:" + strSmtp_Server) ;
System.out.println(" あなたのメールアドレス:" + strMy_Email_Addr) ;
System.out.println("以上でよろしいですか?(y/n)") ;
strBuf = BufLineread.readLine() ;
if("y".equals(strBuf)) blnCnt = false ;
}
} catch(Exception e) {
e.printStackTrace();
System.exit(1);
}
}
/********************************
setMsgsメソッド
送信メッセージを取り込みます
********************************/
public String[] setMsgs() {
String strBuf = "" ;
BufferedReader BufLineread = new BufferedReader(new InputStreamReader(System.in)) ;
boolean blnCnt = true ;
Vector msgs_Velist = new Vector();
String[] ArrayMsg = null ;
try {
System.out.println("送信したいメッセージを入力して下さい") ;
System.out.println(" (改行してピリオドで終了)") ;
// メッセージの入力
while(blnCnt) {
//入力したメッセージを一行ことにstrBufに取り込み
strBuf = BufLineread.readLine() ;
//strBufをmsgs_listに格納する
msgs_Velist.addElement(strBuf);
//”.”まで繰り返す
if(".".equals(strBuf)) blnCnt = false ;
}
ArrayMsg = new String[msgs_Velist.size()];
//msgs_listの内容をArrayMsgにコピーする
msgs_Velist.copyInto(ArrayMsg);
} catch(Exception e) {
e.printStackTrace();
System.exit(1);
}
return(ArrayMsg) ;
}
/***********************************************************************
* mainprocメソッド *
* 引数の処理などを行います *
***********************************************************************/
public void mainproc(String[] args){
String strMessage = "JavaMail subject to-address";
String strSubject = "";
Vector Velist = new Vector();
//サブジェクトや宛先の処理
//subject部分をstrSubjectに格納する
strSubject=args[0];
//送信先は一つではないので、ループですべての送信先を格納
for (int i=1; i<args.length; i++) {
//送り先のアドレスをVelistに格納する
Velist.addElement(args[i]);
}
// 入力された引数の文字列へ変換
if (Velist.size() > 0) {
try {
String[] strTo = new String[Velist.size()];
/******************************************************
* copyInto() *
* Vector の要素を、指定された配列にコピーします。 *
******************************************************/
//Velistの中の値を文字列に変換し、toに格納する
Velist.copyInto(strTo);
//メールサーバの情報を取得し、setAddressを呼出し
setAddress() ;
//メッセージを入力させる、msgsに格納する
String[] msgs = setMsgs() ;
// sendメソッドを呼出し、送信する
send(strSubject, strTo, msgs);
} catch(IOException e) {
e.printStackTrace();
}
} else {
System.out.println("Message: " + strMessage);
}
}
/***************************************
mainメソッド
Mailクラスのオブジェクトを生成します
***************************************/
public static void main(String[] args) {
//オブジェクト生成
JavaMail m = new JavaMail() ;
//mainprocメソッドを呼出し、引数リストargsを渡す
m.mainproc(args) ;
}
}
回答ありがとうございます。
さっそく実行してみたところ、スムーズに実行できました!!! これからじっくりと腰を据えて解読していきたいと思っています。
非常に丁寧なプログラムを載せていただき、ありがとうございました。
No.4
- 回答日時:
#02のものです。
flushは最後だけしているようですが、
最後だけでなくコマンド(?)ごとに送らなければ
inputStreamからreadすることができないようです。
とまっているところもたぶんinputstreamのreadだと思いますよ。
sysoutを一行一行いれてみるとわかると思います。
回答ありがとうございます。
おぉぉぉ!!! コマンドごとにflush()を実行してみたところ、見事メールを送信することができました。
なるほどー!!! そういうことだったのですね。
ありがとうございました!!!!
No.1
- 回答日時:
私はjava.netパッケージを使った事がないので、分かりませんが、Javaでメールプログラムを作るときはJavaMailを使用するんじゃないでしょうか?そっちの方が簡単で確かだと思いますが。
。JavaMailについては、以下のURLか書籍などに載っています。
参考URL:http://www.javadrive.jp/javamail/index.html
回答ありがとうございます。
>Javaでメールプログラムを作るときは
>JavaMailを使用するんじゃないでしょうか?
おっしゃるとおりなのですが、今回は事情がありまして、JavaMailを使用しないでメール送信のプログラムを作らなければならないのです。
ですので、申し訳ありませんが「JavaMail抜き」ということでよろしくお願いいたします。
(参考文献拝見しました。今後の参考にさせていただきます。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- MySQL php テーブルを作れない 2 2022/11/17 18:22
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
[JAVA]try 内の変数を外で!?
-
nullcline
-
会員情報登録プログラムの作成...
-
Javaでカレントディレクトリを...
-
java教えてください。
-
EclipseでJava
-
Javaのコマンドライン引数を使...
-
文字列の引き算
-
曜日の取得方法を教えて下さい!
-
構文解析中にファイルの終わり...
-
改行の判定方法
-
ファイル名に変数を使う(Java)
-
JAVA 三角形の判定
-
このjavaのコードのどこが間違...
-
JAVA 文字色変更
-
IF関数でEmpty値を設定する方法。
-
オブジェクトの中のプロパティ...
-
Java 入力した整数値の合計を、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
[JAVA]try 内の変数を外で!?
-
EclipseでJava
-
JAVAのエラーの意味が分かりま...
-
文字列の引き算
-
JAVA 文字色変更
-
改行の判定方法
-
エクセルマクロ文で、赤文字セ...
-
Javaでカレントディレクトリを...
-
JAVAのDouble型の小数点以下の...
-
DOMで要素の値がNULL
-
ファイル名に変数を使う(Java)
-
IPアドレスから組織やプロバイ...
-
Javaのプログラムがどうしても...
-
java int integer
-
java シンボルが見つかりません...
-
javaで判別式のプログラミング...
-
Javaプログラムについて質問で...
-
構文解析中にファイルの終わり...
おすすめ情報