2020/07/28

phpmailer のSMTP送信で嵌った際の対処

表題に行きつくまで2時間ほど嵌ったのでオボエガキ

以前のphp5.4.16では何の問題もなく動いていたのだが
新しいサーバがPHP 7.2.21で稼働している。

PHP5.6から、verify_peerのデフォルトがtrueになったそうで、
SMTP認証をする際に、証明書を求められてエラーが返ってくる。
自己署名証明書も駄目っぽいので、証明書の設定をしないでSMTPを使いたいとき

verify_peerを使いませんと宣言すればよい
と先人は簡単に仰っていたが、ここに行きつくまで2時間かかった・・・。

$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);



以下、phpのサンプル

<?php

//----------
//メール作成
//----------

//PHPMailer ライブラリ読み込み
use PHPMailer\PHPMailer\PHPMailer;//PHPMailerの呼び出し
require_once("./vendor/autoload.php" );//位置は適宜設定のこと

mb_language("japanese");//言語設定、内部エンコーディングを指定mb_internal_encoding("UTF-8");

$files = "generate.csv";//アドレスは適宜設定のこと
//日本語添付メールを送るための設定
$to = "hoge@hoge.jp"; //宛先 必須
//$cc = "";
//$Bcc = "";
$subject = "メールのタイトル名";
$body ="本文\n";
$body.="添付のcsvファイルをご確認のこと。\n";
$body.="\n";
$from = "hoge2@hoge.com"; //送り主
$fromname = "送信者名";

//PHPMailerのインスタンス生成
$mail = new PHPMailer(true);//Exceptionを使う場合はtrueにする事使わないときは()でも動く
$mail->CharSet = "iso-2022-jp";
$mail->Encoding = "7bit";

//SMTPサーバ設定
$mail->IsSMTP();
//$mail->SMTPDebug = 0; // 0:デバッグOFF 1:デバッグON
$mail->SMTPAuth = TRUE;
$mail->Host = 'mail.hoge.jp:587';
$mail->Username = 'hoge';
$mail->Password = 'hogehoge';
$mail->SMTPSecure = 'tls'; //TLS
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
$mail->AddAddress($to);
//$mail->AddCC($cc);
//$mail->AddBcc($Bcc);
$mail->From = $from;
$mail->FromName = mb_encode_mimeheader(mb_convert_encoding($fromname,"JIS","UTF-8"));
$mail->Subject = mb_encode_mimeheader(mb_convert_encoding($subject,"JIS","UTF-8"));
$mail->Body = mb_convert_encoding($body,"JIS","UTF-8");

//添付ファイル
$mail->AddAttachment($files);

//メールを送信
if (!$mail->Send()){
echo("Failed to send mail. Error:".$mail->ErrorInfo);
}else{
echo("Send mail OK.");
}


?>


このような記述で動作した。


後日追記
証明書を取得してpostfixのsmtpd_tls_cert_file などにPKCS12形式のcrtファイル
を配置し、テストしたところ、
verify_peerについての記述をしなくとも、正しく動いた。





twilio Enable Two-Factor Authentication (2段階認証)設定

Twilioから
[Action Required] You must enable Two-factor authentication on your Twilio accounts by October 12, 2020

というメールが来た。
中を見ると、2020年の10月12日からセキュリティ上2段階認証を要求します。
2段階認証を許容していないとロックアウトされてしまうので、設定変更してね
という内容だった。


    1.Login to Twilio Console
    2.Go to “User Settings” page (below your name on the top right corner) in Console
    3.In the "Enable Two-Factor Authentication (2FA)" section, select desired 2FA level
     and click “Update 2FA Settings” to save your selection.
    4.In the "Two-Factor Authentication (2FA) Methods" section, select the desired 2FA method
     and click “Update 2FA Method” to save your selection.
    5.Users enabling 2FA for the first time will be required to go through a one-time login
     and verification process with your new 2FA method of choice.

      手順に従って設定してみた。

      1.今までのようにログインする。
      2.右上のユーザー名をクリックして、User Settings画面に移動
      3.Enable Two-Factor Authentication (2FA) の
        30日毎に認証を選択し(毎回は流石に面倒と判断)
        Update 2FA Settings をクリック
      4.認証画面に飛ばされるので、 日本(+81)を選んで、ユーザ登録した際の
        sms番号(090-xxxx-yyyyなら90xxxxyyyy)を入力して送信
      5.携帯にsmsが飛んでくるので、認証コードを入力する。
      6.トラブル用の回復コードが飛んでくるので、携帯のsimが使えなくなった場合など
        の為に、メモっておいたほうがいいかも。
      7.無事ログインできた。

       メールにある、 In the "Two-Factor Authentication (2FA) Methods については、
      再度ログイン後に選択可能だったので、最初の一回目は テキストメッセージが
      飛んでくるようだ。
      認証コードを送信するための画面の説明は図入りの解説ページを設けても
      良いと思ったけど、twilioを使っている人は、全くの素人ではないだろうから
      自力で何とかするんだろう・・・。

      認証方法については、
      Authy app とあるので、アプリからの認証も出来る模様。
      https://apps.apple.com/jp/app/twilio-authy/id494168017 
      https://play.google.com/store/apps/details?id=com.authy.authy&hl=ja
      面白そうだけど、そもそもそんなにログインしないからテキストでいいや。

      2020/07/07

      inotifywait ディレクトリ監視から自動動作のサンプル

      ディレクトリ監視をして、業務効率化を図るべく、
      今更感満載ながらinotifywaitに手を出してみた。
      
      
      yumでインストールをする
      
      
      epelレポジトリにあるので、未導入時はepel-releaseをインストール
      # yum install epel-release 
       
      inotify-toolsをインストールする。
      # yum install inotify-tools 
      ヴァージョン確認 
      # inotifywait --help
      inotifywait 3.14
       
       
      動作は、ワンライナーでもOKだが、
      シェルスクリプトにて動作させたほうが、汎用性が高い。
       
      シェルスクリプトの例
      先駆者の方々の歴史を参考に
      今回は、pdftkと連携させ、監視ディレクトリにpdfファイルが新規作成されたら
      作業用ディレクトリに移動しPDFに作業済みスタンプを押して、
      作業済ディレクトリに保存という作業を想定。
       
      
      
      doSetStamp.sh
      
      
      ここから
      
      
      #!/bin/sh
      export PATH="/usr/local/bin:$PATH"#pdftkのパスを通す
      MONITORDIR="/home/hoge/work" #監視ディレクトリ指定
      ##スタンプは /home/hoge/stamp/back.pdfを想定
       
      inotifywait -m -r -e create --format '%w%f' "${MONITORDIR}" | while read NEWFILE
      do
        cd /home/hoge/work
        file=$(basename "${NEWFILE}" .pdf)
        mv "$file".pdf /home/hoge/work/"$file".pdf;
        cd /home/hoge/work/
        pdftk /home/hoge/work/"$file".pdf stamp ./stamp/back.pdf output /home/hoge/work/done/"$file"`date "+%Y%m%d"`.pdf;
        rm "$file".pdf
      done
      
      
      ここまで
      
      
      
      
      inotifywaitでなく、シェルのルールの問題だが、
      ダブルクオーテーションで括らないと、半角スペースでコマンドが止まってしまう。
      Windowsユーザが使うので、どうしても半角スペース問題は、加味しておかないと
      想定通りに動かない。
       
      バックエンドで動かす場合は、 
      $nohup doSetStamp.sh &
      のようにする。
      
      
      pdf以外のファイルをディレクトリに配置しない方法として、
      
      
      do~doneの制御にifで判別させて仕分ける方法が最も簡単だと思う。
      if [[ "$file" =~ .*pdf$ ]]; then  
       ここに動作させたい処理を書く; 
      else
       pdfファイル以外の処理を書く;  
      fi