成果物を作る(4)
Aug 25, 2017 · 11 min read
前回までにDB作成とDBを書き出すところまで終わった。
続いては、登録されているアイテムのリマインド時期が過ぎたらアラートを出す。
アラートの部分はjavamailを使って、メールを送信することにしました。
流れ
- リマインド時期を確認するために、DBに接続するコードを記述。
- リマインド時期を過ぎていたら、本文を引数にして、javamailを呼び出す。
- javamailを使って、Gmailからメールを送る。
①リマインド時期を確認するために、DBに接続するコードを記述。
DBAccess.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;public class DBAccess {
ArrayList<Items> list = new ArrayList<Items>();public <T> ArrayList<Items> test() {
// TODO Auto-generated method stub
// list.removeAll(list);
// System.out.println(list);
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
//JDBCドライバを読み込む
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// 1JDBCドライバが見つからない場合、例外
e.printStackTrace();
}
try {
// 2DBへの接続を行う
con = DriverManager.getConnection("jdbc:mysql://localhost/home_items",
"admin", "admin");
// 3DB処理のための準備、Statementオブジェクトの作成
stmt = con.createStatement();
// 4,5Select文の実行と結果を格納/代入
rs = stmt.executeQuery("select * from items i "
+ "inner join category c on i.cate_id=c.cate_id");
//6結果を表示する
while (rs.next()) {
Items item = new Items();
item.setItemName(rs.getString("i.name"));
item.setCategoryName(rs.getString("c.name"));
item.setAmazonLink(rs.getString("i.amazon_link"));
item.setRemindDay(rs.getString("i.remind_day"));
list.add(item);
}
} catch (SQLException e) {
// DBとの処理で何らかのエラーがあった場合の例外
e.printStackTrace();
} finally { // 以降は何があっても接続を切断する
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// System.out.println(list);
return list;
}
}
②リマインド時期を過ぎていたら、本文を引数にして、javamailを呼び出す。
CheckData.java
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;import test.MAILSend;public class CheckData {public static void main(String[] args) {
// TODO Auto-generated method stub
HashMap<String, String> hm = new HashMap<String, String>();
// 1 sqlに接続。remind_dayを取得。
DBAccess dba = new DBAccess();
ArrayList<Items> list = dba.test();
System.out.println(list);
LocalDate today = LocalDate.now();
System.out.println(today);
for (int i=0; i<list.size(); i++){
Items item = list.get(i);
String name = item.getItemName();
String link = item.getAmazonLink();
LocalDate rd = item.getRemindDay();
System.out.println(name + ":" + rd);
// 2 remind_dayと今日を比較
int b = rd.compareTo(today);
System.out.println(b);
// 3 今日 >= remind_dayなら該当したら、「4」へ
if(b <= 0 ){
hm.put(name, link);
}
}
// 4 リマインド対象のアイテムとリンクをメールで送信。
if(hm != null) limitover(hm);
}private static void limitover(HashMap<String, String> hm) {
//本文を生成。
String text = String.format("以下アイテムがリマインド対象になっています。%n");
for (Map.Entry<String, String> e : hm.entrySet()){
text = String.format(text +"・" + e.getKey() +":" + e.getValue() + "%n");
}
text = text + "そろそろ購入しますか?";
System.out.println(text);
//送信用メアドとPW
if(MAILSend.send(text)){
System.out.println("やったね、送信正常だったよ");
} else{
System.out.println("送信失敗まぁ気にするなって、んっ?");
}
}}
③javamailを使って、Gmailからメールを送る。
まず、Gmailから送るには、Gmailの設定の変更が必要らしい。
google mail 側の設定で、
アクセス許可設定をしていなかったので、エラーになっていたことに気づかなかったところで
少し詰まりました。気づけば簡単なことでした。
http://isotai.hatenablog.com/entry/2017/02/26/180910
そして、以下サイトを参考として、コードをGmailのアカウントから送信が行えるように手を加えた。
MAILSend.java
package test;import java.util.Properties;import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;public class MAILSend {
//*** 設定項目 *************************************************
//*** 固定項目
static String toAddress = // 送信先アドレス
"***@***";
static String fromAddress = // 送信元アドレス
"***@gmail.com";
static String hostServer = // SMTPサーバー
"smtp.gmail.com";//*** 設定項目
static String mailSubject = "リマインド対象商品"; // 送信メッセージ表題
static String mailMessage = ""; // 送信メッセージ
static String fromName = "アイテム管理者"; // 送信者名public static boolean send(
String mailMessage
){
try{
Properties props = new Properties();
//*** SMTPサーバ ***
props.put("mail.smtp.host",hostServer);
props.setProperty("mail.smtp.port", "587"); //ポート番号を指定
props.setProperty("mail.smtp.auth", "true"); //認証情報
props.setProperty("mail.smtp.starttls.enable", "true"); //starttlsで始めるように設定 おそらくGmail側の仕様
props.setProperty("mail.debug", "true"); //デバック用
Session mailConnection =
Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("jajajavadeitem", "jajajavade"); } });
MimeMessage msg =
new MimeMessage(mailConnection);
//*** 送信元メールアドレス、送信者名 ***
msg.setFrom(new InternetAddress(fromAddress,
fromName,"iso-2022-jp"));
//*** 送信先メールアドレス ***
msg.setRecipients(Message.RecipientType.TO,
toAddress);
//*** 送信メッセージ表題 ***
msg.setSubject(mailSubject,"iso-2022-jp");
//*** 送信メッセージ内容 ***
msg.setText(mailMessage,"iso-2022-jp");
//*** 送信
Transport.send(msg);
return true;
}catch(Exception e)
{ e.printStackTrace(); return false;}
}
//***************************************************************
}
