TKngDisuke
@TKngDisuke (大輔 徳永)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

[Laravel]メール送信機能を使う時のConnection could not be established with host smtp.mailtrap.io :stream_socket_client(): というエラー

解決したいこと

[Laravel]メール送信機能を使う時のConnection could not be established with host smtp.mailtrap.io :stream_socket_client(): : unable to connect to tcp://smtp.mailtrap.io:2525 (Operation timed out)

例)
LaravelでECサイトをつくっています。
メール送信機能を作るためににこのサイト(https://note.com/mukae9/n/n103587d08ef2) 
を参考にしました。
購入画面から購入ボタンを押すとメールが送られるはずなのですが、エラーが出ます。

発生している問題・エラー

Connection could not be established with host smtp.mailtrap.io :stream_socket_client(): unable to connect to tcp://smtp.mailtrap.io:2525 (Operation timed out)

というエラーが出ています。
Mailtrapを使いメールがLaravelから送信されているかどうかを確認していますが、メールは送信されずコネクションがつながっていないようです。
Mailtrapのアカウントを作り、Laravel7+でのenv情報をvi.envで編集して更新したのに関わらずうまく接続されていません。
ファイル一覧はこちらです。

該当するソースコード

メールの送信機能を司るファイル

Thanks.php
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class Thanks extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($mail_data) //編集
    {
        $this->mail_data = $mail_data; //追記
    } 

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->markdown('mails.thanks',$this->mail_data) //編集
                    ->subject('Larashopでのご購入ありがとうございます'); //追記
    }
}

メールの本文が記載されるファイルです

thanks.blade.php
@component('mail::message')

この度はLarashopでのご購入ありがとうございます。<br>

お客様が購入した商品は<br>

@foreach ($checkout_items as $item)
・{{ $item->product->name }}|{{ $item->product->price }}円
<br>
@endforeach

となります。<br>

下記の決済画面より決済を完了させてください。<br>

@component('mail::button', ['url' => ''])
決済画面へ
@endcomponent

<br>
{{ config('app.name') }}
@endcomponent

自分で試したこと

envファイルを確認したところ、元からmail関連の設定が書いてあったので消して上書きしておきました。

もう一個質問があり、

CartController.php
    public function checkout(Request $request,Cart $cart)
   {
       $user = Auth::user();
       $mail_data['user']=$user->name; //追記
       $mail_data['checkout_items']=$cart->checkoutCart(); //編集
       Mail::to($user->email)->send(new Thanks($mail_data));//編集
       return view('checkout');

   }

Cart model

Cart.php
    public function checkoutCart()
    {
        $user_id = Auth::id();
        $checkout_items=$this->where('user_id', $user_id)->get();
        $this->where('user_id', $user_id)->delete();
        return $checkout_items;
    }

Cartモデルには商品のidとuserid等が入っており、商品情報はないのでthnaks.blade.phpではitem->product->nameと書いてproductメソッドを使わないとproductの中の情報を引き継げません。(ただ、checkout_itemsにproductメソッドを使えばproductの情報を引き出せるのか?)

CartのcheckoutCart関数内で$checkout_items=$this->where('user_id', $user_id)->get();ではなく
$checkout_items=$this->where('user_id', $user_id)->product->get();
をしないといけませんか?

0

2Answer

二つ目の問題について、with関数を使えばproductを引き続けます。

$checkout_items=$this->where('user_id', $user_id)->with('product')->get();
dd($checkout_items->product); //checkout_items関連のproduct

また、with関数は色々な使い方があります。
->with(['product', 'user'])で複数の関連データを引き続き。

->with(['product' => function($query){
    $query->select('id, name');
}])
//と
->with(['product:id,name']);
//は同じです
1Like

Comments

  1. @TKngDisuke

    Questioner

    なるほど!詳しく解説ありがとうございます!

ポートを25か465、587、2525に変えて試してみてください。
二つ目の質問については別の質問として投稿してください。

0Like

Comments

  1. @TKngDisuke

    Questioner

    ポートを変えるというのはenvファイルのDBPORT=3306を変えるのか
    MAILPORTですか?とりあえず、メールポートで変えようと思います。
  2. @TKngDisuke

    Questioner

    メールポートを変えたらなぜかうまくいきました!Mailtrapのenv情報だと何故かうまくつながらないんですね。。
    理由はよくわかりませんが、うまく接続できました!
    ちなみにどういった理由でこれはうまくいったのかわかりますか?
  3. ファイヤーウオールの原因かもしれません。
  4. @TKngDisuke

    Questioner

    ファイヤーウォールですか
    なるほど!!

Your answer might help someone💌