家賃振込み忘れて大家に怒られました(常習犯)
自動送金サービスでも使えばというのは置いといて
3日前くらいにメールが来れば忘れないんじゃね?
ということでこんな風なものを仕込んでみました。
1.送信元用Gmailアドレスを取得する
Gmailで適当なアカウントを取得
2.安全性の低いアプリの許可を有効にする
Gmail右上の● → アカウント → ログインとセキュリティ → 安全性の低いアプリの許可 → 無効から有効へ
3.必要モジュールのインストール
$ cpanm Email::Simple
$ cpanm Email::Sender
$ cpanm Email::Sender::Transport::SMTP::TLS
4.スクリプト
~/bin/yachin.pl
#!/usr/bin/perl
use lib "/home/ymko/perl5/lib/perl5"; # cronの環境変数対策
use strict;
use warnings;
use Time::Local;
use Email::Simple;
use Email::Sender::Simple qw/sendmail/;
use Email::Sender::Transport::SMTP::TLS;
use Encode;
my $username = '<送信元Gmailアドレス>';
my $password = '<送信元Gmailアドレスのパスワード>';
my $mailto = '<送信先メールアドレス>';
main();
exit 0;
sub main {
my ( $mday, $mon, $year ) = ( GetToday() )[ 3 .. 5 ];
my $mon_end_day = GetEndDay( $year, $mon );
my $target_day = $mon_end_day - 3;
if ( $mday == $target_day ) {
SendNotifyMail( "家賃振込み日通知",
"大家に怒られるで?" );
}
}
sub SendNotifyMail {
my ( $title, $body ) = @_;
my $sender = Email::Sender::Transport::SMTP::TLS->new(
host => 'smtp.gmail.com',
port => 587,
username => $username,
password => $password,
);
my $email = Email::Simple->create(
header => [
From => '"メールサービス" ' . "<$username>",
To => $mailto,
Subject => encode( 'MIME-Header-ISO_2022_JP', $title ),
],
attributes => {
content_type => 'text/plain',
charset => 'ISO-2022-JP',
encoding => '7bit',
},
body => $body, # メール本文
);
sendmail( $email, { transport => $sender } );
return 1;
}
sub GetToday {
my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst )
= localtime( time() );
$year += 1900;
$mon += 1;
return ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst );
}
sub GetEndDay {
my ( $year, $mon ) = @_;
if ( !$year || !$mon ) { return; }
if ( $year < 1900 || $year > 2023 ) { return; }
if ( $mon < 1 || $mon > 12 ) { return; }
if ( $mon == 12 ) { $mon = 0; }
my $time = timelocal( 0, 0, 0, 1, $mon, $year - 1900 );
$time -= 60 * 60 * 24;
my @date = localtime($time);
return $date[3];
}
5.crontabに仕込む
$ crontab -e
0 18 * * * /home/ymko/bin/yachin.pl
毎日18時に判定して実行
追記 you got mail
mail
Can't locate Email/Simple.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor
_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /home/ymko/bin/yachin.pl line 6.
BEGIN failed--compilation aborted at /home/ymko/bin/yachin.pl line 6.
エラー出力が/var/spool/mailに出ていた。
local::lib使っていたのでモジュールパスが通っていなかった。
cronに環境変数設定するやり方もあるようだが、
先頭にuse lib "/home/ymko/perl5/lib/perl5";
追加とする。
$ PERL_MB_OPT=""
$ PERL_MM_OPT=""
$ PERL5LIB=""
として、モジュールパスを殺し、実行でエラーがでなければOK
$ /home/ymko/bin/yachin.pl
参考
月末日を算出する - サブルーチン集 - futomi's CGI Cafe
http://www.futomi.com/subroutine/getlastday.html
Perl で Gmail の SMTP からメールを送る、「安全性の低いアプリの許可」設定とFromヘッダの設定 - yasuakiのブログ
http://yasuaki.hatenablog.com/entry/2015/10/01/000000