見出し画像

[PHP] メールで1000文字以上だと文字化けする件

PHPのmail関数、mb_send_mail関数でメールを飛ばす時に、
連続した文字(改行なし)で送ると、
なぜか1000文字以降が文字化けすることを先日発見した。

ってことでネットで色々調査してみた。
1:base64などのエンコード
2:改行を適度に入れてみれば?
調査の結果、上記2件を発見。

1に関しては、知識不足でややこしそうなので、
2で対処することにした。

2の方法を探してみたが、
まともに動くプログラムがなかったり、
中途半端な状態でプログラムが書かれており、
全然使うことができなかったりで挫折・・・

仕方がないので、自作してみた。
1000文字の部分で改行を入れる関数である。
4000字が来ようとも、1000文字にしてやります。
2バイト問題もずばり解決してあるから大丈夫だと
思われる。(※テストしてません\(^0^)/)

function func_MailLineSet($L_SendMessage) {
  // 1000文字対応
  $L_brCnt = 2000;
  $L_Line = mb_split("\r\n",$L_SendMessage);
  $L_ListCnt = 0;
  for($i = 0; $i < count($L_Line); $i++){
    if ( ( $L_Line[$i] == "" ) and ( $i != count($L_Line)-1 ) ) {
      $MessageData[$L_ListCnt] = $MessageData[$L_ListCnt] . "\r\n";
      $L_ListCnt++;
    } else {
      while ( $L_Line[$i] != "" ) {
        $L_RowCnt = strlen(bin2hex($L_Line[$i])) / 2;
        if ( $L_RowCnt > $L_brCnt ) {
          $L_Byte = 0;
          // バイト数で最後の文字がマルチバイトか判断
          if ( strlen($L_Line[$i]) % 2 == 0 ) {
            $L_Byte = 0;  // 偶数
          } else {
            $L_Byte = 1;  // 奇数
          }
          $MessageData[$L_ListCnt] = substr($L_Line[$i],0,$L_brCnt - $L_Byte);
          $L_Line[$i] = substr($L_Line[$i],$L_brCnt - $L_Byte,$L_RowCnt);
        } else {
          $MessageData[$L_ListCnt] = $L_Line[$i];
          $L_Line[$i] = "";
        }
        if ( $i != count($L_Line) ) {
          $MessageData[$L_ListCnt] = $MessageData[$L_ListCnt] . "\r\n";
        }
        $L_ListCnt++;
      }
    }
  }
  $L_SendMessage = "";
  for($i = 0; $i < count($MessageData); $i++){
    if ( $i == 0 ) {
      $L_SendMessage = $MessageData[$i];
    } else {
      $L_SendMessage = $L_SendMessage . $MessageData[$i];
    }
  }

  return $L_SendMessage;
}

簡単なシステムで問題なくずっと動作しているから問題ないと思うよ?
指摘があっても修正しません!

この記事が気に入ったらサポートをしてみませんか?