NAME

Ssm::Mail - ssm2対応 メール送信用モジュール

NOTES

$Id: Ssm-Mail1_30.html,v 1.2 2018/08/12 23:34:55 sugu Exp $


SYNOPSIS

  use Ssm::Mail;
  $from = 'myname@mydomain.com, "Your Name" <yourname@yourdomain.com>';
  print "from アドレスに指定できるのは1つのアドレスのみです。\n" unless (&mail_chk($from) == 1);
  $input_mail = "myname@mydomain.com";
  $valid_mail = &zen2han($input_mail);
  print $error unless &sendAmail(
        'myname@mydomain.com',
        'こんにちは',
        '始めまして。文字コードは設定したコードに変換されて送信されます。',
        \$error,
  );
  ミドルウェアSSM用のメール送信用関数モジュールです。対応しているのは ssm2 です。
  関数内では、ssm2(実行ファイル)で定義するパッケージ main または Ssm::Config 内の変数(.ssmrc 内で指定)を使用します。いくつかの変数はメール送信の際に必須です。詳細は、.ssmrc を参照して下さい。


DESCRIPTION

sub mail_chk($address_string)

引数
文字列(1つのみ)

機能
引数として渡される文字列がメールアドレスとして正しい形式かどうかをチェックする。

メールアドレスとして認める形式
  myaccount@mydomain.com
  "My Name" <myname@mydomain.com>
  'My Name' <myname@mydomain.com>
戻り値
  正しくない形式の場合: 0
  単一アドレスとして正しい場合: 1
  複数アドレスとして正しい場合: 2
  メールアドレスが1個でも末尾にカンマがつく場合、2を返す。
  連続したカンマがある場合、または、カンマの間にホワイトスペースのみしかない場合は0を返す。
  改行を含む場合は 0を返す。

  $from = 'myname@mydomain.com, "Your Name" <yourname@yourdomain.com>';
  print "from アドレスに指定できるのは1つのアドレスのみです。\n" 
                unless (&mail_chk($from) == 1);

sub zen2han($string)

引数
文字列(1つのみ)

戻り値
文字列

機能
引数の文字列に含まれる全角英数字、全角記号を半角に置換する。置換された文字列全体を返す。

置換対象の文字列
  ABCDEFGHIJKLMNOPQRSTUVWXYZ
  abcdefghijklmnopqrstuvwxyz
  1234567890
  @!?”#$%&’()=−¥+^*{}[]<>。、.,:;/
    (全角スペース)

  $input_mail = "myname@mydomain.com";
  $correct_mail = &zen2han($input_mail);

sub tz_diff() (内部使用関数)

引数
なし

戻り値
文字列

機能
ロカールタイムゾーンの、GMTからの時間差を表す文字列を返す。メールヘッダに使用する。 フォーマット: [+-]HHMM 例:      +0900

sub sendAmail()

機能
SMTPサーバを利用してメールを送信する。

引数
     添付ファイルを指定した配列の参照(※)
  *! 送信先アドレス(複数指定可能)
  *! メールサブジェクト
  *! メール本文
  *  エラーメッセージ格納変数への参照
     CCアドレス(複数指定可能)
     BCCアドレス(複数指定可能)
  +! FROMアドレス(1アドレスのみ)
  +! ERROR-TOアドレス(1アドレスのみ)
  +! REPLY-TOアドレス(1アドレスのみ)
  +! SMTPサーバ名まはたIPアドレス
     SMTPサーバへの接続のタイムアウトまでの秒数(デフォルト=30秒)※下記注参照
     送信前にSMTPサーバのping応答をチェックするか(0または1、デフォルト=0)
  * = 引数が必須
  + = .ssmrc でデフォルト値を指定できる、
  ! = はメール送信に必須(引数または.ssmrcでの指定が必須)
  ※ 添付ファイルを指定した配列の形式
     @filelist = (
       'filepath1',
       'filepath2',
       'filepath3',
     );
     または
     @filelist = (
       ['filepath1','filename1'],
       ['filepath2','filename2'],
       ['filepath3','filename3'],
     );
     filepath# = システム中のファイルの絶対パス
     filename# = 添付ファイル名として指定するファイル名(ベース名+拡張子)
戻り値
  メール送信成功の場合: 1
  失敗の場合: 0
  指定したエラーメッセージ参照の解決された変数に、エラーメッセージを格納

  print $error unless &sendAmail(
        'myname@mydomain.com', 
        'こんにちは',
        '始めまして。文字コードは設定したコードに変換されて送信されます。',
        \$error,
  );
注:SMTPサーバへの接続のタイムアウトまでの秒数
この引数が有効になるのは、Mail::Sender モジュールに、タイムアウト検出用のパッチを当てている場合のみです。 パッチについては、 http://web-ware.org/ の情報を参照して下さい。

注:添付ファイルの指定について
関数内では、filepath に関しては読み取れるかのチェックしかしていないので、むやみなファイル(/etc/passwd など)を送信されないよう、関数に対し添付ファイファイルを指定する前に指定内容のチェックが必要です。

sub custommail()

機能
SMTPサーバを利用して、カスタマイズしたメールを送る。

引数
  *! メールサブジェクト
  *! メール本文
  *  エラーメッセージ格納変数への参照
  *! 個人別情報のフィールド名リストへの参照
  *! 個人情報格納ファイルのパス
     送信成功者リスト格納ファイルのパス
     送信できなかったリスト格納ファイルのパス
     エラーログファイルのパス
  +! FROMアドレス(1アドレスのみ)
  +! ERROR-TOアドレス(1アドレスのみ)
  +! REPLY-TOアドレス(1アドレスのみ)
  +! SMTPサーバ名まはたIPアドレス
     SMTPサーバへの接続のタイムアウトまでの秒数(デフォルト=60秒)
     送信前にSMTPサーバのping応答をチェックするか(0または1、デフォルト=1)
  * = 引数が必須
  + = .ssmrc でデフォルト値を指定できる、
  ! = はメール送信に必須(引数または.ssmrcでの指定が必須)
戻り値
  メール送信成功の場合: 1
  失敗の場合: 0
  送信の際の失敗でエラーを返すことは無い。すべてのメール送信が失敗しても、その記録がログとして残り、実行そのものは成功を返す。失敗するのは、必要な変数が指定されていない等の、設定上の問題があった時のみ。
  指定したエラーメッセージ参照の解決された変数に、エラーメッセージを格納
使い方
「個人情報格納ファイルのパス」で指定した個人別情報ファイルには、1人(1メールアドレス)1行で、.ssmrc で指定した $separator で区切って情報を記載しておく。

フィールド名を'%_'と'_%'で囲った文字列がメール本文中にあると、それらが、そのフィールドに対応する個人情報に置換される。

個人情報格納ファイルには、置換対象項目以外に、行の先頭にメールアドレスを含める必要がある。(置換対象にメールアドレスが含まれる場合も同様。)

  # cat datafile.txt
  john@smith.com::John Smith::john@smith.com::1970-10-02
  jeff@brown.com::Jeff Brown::jeff@brown.com::1955-03-27
  #in perl script
  @fiels = ('name', 'mail', 'bd');
  custommail(
        'サブジェクトにはお名前を含めません',
        'こんにちは。%_name_%さん。あなたのメールアドレスは%_mail_%、お誕生日は%_bd_%ですね。',
        \$error,
        \@fiels,
        'datafile.txt'
  );

&sendAmailと&custommail の使い分け

サブジェクトもカスタマイズしたいときは&sendAmailをループ内で使用するコードを書いて下さい。 サブジェクトを変更しなくていいときは、どちらでも同じ様にメールが送れます。 &custommailの方が指定の決まりが少し煩雑です。

&sendAmail はアドレス等の形式エラー、必須項目が未記入だった時、 およびSMTPサーバがエラーを返したときにエラーを返します。 (SMTPサーバのタイムアウトに関するエラーについては、&sendAmail の注を参照して下さい。)

&custommailはアドレス等の形式エラー、必須項目が未記入だった時にエラーを返しますが、SMTPサーバがエラーを返した時、SMTPサーバが見つからない時は、個々のメール送信のエラーとしてログに書き出すだけで、エラーを返しません。(SMTP サーバの ping 応答チェックをする設定であれば、送信前に ping 応答をチェックして、エラーがあればエラーを返します。) 一旦メール送信を開始したら、個別のエラーが出ても、スクリプト内の処理はそのまま進みます。


AUTHOR

  Miyabiko INOUE <miy@web-ware.org>
  バグ等の御連絡は mailto:miy@web-ware.org までお願いいたします。


COPYRIGHT

  Copyright (c) Miyabiko INOUE <miy@web-ware.org>.
  All rights reserved.
  このモジュールは無償でご利用いただけます。
  改変、再配布などの使用許諾に関しては、Perl の Artistic License を適用します。
  This program is free software; you can redistribute it
  and/or modify it under Perl Artistic License.


NOTES

  Further information: http://www.web-ware.org/


SEE ALSO

perl(1).