Laravel에서 사용자 지정 이메일 확인을 보내는 방법

이메일 확인은 사용자 계정과 연결된 이메일 주소가 유효하고 실제 사용자의 것인지 확인하는 프로세스입니다. 이는 사용자가 자신의 이메일 주소를 확인하기 위해 클릭해야 하는 링크가 포함된 확인 이메일을 사용자의 이메일 주소로 전송하여 수행됩니다.

이메일 확인은 스팸, 피싱 및 기타 형태의 남용으로부터 웹사이트 또는 앱을 보호하는 데 도움이 되는 중요한 보안 수단입니다. 사용자에게 이메일 주소를 확인하도록 요구함으로써 합법적인 사용자만 계정을 만들고 콘텐츠에 액세스할 수 있도록 할 수 있습니다.

이 튜토리얼에서는 Laravel 9에서 사용자 지정 이메일 확인을 보내는 방법을 배웁니다. 사용자 지정 이메일 확인을 위해 아래 단계를 따르십시오.

  • 1단계: Laravel 프로젝트 설치
  • 2단계: 마이그레이션 테이블 생성
  • 3단계: 모델 생성 및 모델 업데이트
  • 4단계: 경로 생성
  • 5단계: 컨트롤러 생성
  • 6단계: 블레이드 파일 생성
  • 7단계: 미들웨어 생성
  • 8단계: 이메일 구성

1단계: Laravel 프로젝트 설치

먼저 터미널을 열고 다음 명령을 실행하여 새로운 laravel 프로젝트를 만듭니다.

composer create-project --prefer-dist laravel/laravel custom-email

또는 Laravel Installer를 글로벌 컴포저 의존성으로 설치한 경우:

laravel new custom-email

 2단계: 마이그레이션 테이블 생성

테이블을 생성 users_verify 하고 email_verified_at 사용자 테이블에 열이 있으면 추가할 필요가 없습니다.

<?php
  
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
  
class UsersVerify extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users_verify', function (Blueprint $table) {
            $table->integer('user_id');
            $table->string('token');
            $table->timestamps();
        });
  
        // Already column exist in users table then skip this add new column
        Schema::table('users', function (Blueprint $table) {
            $table->boolean('email_verified_at')->default(0);
        });
    }
  
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users_verify');
        
        // Already column exist in users table then skip this add new column
        Schema::table('users', function (Blueprint $table) {
            if (Schema::hasColumn('users', 'email_verified_at')) {
                $table->dropColumn('email_verified_at');
            }
        });
    }
}

3단계: 모델 생성 및 모델 업데이트

이 단계에서는 email_verified_at User 모델의 채울 수 있는 배열에 필드를 추가하고 UserVerify아래와 같이 라는 새 모델을 만들어야 합니다.

앱/모델/User.php

<?php
  
namespace App\Models;
  
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
  
class User extends Authenticatable
{
    use HasFactory, Notifiable;
  
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
        'email_verified_at'
    ];
  
    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];
  
    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

앱/모델/UserVerify.php

<?php
  
namespace App\Models;
  
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
  
class UserVerify extends Model
{
    use HasFactory;
  
    protected $table = "users_verify";
  
    /**
     * Write code on Method
     *
     * @return response()
     */
    protected $fillable = [
        'user_id',
        'token',
    ];
  
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

4단계: 경로 생성

이 단계에서는 이메일 확인을 위한 사용자 지정 경로를 생성해야 합니다. 따라서 routes/web.php파일을 열고 다음 경로를 추가하십시오.

경로/web.hp

<?php
  
use Illuminate\Support\Facades\Route;
  
use App\Http\Controllers\Auth\AuthController;
  
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
  
Route::get('login', [AuthController::class, 'index'])->name('login');
Route::post('post-login', [AuthController::class, 'postLogin'])->name('login.post'); 
Route::get('registration', [AuthController::class, 'registration'])->name('register');
Route::post('post-registration', [AuthController::class, 'postRegistration'])->name('register.post'); 
Route::get('logout', [AuthController::class, 'logout'])->name('logout');
  
/* New Added Routes */
Route::get('dashboard', [AuthController::class, 'dashboard'])->middleware(['auth', 'verify_email']); 
Route::get('account/verify/{token}', [AuthController::class, 'verifyAccount'])->name('user.verify'); 

5단계: 컨트롤러 생성

이 단계에서는 AuthController를 생성해야 합니다. postRegistration()및 메서드 에 대한 코드를 업데이트했습니다 verifyAccount(). 아래와 같이 복사해 보겠습니다.

앱/Http/Controllers/Auth/AuthController.php

<?php
  
namespace App\Http\Controllers\Auth;
  
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Session;
use App\Models\User;
use App\Models\UserVerify;
use Hash;
use Illuminate\Support\Str;
use Mail; 
  
class AuthController extends Controller
{
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function index()
    {
        return view('auth.login');
    }  
      
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function registration()
    {
        return view('auth.registration');
    }
      
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function postLogin(Request $request)
    {
        $request->validate([
            'email' => 'required',
            'password' => 'required',
        ]);
   
        $credentials = $request->only('email', 'password');
        if (Auth::attempt($credentials)) {
            return redirect()->intended('dashboard')
                        ->withSuccess('You have Successfully loggedin');
        }
  
        return redirect("login")->withSuccess('Oppes! You have entered invalid credentials');
    }
    
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function postRegistration(Request $request)
    {  
        $request->validate([
            'name' => 'required',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:6',
        ]);
           
        $data = $request->post();
        $createUser = $this->create($data);
  
        $token = Str::random(64);
  
        UserVerify::create([
              'user_id' => $createUser->id, 
              'token' => $token
            ]);
  
        Mail::send('email.emailVerificationEmail', ['token' => $token], function($message) use($request){
              $message->to($request->email);
              $message->subject('Email Verification Mail');
          });
         
        return redirect("dashboard")->withSuccess('Great! You have Successfully loggedin');
    }
    
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function dashboard()
    {
        if(Auth::check()){
            return view('dashboard');
        }
  
        return redirect("login")->withSuccess('Opps! You do not have access');
    }
    
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function create(array $data)
    {
      return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password'])
      ]);
    }
      
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function logout() {
        Session::flush();
        Auth::logout();
  
        return Redirect('login');
    }
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function verifyAccount($token)
    {
        $verifyUser = UserVerify::where('token', $token)->first();
  
        $message = 'Sorry your email cannot be identified.';
  
        if(!is_null($verifyUser) ){
            $user = $verifyUser->user;
              
            if(!$user->email_verified_at) {
                $verifyUser->user->email_verified_at = 1;
                $verifyUser->user->save();
                $message = "Your e-mail is verified. You can now login.";
            } else {
                $message = "Your e-mail is already verified. You can now login.";
            }
        }
  
      return redirect()->route('login')->with('message', $message);
    }
}

6단계: 블레이드 파일 생성

여기서는 이메일 전용 블레이드 파일을 만들어야 합니다. 이제 파일을 하나씩 만들어 봅시다.

리소스/보기/이메일/emailVerificationEmail.blade.php

<h1>Email Verification Mail</h1>
  
Please verify your email with bellow link: 
<a href="{{ route('user.verify', $token) }}">Verify Email</a>

7단계: 미들웨어 생성

여기서는 사용자 이메일 인증 여부를 확인하기 위한 미들웨어를 생성해야 합니다. 그럼 아래와 같이 생성해 보겠습니다.

php artisan make:middleware VerifyEmail

앱/Http/미들웨어/IsVerifyEmail.php

<?php
  
namespace App\Http\Middleware;
  
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
  
class VerifyEmail
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        if (!Auth::user()->email_verified_at) {
            auth()->logout();
            return redirect()->route('login')
                    ->with('message', 'You need to confirm your account. We have sent you an activation code, please check your email.');
          }
   
        return $next($request);
    }
}

앱/Http/Kernel.php

protected $routeMiddleware = [
    ....
    'verify_email' => \App\Http\Middleware\VerifyEmail::class,
];

8단계: 이메일 구성

이 단계에서는 파일에 이메일 구성을 추가합니다 .env. 컨트롤러에서 비밀번호 링크를 재설정하기 위해 이메일을 보낼 것이기 때문입니다.

.env

MAIL_DRIVER=smtp
MAIL_HOST=<YOUR SMTP HOST>
MAIL_PORT=<YOUR SMTP PORT>
MAIL_USERNAME=<YOUR SMTP USERNAME>
MAIL_PASSWORD=<YOUR SMTP PASSWORD>
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=<YOUR MAIL FROM ADDRESS>

행복한 코딩!!!

1.25 GEEK