あんまり記事がなかったので忘れないように書いておく
前提条件
- Homestead
- Mac
- Laravel5.8
注意事項
.envファイルの設定とかもないのであくまでメールは飛ぶ前提の記事です。
メール機能はふんわりしか説明しないので、その辺は他の記事みてください(投げやり)
ではメール送信機能の実装をザックリ進めていきます。
まずはターミナルからプロジェクトディレクトリに移動して以下のコマンドでMailableクラスを生成します。
php artisan make:mail MailSend
MailSendのところは任意
Mailable
コンストラクトにControllerから呼び出す時に引数として渡す$request
を$contact
という変数名で宣言しておきます。
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class MailSend extends Mailable
{
use Queueable, SerializesModels;
protected $_params;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($contact)
{
$this->contact = $contact;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->from('test@test.com')
->subject('テストメールです。')
->with(['contact' => $this->contact])
->view('mails/mail_send');
}
}
今回HTMLメールとして送信するので必ず
->view();
を使用してください。
Routing
じゃあ後から作成するControllerのルーティングを設定しておきます。
Route::post('/send', 'MailSendsController@send')->name('send');
Controller
フォームから$request
の中にfile
というnameで画像のアップロード情報が入っているという前提で書いていきます。
ファイルのアップロードはstorage/public/upload
というディレクトリに保存します。
あとメール送信が終わったら適当に/thanks
というviewファイルにリダイレクトかけておきます。
バリデーションは画像データで5MBまで許容しておきます。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Mail\MailSend;
class MailSendsController extends Controller
{
public function send(Request $request)
{
$this->validate($request, [
'file' => 'image|mimes:png,jpg,jpeg|max:500000|',
]);
$file_name = $request->file('file')->store('public/upload/');
$request->file = basename($file_name);
try {
Mail::to('test@test.com')->send(new MailSend($request));
} catch(Exception $e) {
echo "エラー:" . $e->getMessage();
}
return redirect('/thanks');
}
}
シンボリックリンク
publicからstorageにアクセス出来るようにシンボリックリンクを設置します。
仮想環境のプロジェクトフォルダで以下のコマンドを実行してください。
php artisan storage:link
この時ちゃんとシンボリックリンク先のパスがあってるかどうか確認しないとつまります。。
cd public
ls -la
~~~~~~~~~~省略~~~~~~~~~~
lrwxr-xr-x 1 vagrant vagrant 37 Sep 22 03:32 storage -> /home/vagrant/code/storage/app/public
View(メール文)
ではViewファイルを作成しましょう。
mkdir resources/views/mails
touch resources/views/mails/mail_send.blade.php
メール文↓
<!DOCTYPE html>
<html lang="ja">
<body>
<div>
<p>[添付ファイル]</p>
<img src="{{ $message->embed('storage/upload/' .$contact->file) }}">
</div>
</body>
</html>
これで添付できたはず。