• 締切済み

Javaを使用して定時送信をしたい

Javamailを用いて、プログラムを実行することでメールを送ることには成功しました。 ここからが本題なのですが、 プログラムをループさせたままにして、 Javaで時刻を指定して(何時何分、というように) メールを送信することは出来るのでしょうか。 一日につき5回程送りたいと思っています。 CalenderやDateを使用することも考えたのですが、 上手くループせず定時の送信は出来ませんでした。 ちなみに作ったものがこちらです↓ package mailSend; import java.io.IOException; import java.util.Calendar; import java.util.Date; import javax.mail.MessagingException; import javax.mail.internet.AddressException; public class MailXML { public static void main(String[] args) throws AddressException, MessagingException, IOException{ Calendar cal = Calendar.getInstance(); while(true){ int hournow = cal.get(Calendar.HOUR_OF_DAY); int minnow = cal.get(Calendar.MINUTE); System.out.println(hournow + ":"+ minnow); while(hournow == 1 && minnow == 25 ){ Mail.gatemsg(); Mail.roommsg(); break; } } } } メールの送り先と内容はいつも同じです。 ループする(1回/分)ごとに上手くhournow()とminnnow()が更新されればよいのですが…。 そもそものやり方がおかしいのか、小さな勘違いをしているだけなのかもわかりません。 どなたか解決方法をお願いします。

  • Java
  • 回答数3
  • ありがとう数0

みんなの回答

  • teketon
  • ベストアンサー率65% (141/215)
回答No.3

OSのスケジューラを使うのは他の方が述べているので、あえてJavaで import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class Test{ public static void main(String[] args){ //現在時間を表示するtask TimerTask task = new TimerTask() { @Override public void run() { System.out.println(now()); } }; Timer timer = new Timer(); //今から5秒間隔でtaskを実行する timer.schedule(task, now(), 5*sec()); } //現在日時取得用 static Date now(){ return new Date(); } //ミリ秒の秒へ変換用 static long sec(){ return 1000; } }

参考URL:
http://www.atmarkit.co.jp/fjava/javatips/078java008.html
  • t_ohta
  • ベストアンサー率38% (5069/13245)
回答No.2

cron を使ってメール送信プログラムを定時起動すれば、メール送信プログラムで時刻管理をしなくて済むでしょう。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

確かに Calendar.getInstance() で現在の時刻を取得できます。しかし、それで取得した時刻が自動的に現在時刻に更新されるわけではありません。 とりあえず、Calendar.getInstance() をループの中に入れればたぶんうまくいくでしょう。 ……が、自分ならメールを一回送るだけのプログラムを作って、定時実行の方は OS の機能でやらせます。Windows ならタスクスケジューラ、UNIX 系なら……何だったっけ? とにかく定時に特定のプログラムを実行させる機能があるはずです。

関連するQ&A

  • Javaによる現在時刻の表示について

    Javaで現在時刻を表示するプログラムを作りました。 今のままだと 2009/8/26(木) 15:8:7となり、 月日・時間分秒が一桁のときは前に0をつけて二桁(15:08:07のように)表示にしたいと思います。 何かいい方法はないでしょうか? if文で作成するとなると、かなりたくさんのコードを書かないといけない気がします。 良い案があれば是非ご教授頂ければと思います。 import java.util.Calendar; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Servlet_106 extends HttpServlet{ public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException{ res.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = res.getWriter(); String title = "現在時刻:"; Calendar cal = Calendar.getInstance(); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; int day = cal.get(Calendar.DATE); StringBuffer dow = new StringBuffer(); switch (cal.get(Calendar.DAY_OF_WEEK)){ case Calendar.SUNDAY: dow.append("日"); break; ~~~(略)~~~ } int hour = cal.get(Calendar.HOUR_OF_DAY); int minute = cal.get(Calendar.MINUTE); int second = cal.get(Calendar.SECOND); out.println("<html lang=\"ja\">"); out.println("<head><title></title></head>"); out.println("<body>"); out.println("<p>現在時刻:" + year + "/" + month + "/" + day + "(" + dow + ")" + hour + ":" + minute + ":" + second + "</p>"); out.println("</body></html>"); out.close(); } }

    • ベストアンサー
    • Java
  • java コマンドライン引数を利用したカレンダー

    args[0]に例えば200805と入れたら2008年5月のカレンダーが表示される、そんなプログラムを書きたいと思っています。 理想は↓の形です。(_は空欄の意です;) 2008年5月 日 月 火 水 木 金 土 ___________1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 importは使わないよう指示が出ていますので、フルネームでカレンダークラスを記載しています。 public class CalShow { public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ java.util.Calendar cal = java.util.Calendar.getInstance(); //コマンドライン引数の前4桁をyear、 int year = Integer.parseInt(args[0].substring(0, 4)); //後ろ2桁をmonthとしてそれぞれintで定義 int month = Integer.parseInt(args[0].substring(4)); System.out.println( year + "年" + month + "月"); System.out.println(" 日 月 火 水 木 金 土"); cal.set(year, month - 1, 1); int startDay = cal.get(java.util.Calendar.DAY_OF_WEEK); cal.add(java.util.Calendar.MONTH, 1); cal.add(java.util.Calendar.DATE, -1); int lastDay = cal.get(java.util.Calendar.DATE);      /*なんとなくここまで書けたのですが、ここからどのように木曜日と1日を繋げていけばよいのか分からなくて困っています。 どういったメソッドを使えばいいのかなど、どなたか教えていただけませんでしょうか? よろしくお願いいたします。*/ } }

    • ベストアンサー
    • Java
  • JAVAサーブレットプログラミングで質問

    Javaの開発環境: J2SDK、Tomcat3.3.1を使用しています。 ***プログラミング内容*** import java.io.*; import java.util.*; import java.text.*; import javax.servlet.*; import javax.servlet.http.*; public class MyDate extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException,ServletException{ response.setContentType("text/html; charset=SJIS"); Calendar cdr = Calendar.getInstance(); //現在の時間を取得 int year = cdr.get(Calendar.YEAR); //年(西暦) int month = cdr.get(Calendar.MONTH) + 1; //月 int date = cdr.get(Calendar.DATE); //日 int hour = cdr.get(Calendar.HOUR); //時間 int minute = cdr.get(Calendar.MINUTE); //分 int second = cdr.get(Calendar.SECOND); //秒 PrintWriter pw = response.getWriter(); pw.println("<html><body>今日は" + year + "年" + month + "月"+ date + "日(" + ★ + ")曜日です<br>\n" + "時間は" + hour + "時" + minute + "分" + second + 秒です</body></html>\n");}} といった内容で、取得したい値は日付と時間を取得するプログラミングなんですが、曜日の取得の方法を教えてもらえないでしょうか?取得した日付と時間の表示方法は、 日付: 2002年10月12日 時間: PM8時18分41秒です… といった感じを目指しています。

    • ベストアンサー
    • Java
  • java Calendar作成

    javaでのカレンダー作成についての質問です。 表示イメージ(_はすべて半角スペースの意です) year年month月(今回は2016年04月) _日_月_火_水_木_金_土 _______________1__2_ _3__4__5__6__7__8__9_ 10_11_12_13_14_15_16_ 17_18_19_20_21_22_23_ 24_25_26_27_28_29_30_ public class CalShow { public static void main(String[] args) { java.util.Calendar cal = java.util.Calendar.getInstance(); int year = Integer.parseInt(args[0].substring(0, 4)); int month = Integer.parseInt(args[0].substring(4)); cal.set(java.util.Calendar.YEAR, year); cal.set(java.util.Calendar.MONTH, month - 1); cal.set(java.util.Calendar.DAY_OF_MONTH, 1); //日曜日=1で土曜日=7まで int week = cal.get(java.util.Calendar.DAY_OF_WEEK); //月末日 int lastDay = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH); System.out.println( year + "年" + month + "月"); System.out.println("_日_月_火_水_木_金_土"); //日付のない日数分回す for (int i = 1; i < week ; i ++) { System.out.print("___(半角3マス)"); } String empty; //1日から月末日まで、カレンダーを表示する for (int day = 1 ; day <= lastDay ; day ++) { empty = ""; if (day < 10) { empty = "_"; } System.out.print( empty + day + "_"); ●if ( == java.util.Calendar.SATURDAY) { System.out.println(""); } } } } ●部分で土曜日なら改行、としたいのですが、 上でint weekで土曜日=7と判明しているため、 if ( week == java.util.Calendar.SATURDAY) { とか if ( day % 7 == java.util.Calendar.SATURDAY) { など色々考え付くものを書き込んでいるのですが全く上手く動作しません。 どうしたらよいのかご教授お願いいたします・・・;;

    • ベストアンサー
    • Java
  • java.util.Dateについて

    まずは下記ソースを参照してください。 import java.util.Date; import java.util.GregorianCalendar; import java.util.Calendar; public class Test{     public static void main( String args[] ){         GregorianCalendar cal = new GregorianCalendar(2004, 5, 31);         System.out.println("年:" + cal.get(Calendar.YEAR));         System.out.println("月:" + cal.get(Calendar.MONTH));         System.out.println("日:" + cal.get(Calendar.DAY_OF_MONTH));         System.out.println(); // ただの改行         System.out.println("比較:" + new Date().compareTo(cal.getTime()));     } } 上記ソースについて質問です。 1.「年」「月」「日」を表示しておりますが、本来ならば 「年:2004」 「月:5」 「日:31」 と表示されると思っておりましたが実際は、 「年:2004」 「月:6」 「日:1」 と表示されてしまいます。 なぜでしょうか? 2.12行目にてjava.util.DateクラスのcompareToメソッドを用いて、 現在日付(2004/5/28)と7行目で指定している日付の比較をしていますが、 7行目で設定している日付を現在日付よりも前後に設定して実行させても、 「-1」しか返りません。 なぜでしょうか? 環境は、 J2SDK:1.4.2 OS:Windows XP Pro です。

    • ベストアンサー
    • Java
  • javaのカレンダー作成について

    コマンドライン引数で渡された6桁の数字をカレンダーに起こすプログラムを作成しています。 以下のように書きました。 ↓ public class Calendar { public static void main(String[] args) { java.util.Calendar cal = java.util.Calendar.getInstance(); int year = Integer.parseInt(args[0].substring(0, 4)); int month = Integer.parseInt(args[0].substring(4)); cal.set(java.util.Calendar.YEAR, year); cal.set(java.util.Calendar.MONTH, month - 1); cal.set(java.util.Calendar.DAY_OF_MONTH, 1); int week = cal.get(java.util.Calendar.DAY_OF_WEEK); //日曜始まり一週間のセット作成 int weekset = 0; if (week == cal.SUNDAY) { weekset = 0; } else if (week == cal.MONDAY) { weekset = 1; } else if (week == cal.TUESDAY) { weekset = 2; } else if (week == cal.WEDNESDAY) { weekset = 3; } else if (week == cal.THURSDAY) { weekset = 4; } else if (week == cal.FRIDAY) { weekset = 5; } else if (week == cal.SATURDAY) { weekset = 6; } //月末日 int lastDay = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH); //7日ごとに改行するカウンタ用意 int counter = 0; System.out.println( year + "年" + month + "月"); System.out.println(" 日 月 火 水 木 金 土"); //weekset分回す for (int i = 0; i < weekset; i++) { System.out.print(" "); counter ++; } //1日から月末日まで、カレンダーを表示する for (int day = 1 ; day <= lastDay; day ++) { if (day < 10) { System.out.print(" " + day + " "); } else { System.out.print( day + " "); } counter ++; if (counter == 7) { // 7日おきに改行する counter = 0; System.out.println(); } } } } きちんと動作してくれるのですが、2つ目のループ内の、 ************** for (int day = 1 ; day <= lastDay; day ++) { if (day < 10) { ●System.out.print(" " + day + " "); } else { ●System.out.print( day + " "); } ************** ●の部分の出力はループの外で一つに纏められるはずだと指摘されました。 dayの後ろの部分にだけなら、for文の前にString str = "";と宣言しておいて、 for (int day = 1 ; day <= lastDay; day ++) { str += " "; とすることで空白を付けられる気がしているのですが、前部分に空白を設定した上でまとめて出力する方法が分かりません。 お分かりになる方、どのようにすればよいのかご教授お願いいたします。 (また、上記の方法自体全く的外れということでしたらそれを含めてご教授お願いいたします・・・;;)

    • ベストアンサー
    • Java
  • java Calendarクラス

    javaで月、日を入力してカレンダーを作成したのですが 年と月のsetでmonth-1はマジックナンバーなので直したいのですが どなたかわかる方教えてください。 package sample; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Test { private final static int firstday = 1; public static void main(String[] args) { //カレンダーのインスタンスを取得します Calendar cal = Calendar.getInstance(); //文字入力 BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); //年を取得 int year =0; //月を取得 int month =0; //最後の日付 int lastDay =0; //月初めの曜日を取得 int week =0; //年妥当性チェック boolean CheckYear = true; //月妥当性チェック boolean CheckMonth = true; try { //年妥当性チェック while(CheckYear){ System.out.println("年を入力してください"); //年を入力します year = Integer.parseInt(input.readLine()); //年が4桁の場合 if(String.valueOf(year).length()==4){ CheckYear = false; }else{ System.out.println("年は4桁で入力してください"); } } //月妥当性チェック while(CheckMonth){ System.out.println("月を入力してください"); //月を入力します month = Integer.parseInt(input.readLine()); //月が1~12の場合 if(month>=1&&month<=12){ CheckMonth = false; }else{ System.out.println("月1~12を入力してください"); } } }catch(IOException e){ System.out.println("数字以外は入力しないでください"); System.out.println("処理を中断します"); return; }catch (Exception a) { System.out.println("数字以外は入力しないでください"); System.out.println("処理を中断します"); return; } //年、月をセットします cal.set(year,month-1,cal.getActualMinimum(Calendar.DATE)); //月初めの曜日を取得 week = cal.get(Calendar.DAY_OF_WEEK); //年月を出力する System.out.println(String.valueOf(year)+"年"+String.valueOf(month)+"月"); //曜日を出力する System.out.println("日 月  火  水  木  金  土"); //最後の日付を取得する lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); /* * 最後の日付を取得する */ if(month==1||month==3||month==7||month==8||month==10||month==12) { lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(month==4||month==6||month==9||month==11){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(year%4==0&&month==2){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); }else if(year%4!=0&&month==2){ lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); } /* * カレンダーを出力する */ //最後の日付まで繰り返す // 最後の日付まで繰り返す for (int i = 1; i <= lastDay; i++) { // 1日とそれ以外で分岐する if (i == 1) { // 1日の曜日位置まで移動する for (int j = 1; j < cal.get(Calendar.DAY_OF_WEEK); j++) { System.out.print(" "); } } else { // 日付を増やす cal.add(Calendar.DAY_OF_MONTH, firstday); } // 1~9と10~で表示を変える if (i < 10) { System.out.print(" " + i); } else { System.out.print(" " + i); } // 土曜日になったら改行する if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { System.out.println(""); } } } }

  • getServletConfig()でのコンパイルエラー

    以下のソースでコンパイルエラーが出てしまいます。 ソースが汚くて申し訳ないです。 ------------------------------------------------ package to.msn.wings.chap4; import java.io.IOException; import java.net.URL; import java.util.List; import java.util.*; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import com.sun.syndication.feed.synd.SyndEntry; import com.sun.syndication.feed.synd.SyndFeed; import com.sun.syndication.fetcher.FeedFetcher; import com.sun.syndication.fetcher.impl.HttpURLFeedFetcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.GenericServlet; class Rssdata{//データ格納用クラス String[] title = new String[20]; String[] link = new String[20]; String[] day = new String[20]; } public class RssOriginal { // フィードのURL private static final String[] FEED_URLS = { "http://honyarara/index20.rdf", }; public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception, ServletException, IOException { int i = 0;//for文用変数 Rssdata rssdata = new Rssdata();//rssデータ格納用クラス // HTTPを元にフィードを取得するクラス「FeedFetcher」 ………(1) FeedFetcher fetcher = new HttpURLFeedFetcher(); // フィードの内容、フィードに含まれる記事エントリの内容を出力する for (String url : FEED_URLS) { // フィードの取得 ………(2) SyndFeed feed = fetcher.retrieveFeed(new URL(url)); Calendar cal = new GregorianCalendar();//カレンダー変換オブジェクト生成 for (SyndEntry entry : (List<SyndEntry>) feed.getEntries()) { entry.getPublishedDate(); rssdata.day[i] = cal.get(Calendar.YEAR) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.DAY_OF_MONTH); rssdata.link[i] = entry.getLink(); rssdata.title[i] = entry.getTitle(); i++; } } request.setAttribute("feed", rssdata); getServletConfig().getServletContext().getRequestDispatcher("/chap4/rss/index.jsp").forward(request,response); } } ------------------------------------------------ ------------------------------------------------ エラー内容 RssOriginal.java:75: シンボルを見つけられません。 シンボル: メソッド getServletConfig() 場所 : to.msn.wings.chap4.RssOriginal の クラス getServletConfig().getServletContext().getRequestDispatcher("/ch ap4/rss/index.jsp").forward(request,response); ------------------------------------------------ どなたか解決方法がわかりましたら教えてください。

    • ベストアンサー
    • Java
  • Javaを使ってデジタル時計を作りたいです。時、分、秒も表示させたいです。

    Javaの勉強をしている初心者の者です。 Eclipseを使ってデジタル時計を作ろうと試みているのですが、どうしても"●●時●●分●●秒"というように、表示させることができません(;_;) また、時刻は16時台になっていますが、深夜1時とかにアプレットを作動させると、"10235"というように、5桁で表記されてしまいます。 "010235"のように、6桁で時刻を表示させることができません(;_;) 私が書いたコードのどこを修正すれば、6桁の時刻で、なおかつ、時、分、秒も入ったデジタル時計を表示できるのか、教えていただければ幸いです(>_<) よろしくお願いします<m(__)m> import java.awt.*; import java.applet.*; import java.util.*; public class digital_clock extends Applet{ public void paint(Graphics g){ int hour_of_day, min, sec; Calendar cal = Calendar.getInstance(); hour_of_day = cal.get(Calendar.HOUR_OF_DAY ); min = cal.get(Calendar.MINUTE); sec = cal.get(Calendar.SECOND); String s; s = "hour_of_day+月+min+分+sec+秒"; g.setFont(new Font("SansSerif", Font.PLAIN, 60)); g.drawString(Integer.toString(hour_of_day), 20, 50); g.drawString(Integer.toString(min), 85, 50); g.drawString(Integer.toString(sec), 150, 50); } }

    • ベストアンサー
    • Java
  • JAVAのソートプログラムについて

    List1.txtの内容の単語の数を数え、その数を単語の隣に表示するプログラムを作りました。 (1)List1.txtの内容 ゲーム ゲーム 麻雀 麻雀 野球 ゲーム (2)実行結果 C:\>java Lists ゲーム 3 野球 1 麻雀 2 (3)プログラム import java.io.BufferedWriter; import java.nio.charset.Charset; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; import java.util.TreeMap; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import java.util.*; public class Lists { public static void main(String[] args) throws IOException{ File file3 = new File("C:\\List1.txt"); BufferedReader br3 = new BufferedReader(new FileReader(file3)); FileWriter filewriter3 = new FileWriter(file3,true); TreeMap<String,Integer> tm = new TreeMap<String,Integer>(); String line; while((line = br3.readLine()) != null){ String[] words = line.split("\\s"); for(String s : words){ if(!tm.containsKey(s)){ tm.put(s,1); }else{ tm.put(s,tm.get(s).intValue()+1); }} } for(String s : tm.keySet()){ System.out.println(s + " " + tm.get(s) ); }}} このプログラムを上から単語の数が多い順に表示したいのですがどこをどう修正したらいいのか悩んでます。 C:\>java Lists ゲーム 3 麻雀 2 野球 1 と表示されればOKです。 よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう