qiitaの草を増やした結果、githubの草が除草されました私です
胡蝶蘭を捨てるくらいならワイが欲しいので、サービス開発する編
公式ドキュメントの言う通り、パッケージをインストールされたら、Inertia.jsが導入されて???になった編
マルチログインを作ってみた編
デザインをtailwindcssに丸投げする編
デザイナーに怒られないために、画像をリサイズする編
AWS×リボ払いで破産へGO編
Google MAPに無人島に飛ばされる編
エンジニアはやせ型が好き編
APIがよくわからなかった編
今回やること
- SendGridの導入
- 自動送信メールの実装
SendGridの導入
まずはメールサーバーを調達しに、SendGridで自動登録します。
登録も済んだし、さっそく使うぞ~!
今日の記事は終わりですね、おやすみなさい!
そんなこともあろうと思って、今回は既に登録をし終えたものを用意しています!
左側のSettingのAPIkeyからAPIKeyをコピーしてきます。
envファイルを書き換えます
MAIL_MAILER=smtp
MAIL_HOST=smtp.sendgrid.net
MAIL_PORT=587
MAIL_USERNAME=apikey
MAIL_PASSWORD={SendGridから入手したAPIキー}
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=自サイトのアドレス
MAIL_FROM_NAME="${APP_NAME}"
SENDGRID_API_KEY={SendGridから入手したAPIキー}
composerを使ってSendGridライブラリをインストール
composer require "sendgrid/sendgrid"
SendGridのメール送信のコード
準備はできたので、コードを書いていきましょう
use SendGrid;
use SendGrid\Mail\Mail;
public function create($id)
{
$user = Auth::id();
$product = Product::with('user')->findOrFail($id);
return view('user.emails.create', compact('user', 'product'));
}
public function send(Request $request)
{
$request->validate([
'name' => ['string', 'max:20', 'required'],
'message' => ['string', 'max:200', 'required'],
]);
$user = User::findOrFail(Auth::id());
$product = Product::with('user')->findOrFail($request->product_id);
//Sendgridの部分はここから
$email = new Mail();
$email->setFrom('運営のメールアドレス', '運営');
$email->setSubject('取引ありがとうございます');
$email->addTo($user->email);
$email->addContent("text/html", strval(
view(
'emails.mail',
compact('user', 'product', 'request')
)
));
$sendgrid = new SendGrid(env('SENDGRID_API_KEY'));
$ownerEmail = new Mail();
$ownerEmail->setFrom('運営のメールアドレス', '運営');
$ownerEmail->setSubject('取引ありがとうございます');
$ownerEmail->addTo($product->user->email);
$ownerEmail->addContent("text/html", strval(
view(
'emails.ownermail',
compact('user', 'product', 'request')
)
));
try {
$sendgrid->send($email);
$sendgrid->send($ownerEmail);
return redirect()
->route('user.trades.show', ['trade' => $request->product_id])
->with([
'message' => 'メールを送信しました',
'status' => 'info'
]);
} catch (Exception $e) {
Log::debug($e->getMessage());
return '送信に失敗しました';
}
//Sendgridの部分はここまで
}
}
内容を説明していくと、一番最初のcreateメゾットは送信フォームです、表には出せない情報(お届け先など)をこちらのフォームで秘密裏に行います
sendメゾットの内容ですが、まずはmailオブジェクトをインスタンス化します
setFromはサイトのメールアドレスとサイト名、setSubjectはメールのタイトルです。
addToは送り先です。今回はフォームが贈られると購入者と出品者の両方に自動送信メールを送ります。
addContentはメール本文の内容ですが、strvalを使うことによってviewファイルや変数を送ることもできます。
そのあと、SENDGRID_API_KEYを利用して、キーのインスタンス化を行います。
あとはtrycatch構文で、購入者と出品者の双方にメールを自動送信するシステムです。
viewファイルの設定
viewファイルを準備しましょう
resources\views\emails\ownermail.blade.phpとmail.blade.phpを作成します
{{ $user->name }}様
<h1>取引の希望をしました</h1>
出品者からの発送を今しばらくお待ちください
<h1>注文情報</h1>
<p>商品名:{{ $product->name }}</p>
<p>出品者:{{ $product->user->name }}</p>
<p>商品説明:{{ $product->comment }}</p>
<p>注文日時:<?php echo date('Y/m/d'); ?></p>
<h1>入力情報</h1>
<p>名前:{{ $request->name }}</p>
<p>送り先:{{ $request->address }}</p>
<p>メッセージ:{{ $request->message }}</p>
<h1>取引後のお願い</h1>
<p>取引ユーザーを評価してください</p>
http://127.0.0.1:8000/profiles/show/{{ $product->user->id }}
<p> このメールはシステムにより自動送信されています。返信されても出品者との連絡はできません。</p>
またのご利用をお待ちしております。
今後ともflower-giftをよろしくお願いいたします。
{{ $product->user->name }}様
<h1>相手から取引のリクエストがありました</h1>
<p>希望相手の送付先へ商品を発送してください</p>
<h1>注文情報</h1>
<p>商品名:{{ $product->name }}</p>
<p>商品説明:{{ $product->comment }}</p>
<p>注文日時:<?php echo date('Y/m/d'); ?></p>
<h1>送り先情報</h1>
<p>名前:{{ $request->name }}</p>
<p>送り先:{{ $request->address }}</p>
<p>メッセージ:{{ $request->message }}</p>
<h1>取引後のお願い</h1>
<p>取引ユーザーを評価してください</p>
http://127.0.0.1:8000/profiles/show/{{ $user->id }}
<p>商品状態を取引終了にしてください</p>
<p> このメールはシステムにより自動送信されています。返信されても出品者との連絡はできません。</p>
またのご利用をお待ちしております。
今後ともflower-giftをよろしくお願いいたします。
テスト
どんな感じに送られるか楽しみだね!
あれっ、メールが届いていないぞ コード間違えたのかな?
1時間後・・・
迷惑メールに入ってた・・・
みんなも、メールが届かないなと思ったら迷惑メールを確認してみよう!
というわけで、届いたメールがこちら
オーナー側
やりますねぇ!!
終わりに
メールコントローラーが太っているのが気になりますねえ・・・
エンジニアは太ったもの(女性以外)は嫌いです
余裕があれば分離するコードを書いてみようか
これで、登録から取引までの最低限の動きは実装できました。次は付随的な機能を実装していきます!