成果物を作る(4)

ずみ吉
ずみ吉
Aug 25, 2017 · 11 min read

前回までにDB作成DBを書き出すところまで終わった。
続いては、登録されているアイテムのリマインド時期が過ぎたらアラートを出す。
アラートの部分はjavamailを使って、メールを送信することにしました。


流れ

  1. リマインド時期を確認するために、DBに接続するコードを記述。
  2. リマインド時期を過ぎていたら、本文を引数にして、javamailを呼び出す。
  3. 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;}
}
//***************************************************************
}
)
ずみ吉

Written by

ずみ吉

30手前ですが、エンジニアを目指しています。現職はコールセンターのTR。なんとなくhtml,css,js,php,mysql,vbaが扱える程度。保有資格は、LPIC 1,ExcelVBA expert,Java SE8 Silver。

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade