LoginSignup
2
3

More than 1 year has passed since last update.

【Perl】E-maiを送信する

Last updated at Posted at 2019-03-15

ちょっと廃れてきたと感じるPerlをあえて使って,E-mailを送信するプログラムを作ってみました.
送信用アドレスは,GoogleだとけっこうネットにのってるのであえてYahooで実験してみました.


use utf8;
use Encode;
use strict;
use warnings;
# メール送るのに必要となるモジュール
use Authen::SASL;
use MIME::Base64;
use Net::SMTP;

sub Notify{
    my $name  = shift;
    my $price = shift;
    my $url   = shift;
    my $store = shift;

#send E-mail
my $SMTP_CONF =
    {host=> 'smtp.mail.yahoo.co.jp', #yahooのsmtpサーバを送信用に指定
     port=> '587',   # ドメインによって違います
     from=> 'Username@yahoo.co.jp', #送信用ヤフーメールアドレスを入力
     return_path=> 'Username@yahoo.co.jp', #上に同じ
     auth_uid=> 'Username@yahoo.co.jp', #上に同じ
     auth_pw=> 'password' #Yahooアカウントのパスワード
    };

main($name,$price,$url,$store);

sub main {
    my $name  = shift;
    my $price = shift;
    my $url   = shift;
    my $store = shift;
    #以下のrecievingを替えて受信先のアドレスとして指定してください.
    publish_test_mail(['recieving@gmail.com'],$name,$price,$url,$store);
}


sub publish_test_mail {
    my ($mailto ) = shift; #default
    my $name     = shift;
    my $price    = shift;
    my $url      = shift;
    my $store    = shift;
    my $subject_org = '在庫を確認しました'; # メールのタイトル<img width="382" alt="email.png" src="https://qiita-image-store.s3.amazonaws.com/0/377231/1dc8d0bc-d073-fac6-bf4f-ec612665b989.png">

    my $subject = Encode::encode('MIME-Header-ISO_2022_JP', $subject_org);
    my $display_deduction = abs($deduction);

    #mailtoがない場合、送信は行いません. for debug                                                                                        
        if( ref($mailto) ne "ARRAY" or @$mailto < 1 ){
            return undef;
        }
        my $mailto_str = join(',', @$mailto );
        my $message =<<EOF;
  # 以下,メールの中身になるので適せん変えてください.変数もきちんと反映されます
  Hello! This E-mail is automatically sent from Perl program.
  Please check the item
  【NAME: $name
  【STORE: $store
  【PRICE :$price
  【URL : $url
  EOF

   #メールのヘッダーを構築                                                                                                               
   my $header = << "MAILHEADER_1";
   From: $SMTP_CONF->{from}
   Return-path: $SMTP_CONF->{return_path}
   Reply-To: $SMTP_CONF->{return_path}
   To: $mailto_str
   MAILHEADER_1
   $header .=<<"MAILHEADER_2";
   Subject: $subject
   Mime-Version: 1.0
   Content-Type: text/plain; charset = "ISO-2022-JP"
   Content-Transfer-Encoding: 7bit
   MAILHEADER_2
    $message = encode('iso-2022-jp',$message);
    my $smtp = Net::SMTP->new($SMTP_CONF->{host},
                              Hello=>$SMTP_CONF->{host},
                              Port=> $SMTP_CONF->{port},
                              Timeout=>20,
                             );
    unless($smtp){
        my $msg = "can't connect smtp server: $!";
        die $msg;
    }

    $smtp->auth($SMTP_CONF->{auth_uid}, $SMTP_CONF->{auth_pw}) or
        die "can't login smtp server";

    $smtp->mail($SMTP_CONF->{from});
    $smtp->to(@$mailto);
    $smtp->data();
    $smtp->datasend("$header\n");
    $smtp->datasend("$message\n");
    $smtp->dataend();
    $smtp->quit;
    }
}

# 今回はここで変数をあえて作って,関数に引数として渡します.
my $name  = "PlayStation4"
my $price = "30000"
my $url   = "yodobashi.com"
my $store = "YodobashiCamera"
&Notify($name,$price,$url,$store);

結果

変数もきっちち反映されているのがわかります.
email.png

2
3
2

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
2
3