質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

1回答

3761閲覧

laravel メール送信で複数添付

cofee

総合スコア44

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

0クリップ

投稿2018/03/26 11:02

編集2018/03/27 05:30

お世話になっております。

メールで複数のファイルを添付したいのですが配列にして添付すると文字化けしてしまい送信できません。
現在は$filepath1の一つだけなら正常に送信される状態です。

構造は public$username\ファイル名 のようになっています。

ファイル名は全て '書類1-佐藤-1111-2018-03-26.pdf'
などの形で格納されています。

配列にしてattachに渡すと$filepath2が読み込めませんと出てしまいます。

文字コードをsjis-winに変更して行うと、逆に$filepath1が読み込めませんとなってしまいます。

ファイルを複数添付するにはどうしたらよいのでしょうか?

よろしくお願いします。

php

1public function make_mail(Request $request){ 2 $username = $request->input('name'); 3 $temp1 = $request->input('temp1'); 4 $temp2 = $request->input('temp2'); 5 $temp3 = $request->input('temp3'); 6 $temp4 = $request->input('temp4'); 7 $temp5 = $request->input('temp5'); 8 $temp6 = $request->input('temp6'); 9 10 11 $filepath1 = '/'.mb_convert_encoding($username,'SJIS-win','UTF-8').'/'.mb_convert_encoding($temp1,'SJIS-win','UTF-8'); 12 $filepath2 = '/'.mb_convert_encoding($username,'SJIS-win','UTF-8').'/'.mb_convert_encoding($temp2,'SJIS-win','UTF-8'); 13 $filepath3 = '/'.mb_convert_encoding($username,'SJIS-win','UTF-8').'/'.mb_convert_encoding($temp3,'SJIS-win','UTF-8'); 14 $filepath4 = '/'.mb_convert_encoding($username,'SJIS-win','UTF-8').'/'.mb_convert_encoding($temp4,'SJIS-win','UTF-8'); 15 $filepath5 = '/'.mb_convert_encoding($username,'SJIS-win','UTF-8').'/'.mb_convert_encoding($temp5,'SJIS-win','UTF-8'); 16 $filepath6 = '/'.mb_convert_encoding($username,'SJIS-win','UTF-8').'/'.mb_convert_encoding($temp6,'SJIS-win','UTF-8'); 17 18 $array = [$filepath1,$filepath2,$filepath3,$filepath4,$filepath5,$filepath6]; 19 20 $this->sendMailTo_w($array); 21 22 return view('admin::mail_index'); 23 } 24 25 26 private function sendMailTo_w($pdf){ 27 28 $to = 'sample@gmail.com'; 29 $cc = ''; 30 $bcc = ''; 31 $fromAddress = 'sample@gmail.com'; 32 $fromName = 'aaa'; 33 $subject = 'test'; 34 35 $email = [ 36 'to' => $to, 37 'cc' => $cc, 38 'bcc' => $bcc, 39 'from_address' => $fromAddress, 40 'from_name' => $fromName, 41 'subject' => $subject, 42 'attach' => $pdf 43 ]; 44 45 \Mail::send('admin::mail_temp', compact('email'), function($message) use ($email) { 46 47 if (is_array($email['to'])) { 48 $toArray = $email['to']; 49 } else { 50 $toArray = [$email['to']]; 51 } 52 foreach ($toArray as $key => $value) { 53 $message->to($value); 54 } 55 56 $message->subject($email['subject']); 57 58 if ($email['from_address']) { 59 $message->from($email['from_address'], $email['from_name']); 60 } 61 62 if ($email['cc']) { 63 $message->cc($email['cc']); 64 } 65 66 if ($email['bcc']) { 67 $message->bcc($email['bcc']); 68 } 69 70 if (array_key_exists('attach', $email)) { 71 if (is_array($email['attach'])) { 72 foreach ($email['attach'] as $file) { 73 $message->attach($file); 74 } 75 } 76 else { 77 $message->attach($email['attach']); 78 } 79 } 80 }); 81 }

複数送信できたのですが、ファイル名が文字化けしてしまいます。

文字化け

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

sendMailTo_w()の$pdfが単品ファイルのみ受け付ける構造になっているようにしか見えず、
そもそも複数ファイルを添付できる仕様を満たそうとしているのかさえ怪しいのですが。

is_array()で引数が配列かどうか判定し、
配列で渡された場合にforeach()ループで順次$message->attach()していけばいいのかも?


$array = [$filepath1,$filepath2,$filepath3,$filepath4,$filepath5,$filepath6]; $this->sendMailTo_w($filepath1);

$array どこいった?
仮に引数が$this->sendMailTo_w($array);だったと仮定して、
private function sendMailTo_w($pdf)を吟味すると、

$email = [ 'to' => $to, 'cc' => $cc, 'bcc' => $bcc, 'from_address' => $fromAddress, 'from_name' => $fromName, 'subject' => $subject, 'attach' => $pdf ];

としてattacheに与えているように見えて、その先無名関数内で、

if (array_key_exists('attach', $email) && $email['attach']) { $message->attach($email['attach']); }

&& $email['attach']っていう参照の仕方はちょっと変。

if (array_key_exists('attach', $email)) { if (is_array($email['attach'])) { foreach ($email['attach'] as $file) { $message->attach($file); } } else { $message->attach($email['attach']); } }

が正しいかわからないけど、添付したいファイルを一つずつattach()していけばいいんじゃないかなって、直感で思った次第。
attach()が一度に1つしかファイルを受け付けないとしても、
複数のファイルを順次与えていけば解決しそうに見えたので。


もう1点。

$filepath1 = "/".$username."/".$temp1; $filepath2 = "/".$username."/".$temp2; $filepath3 = "/".$username."/".$temp3; $filepath4 = "/".$username."/".$temp4; $filepath5 = "/".$username."/".$temp5; $filepath6 = "/".$username."/".$temp6; $array = [$filepath1,$filepath2,$filepath3,$filepath4,$filepath5,$filepath6];

この箇所でファイルの存在を検証せず必ず6つファイルを与えようとしているけど、
ちゃんとファイルがあるか確認できてますか?
var_dump($array);とかやって絶対パスが存在するかどうか、
ファイルにアクセス可能かどうか(fopen()/fclose()してみるとか)で
確認できると思います。

投稿2018/03/26 11:47

編集2018/03/27 03:41
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cofee

2018/03/26 23:52 編集

回答ありがとうございます。 is_array()で判定して行っているのですが、2つ目で落ちてしまっている状態です。 それと$pdfをvar_dumpするとちゃんと配列になっています。
cofee

2018/03/27 03:21

編集ありがとうございます。 試したのですが、やはり「Unable to open file for reading」と出てしまいます。 ファイルのパスがおかしいのでしょうか?
退会済みユーザー

退会済みユーザー

2018/03/27 03:37

ファイルのパスがおかしいかもしれないという仮設の検証は私にはできません。var_dump()を気になるところにこまめに仕込んでデバッグするしかないかと存じます。
cofee

2018/03/27 04:03

is_readable()を使用してみましたが全てfalseでした。 C:/からのフルパスを書いてもfalseでした。 フルパスをurlで表示すると正常に開きます。 なぜphpからだと読み込めないのでしょうか、、、?
cofee

2018/03/27 04:03

is_readable()を使用してみましたが全てfalseでした。 C:/からのフルパスを書いてもfalseでした。 フルパスをurlで表示すると正常に開きます。 なぜphpからだと読み込めないのでしょうか、、、?
退会済みユーザー

退会済みユーザー

2018/03/27 04:17

Windows上でテスト環境を作ってますか? C:/path/to/winfile.ext みたいな書き方になってますかね。
cofee

2018/03/27 04:54

特にテスト環境などは作っていません。 C:/xampp/htdocs/laravel/public/$username/$temp1 のようになっています。
退会済みユーザー

退会済みユーザー

2018/03/27 05:11 編集

https://readouble.com/laravel/5.1/ja/mail.html 《attachメソッドでは最初の引数としてファイルの完全パスを指定します》 なので、フルパスを与えてください。 なお、パスの環境依存部分は外出ししておくとよいでしょう。
cofee

2018/03/27 05:39 編集

参考リンクありがとうございます。 フルパスでも編集後のパスでも送信できました。 ですが、ファイル名が全部文字化けしてしまいました。 この文字化けを直すにはどうしたらいいのでしょうか、、、 調べても同じような症状が見つかりませんでした。
退会済みユーザー

退会済みユーザー

2018/03/27 05:45

先のコメント内リンクに示すページで、attach()第2引数でファイル名を与えればいいのかも。 UTF-8のまま送信せずに、Windows相手なら例えばSJIS-winとかで送るとか。 $message->attach($file, ['as' => mb_convert_encoding(ファイル名, 'SJIS-win']);
cofee

2018/03/27 06:53

asで指定してもファイル名は文字化けしてしまいました。 ファイル名などをアルファベットにして行うことにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問