LoginSignup
5
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-03-02

家賃振込み忘れて大家に怒られました(常習犯)
自動送金サービスでも使えばというのは置いといて
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

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5