家賃振込み忘れて大家に怒られたので月末前にメールでお知らせする

家賃振込み忘れて大家に怒られました（常習犯）
自動送金サービスでも使えばというのは置いといて
３日前くらいにメールが来れば忘れないんじゃね？
ということでこんな風なものを仕込んでみました。

# 1.送信元用Gmailアドレスを取得する

Gmailで適当なアカウントを取得

# 2.安全性の低いアプリの許可を有効にする

Gmail右上の●　→　アカウント　→　ログインとセキュリティ　→　安全性の低いアプリの許可　→　無効から有効へ

# 3.必要モジュールのインストール

```bash
$ cpanm Email::Simple
$ cpanm Email::Sender
$ cpanm Email::Sender::Transport::SMTP::TLS
```

# 4.スクリプト

```bash:~/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に仕込む

```bash
$ crontab -e
0 18 * * * /home/ymko/bin/yachin.pl
```

毎日18時に判定して実行

# 追記 you got mail

```txt: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";``追加とする。

```bash
$ 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