ものぐさ的なメールの書き方

#おしごとですよ。
弊社では、毎月契約している拠点（お店さん）に定期訪問という形でお伺いすることがあります。
事前にこの日にいくよ！っていうメールを送るのですが、いちいち考えながらパソコンに向かって1から書いているのは面倒なのでなんかで生成できたら楽だなーと思っていました。~~コピペでやればいいじゃんとかクソみたいな声が聞こえてきそうですが。~~
人間は楽をするために頭を使うのです・・・。

#欲しいと思ったらとりあえず書く
せっかく前回の記事といい、個人用に同人誌検索ページを作っていたりしてPHPをごしごし触ってるので、勉強がてら作ってみました。
部分的に差し替えするだけのコードで簡単にいけんじゃね？とか思ったけど色々やってくと案外むつかしいのね(´・ω・`)
コピペしても使いこなせずによくわからないので、1から手打ちしています。1個ずつ理解していくと使いこなせてる感が出て良いですね。
備忘録がてら稚拙な文章ではありますが、投稿させていただきます。

##欲しい機能

1. 会社名とか可変的な部分のみ入れてぽちっとなで全文ができる。
2. 最低限入っていないといけないところ（相手先会社名や担当者名など）が入っていない場合はちゃんと指摘してくれる。
3. 日付・時間を入れたら成型してくれる。（例えば2018/5/8で 「5月のご訪問の日程について～」「5月8日」のように）
4. 時間帯指定する場合と開始時間のみ指定する場合の記述を分ける（時間帯指定なら10:00～12:00、開始時間のみなら10:00）
5. 曜日も自動で入れてほしいよね。
6. 連絡事項欄作って任意の文字列入れたいよね。
7. 署名もつけたいよね。

##出来上がったもの
注)社名や本文はかなり改変しています。バレるの嫌だし・・・。

###入力画面HTML

フォームにしてPOSTするっていうのは参考にしたリファレンスに書いてあったので、遠慮なくガシガシ名前つけて投げるようにしました。
とりあえず必要な情報を書いてフライパンに投げているだけです。
投げた先でスーパーグローバル使って受けて料理すればいいよ！っていうのがちらっと書いてあったので「そうか」と実践しました。

```mailw.html
<!DOCTYPE html>
<html lang="jp">
  <head>
    <meta charset="utf-8">
    <title>メール生成</title>
  </head>
  <body>
    <h1>メールジェネレーター第1弾</h1>
    <p>よく出すメール作るよ</p>
    <form action="mail_gen.php" method="post">
      <label for="com1">会社名</label><br>
        <input id="com1" type="text" name="company1" value="" size="40"><br>
      <label for="position">役職:</label><br>
        <select id="position" name="position">
        <option value="0" selected></option>
        <option value="1">店長</option>
        <option value="2">社員</option>
        <option value="3">社長</option>
        <option value="4">代表取締役社長</option>
        </select><br>
      <label for="tantou">相手先担当者名</label><br>
        <input id="tantou" type="text" name="name1" value=""><br>
        <label for="honorific">敬称</label><br>
        <select id="honorific" name="honorific">
        <option value="0" selected>様</option>
        <option value="1">店長</option>
        <option value="2">社員</option>
        <option value="3">社長</option>
        <option value="4">代表取締役社長</option>
        <option value="5">さん</option>
        </select><br>
      <label for="com2">自社名</label><br>
        <input id="com2" type="text" name="company2" value=""><br>
      <label for="myname">自分の名前</label><br>
        <input id="myname" type="text" name="name2" value=""><br>
      <label for="hiduke">日付</label><br>
        <input id="hiduke" type="date" name="d" value=""><br>
      <label for="start">開始時間</label><br>
        <input id="start" type="time" name="t1" value=""><br>
      <label for="end">終了時間</label><br>
        <input id="end" type="time" name="t2" value=""><br>
      <label for="renraku">連絡事項（改行は&lt;br&gt;）</label><br>
        <textarea id="renraku" name="text1" rows="10" cols="80" wrap="hard" placeholder="連絡事項を入力"></textarea><br>
      <label for="sign">署名（改行は&lt;br&gt;、自分の名前を入れる箇所にはAAAAと入れてください。）</label><br>
        <textarea id="sign" name="sign" rows="10" cols="80" wrap="hard" placeholder="署名を入力">
---- 株式会社ほにゃらら ----------------<br>
AAAA<br>
地球の日本のどっか<br>
TEL：080-1234-5678<br>
Mail:hugahuga@honyarara.asia<br>
--------------------------------------<br></textarea><br>
      <input type="submit" value="決定"><br>
    </form>
  </body>
</html>
```

###入力画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/238748/d24d4e60-6fbb-e124-f6b7-156de96b39b6.png)


###本文を生成するためのPHP

フライパンに材料を入れたらあとは料理するだけですね。
PHPで料理して成果物を得ます。

エラーの処理部分はif文をいっぱい書くのはすごい面倒なので連想配列つかってForeach文で回してみました。
Foreach文はとても賢い文だなぁとか関心しました。

文字列を操作する部分はやってて頭がこんがらがりました。何が何文字目とか考えたことないよ・・・。
echo内に直接str_replaseとか入れるとエラーになりやすい上に可読性が著しく低下するので、変数にぶっこみましたが、変数をコードの頭のほうに書くと頭でっかち感があって恰好悪いですね・・・。

担当者名の前後に役職や敬称をいれる処理はswitch文で書けばなんとかなるだろう。と思ってやってみたら意外とうまくいったのですが、ちらっと調べるとswitch文の評判の悪いこと悪いこと・・・。
書いてるとIFよりもswitch文のほうが好きなのになぁ。
switch(true)とか何でもやりたい放題できる感じがあるので好きなのですが、界隈ではそんな書き方はヤメロ！とか邪道とか書かれているのでちょっと悲しくなります。

```mail_gen.php
<!DOCTYPE html>
<html lang="jp">
  <head>
    <meta charset="utf-8">
    <title>メール本文</title>
  </head>
  <body>
    <?php
    $post_val = [company1 => '会社名',name1 => '相手先担当者名',company2 => '自社名',name2 => '自分の名前',d => '日付',t1 => '開始時間'];
    $error = "";

    foreach ($post_val as $key => $value) {
    if ($_POST[$key] == "") {
        $error = $error . "エラー！" . $value . "が記入されていません！<br>\n";
      }
    }

    if ($error !="" ) {
      echo $error;
      echo "<br>入力されたもの<br><br>\n";
      foreach ($post_val as $key => $value){
      if($_POST[$key] == ""){
        echo "<strong>" . $value . "←<font color=\"#ff0000\">必須！</font></strong><br>\n";
      }else {
        echo $value . "&nbsp;&nbsp;&nbsp;&nbsp;" . $_POST[$key] . "<br>\n";
      }}
      exit;
    }

    $week = ['日','月','火','水','木','金','土'];
    $position = ['','店長','社員','社長','代表取締役社長'];
    $honorific = ['様','店長','社員','社長','代表取締役社長','さん'];
    $m = substr($_POST['d'], 6, 1);
    $d0 = str_replace('-', '', substr($_POST['d'], 0, 10));
    $date = date('w', strtotime($d0));
    $d1 = str_replace('-', '月', str_replace('0', '', substr($_POST['d'], 6, 4)));
    $text_box = str_replace('AAAA', $_POST['name2'], $_POST['sign']);

    switch ($_POST['position']) {
      case 0:
       $name1 = $name1 . $_POST['name1'] . "&nbsp;" . $honorific[$_POST['honorific']];
        break;
      default:
       $name1 = $position[$_POST['position']] . "&nbsp;"  . $_POST['name1'] . "&nbsp;" . $honorific[$_POST['honorific']];
        break;
    }

    if($_POST['t2'] != ""){
      $t2 = "～" . $_POST['t2'];
    }else {
    }

    echo $_POST['company1'] . "<br>\n";
    echo $name1 . "<br><br>\n";
    echo "いつもお世話になっております。<br>\n";
    echo $_POST['company2'] . "の" . $_POST['name2'] . "です。<br><br>\n";
    echo $m . "月の定期訪問の日程についてご連絡でございました。<br><br>\n";
    echo $d1 . "日(" . $week[$date] . ")" .  "&nbsp;" . $_POST['t1'] . $t2 . "<br><br>\n";
    echo "上記の日程にてお伺いしたいと考えておりますが、ご都合は如何でしょうか。<br>\n";
    echo $_POST['text1'] . "<br>\n";
    echo "お手数をおかけしますが、ご調整いただければと思います。<br>\n以上、何卒よろしくお願い致します。<br><br>\n";
    echo $text_box . "<br>\n";

     ?>
  </body>
</html>
```

###生成された本文は以下のようになります。
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/238748/2129883f-d929-b0dc-9a3a-41f5514f0380.png)

###エラー画面はこんな感じで出ました。
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/238748/e7091bf4-c3d7-a747-0a5c-f057eabd0b2f.png)

##最後に
ここまでやってなんですが、この時間使って10通以上送れたんじゃないかなと思いました。
それでも昨日の夜に3時間ぐらいでこれを作って、朝に6通ぐらいパパっと作って出しました。便利。
今後機能追加とブラッシュアップをしながら使って行こうと思います。

自分で作る利点はなにか欲しい機能があったら付け足せるところですよね。（そしてエラーになる）
あと、考えながら好きなようにできるのは楽しいということに気づきました。
ただ、書き方が自己流なので普通はどういう風に皆さま書かれているのかがわからないものですね。

もし、こんな書き方しないよ！とか、こう書いたほうが効率的とかわかりやすい等あればご指摘願います。

今後は、~~サイボウズOFFICEとのAPIでの連携でスケジュールの登録や、~~（サイボウズ側でAPIを制限しているらしく、できないらしいです。Googleカレンダーはできそうですが、APIの扱いの理解に時間がかかるかも・・・。）~~時間帯の例外処理（明らかにおかしい時間数の場合エラーを出す）~~できました！
~~など入れていきたいです。~~

```php

    function time_validation(){
     switch ($_POST['t1']){
      case "":
       break;
      case $_POST['t2']:
       echo "開始時間と終了時間が同一です。<br>";
       break;
      case $_POST['t1'] > $_POST['t2']:
       echo "開始時間が終了時間より大きいです。<br>";
       break;
      case $_POST['t1']+8 < $_POST['t2']:
       echo "選択された時間が長すぎます。<br>";
       break;
      default:
       break;
     }
     }

    $post_val = [company1 => '会社名',name1 => '相手先担当者名',company2 => '自社名',name2 => '自分の名前',d => '日付',t1 => '開始時間', t2 => '終了時間'];
    $error = "";

    foreach ($post_val as $key => $value) {
    if ($_POST[$key] == "") {
        $error = $error . "エラー！" . $value . "が記入されていません！<br>\n";
      }
    }

    if ($error !="" ) {
      echo $error;
      time_validation();
      echo "<br>入力されたもの<br><br>\n";
      foreach ($post_val as $key => $value){
      if($_POST[$key] == ""){
        echo "<strong>" . $value . "←<font color=\"#ff0000\">必須！</font></strong><br>\n";
      }else {
        echo $value . "&nbsp;&nbsp;&nbsp;&nbsp;" . $_POST[$key] . "<br>\n";
      }}
      exit;
    }
```

mail_gen.phpのエラー処理部分を上のコードに差し替えてエラー出力ができました。

おしごと完了です。おつかれさまでした。

###気になったこと

関係ないですが、裏で作っている同人誌検索ではswitch文の式になんが適当な文字列ぶっこんでcaseで全く関係のない条件式入れていてもdefault;に行かずになぜか正常に動いていたので調べまくったのですがswitchは使うな！とは書いてあっても具体的なイディオムといいますか、考察とか解説しているページはあまりないようで、結局わからずじまいです。switch(true)と同じ扱いなのかな・・・。
条件式はそれ単体ではあっているのですが、式にミリも合致しないのでそもそもエラーになるかそのままdefault;に行くものだと思っていたのですが、正常に動いているのでとりあえず関係のない文字列が入っているのは気持ち悪いのでswitch(true)にしてます。（switch()だとエラーになりました。）
同人誌検索についても出来上がったら備忘録がてら投稿したいと思います。
switch($hoge)とcaseの間には何も入れてはいけない（戒め）

こちらの記事が非常に参考になりました。
[switch(true) イディオム考察 - Tomoki UDA様](https://qiita.com/t_uda/items/1969e09a970d71e4cfd6)
[switch(true) が嫌な理由、説明しにくい - @mrpepper様](https://qiita.com/mrpepper/items/dc6058166756ea69ac69)

フォールスルーの問題についても触れられていますが、IF文をネストしまくった時にELSEの｝の個数を間違えるのと同じようなお話の気がして確かに別問題のような気がしました。

##参考にしたページ
[PHP言語リファレンス](http://php.net/manual/ja/langref.php)
[HTMLクイックリファレンス](http://www.htmq.com/)
[PHPまとめ - 文字列操作](http://doremi.s206.xrea.com/php/tips/string.html)