Laravel5.1のメール送信で添付ファイルが日本語名だと、ファイル名が取得できなかったので対応してみた。
1, 日本語ファイル名のメール送信
1 2 3 4 5 6 7 8 9 |
\Mail::send('emails.attached', $data, function($message){ $attached_file = "テスト.txt"; $message->subject('メールの題名') ->from('xyz@tekito.com', '送り元の名前') // ->to('abc@test.co.jp', '相手の名前') ->attach($attached_file); }); |
添付ファイルそのものは送信されたが、ファイル名が”.txt”と拡張子だけの状態になってしまった!
※ファイル名を、”aテスト.txt”みたいに、1文字目だけ半角英数字にすると問題なくファイル名取得されていた…。
調べてみると、basename(フルパスからファイル名を取得するphp関数)が原因っぽい。
basename() はロケールに依存します。 マルチバイト文字を含むパスで正しい結果を得るには、それと一致するロケールを setlocale() で設定しておかなければなりません。
なので、メール送信する直前に、locale設定すれば日本語ファイル名でも問題なく取得できた。
1 |
setlocale(LC_ALL,'ja_JP.UTF-8'); |
2, laravel5.1で、setlocaleは、どこで設定すべきか?
config/app.phpを設定すれば良いんでしょ!と思ったが、反映されず(php artisan config:cacheしても無駄)
1 2 |
//'locale' => 'ja', 'locale' => 'ja_JP.UTF-8', |
次善の策としてapp/ProvidersフォルダのAppServiceProvider.phpのbootファンクション内に、書いてみた。
これで、どこの処理にでも反映されるはず!
1 2 3 4 5 6 |
class AppServiceProvider extends ServiceProvider { public function boot() { setlocale(LC_ALL,'ja_JP.UTF-8'); } |
3, localとlocaleの違い
local(局地的、ローカル変数とか)は知っていたけど、localeって何?と思って調べてみたら
locale(場面・場所)って意味なのね…。
locate(場所を突き止める)とも間違えそうだ(^_^;)