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

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

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

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

1481閲覧

cakephpでCSVファイルを添付したメールを送りたいが、ファイルが添付できない

退会済みユーザー

退会済みユーザー

総合スコア0

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2020/01/21 03:52

前提・実現したいこと

データを分析したshellで結果をCSVファイルで保存
そのファイルをメールで送信する

発生している問題・エラーメッセージ

Call to a member function setAttachments() on array in /var/www/system/src/Shell/xxxshell.php on 298

該当のソースコード

setAttachments()部分でエラー発生

・・・・ use Cake\Mailer\Email; ・・・・・ $filePath = realpath($file); print($filePath); // メール送信処理 $email = new Email("default"); // 入力者へのメール $email->setFrom(["from@example.com"=>"送信元名"]) ->setTo("xxxx.xxxx") ->setCc("xxxx.xxxx") ->setSubject("検知処理") ->send("データ不整合が疑われるユーザーをお知らせします。添付ファイルをご確認ください") ->setAttachments("'" . $filePath . "'"); }

試したこと

公式ドキュメント
https://book.cakephp.org/3/ja/core-libraries/email.html#id8

attachments()は3.4で非推奨となっていました。現在利用中のバージョンは3.5なのですが、一応以前のものを試してみました
ですが結果変わりませんでした

また、もともとtmpディレクトリにcsvファイルを作成していたのですが、保存先のディレクトリを変えてみました
/var/www/system/webroot/XXX/20200121123807.csv
ファイルパスはいずれも取得できている状態であると確認しましたが、ディレクトリを変更しても変わりませんでした

->setAttachments($filePath);
だったのを上記のような形式にすることもしてみましたが同じでした

パスを格納している変数は単一のもの(array形式でない)ですし、1件だけ添付したい場合パスだけ指定すれば良いという理解なのですが、CSVファイルの添付をしたい場合他に渡さなければならない情報はありますか?

補足情報(FW/ツールのバージョンなど)

cakephp3.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

順番が間違っています。

PHP

1 // 入力者へのメール 2 $email->setFrom(["from@example.com"=>"送信元名"]) 3 ->setTo("xxxx.xxxx") 4 ->setCc("xxxx.xxxx") 5 ->setSubject("検知処理") 6 ->setAttachments("'" . $filePath . "'") 7 ->send("データ不整合が疑われるユーザーをお知らせします。添付ファイルをご確認ください");

send() は一連の処理の「最後」にないとダメです。ですから setAttachments と send の行を逆にしてください。

Email::send() は戻り値として配列を返しますから、Email::setAttachments を呼び出せるわけがないのです。
一方、setTo() や setSubject() などは戻り値として自分自身($this)を返すので、メソッドをチェーンすることができるのです。
※実は上の書き方は、これとほぼ同じです。

PHP

1 $email->setFrom(["from@example.com"=>"送信元名"]); 2 $email->setTo("xxxx.xxxx"); 3 $email->setCc("xxxx.xxxx"); 4 $email->setSubject("検知処理"); 5 $email->setAttachments("'" . $filePath . "'"); 6 $email->send("データ不整合が疑われるユーザーをお知らせします。添付ファイルをご確認ください");

投稿2020/01/21 04:18

tacsheaven

総合スコア13703

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

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

退会済みユーザー

退会済みユーザー

2020/01/21 08:34

自分では気づけませんでした 助かりました、ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問