박주니 개발 정리

이메일 전송 본문

라라벨

이메일 전송

박주니 2022. 3. 22. 12:01
728x90
반응형

1. php artisan make:contoller MailController 을 해서 이메일 전송 controller을 만듭니다.

2. .env MAIL 구성과 App\config\mail의 'smtp' 부분을 같이 확인하여 googlemail을 통해 전송될 수 있게 셋팅합니다.

 

.env

MAIL_MAILER=smtp
MAIL_HOST=smtp.googlemail.com
MAIL_PORT=587
MAIL_USERNAME=junhee916@gmail.com
MAIL_PASSWORD=[해당 계정의 비밀번호]
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=junhee916@gmail.com
MAIL_FROM_NAME="${APP_NAME}"

config\mail

        'smtp' => [
            'transport' => 'smtp',
            'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
            'port' => env('MAIL_PORT', 587),
            'encryption' => env('MAIL_ENCRYPTION', 'tls'),
            'username' => env('MAIL_USERNAME'),
            'password' => env('MAIL_PASSWORD'),
            'timeout' => null,
            'auth_mode' => null,
        ],

참고할 부분

  • .env에서 수정한 부분은 MAIL_HOSTsmtp.googlemail.com으로 수정했습니다. 이유는 구글 계정으로 상대방에게 메일을 보낼 것이기 때문입니다.
  • MAIL_PORT는 config\mail에 port와 동일한 번호 587로 진행했습니다. 동일하지 않으면 포트를 확인 못합니다.
  • MAIL_USERNAME, MAIL_PASSWORD에 제 구글 계정 id와 비밀번호를 입력했습니다. 이유는 그 계정에 접속이 가능해야지만 그 메일을 통해 상대방에게 보낼 수 있기 때문입니다.
  • MAIL_ENCRYPTION을 config\mail에 encryption과 동일하게 맞췄습니다. 

3. 설정을 다 맞췄으면 해당 구글 계정에 들어가 보안수준이 낮은 앱의 엑세스를 사용합니다. 이유는 전송 버튼과 동시에 상대방에게 설정한 구글 계정에서 메일을 전송해야하기 때문에 보안 설정이 되어있으면 접근 자체가 허용되지 않기 때문입니다.

참고할 부분

  • Google 계정관리 -> 보안 -> 보안 수준이 낮은 앱의 엑세스 

4. php artisan make:mail TestMail 합니다.

이해해야할 부분

  • MailController에서 관리자 계정에서 상대 유저의 이메일 찾아서 보내고자하는 데이터와 같이 TestMail에다가 보내면 TestMail은 그 받은 데이터를 통해 template를 어떻게 구성해서 상대 유저 이메일로 전송합니다. 

5. web.php에서 /send-email/{user} 을 하면 MailController sendEmail class로 이동할 수 있게 경로를 설정합니다.

Route::get('/send-email/{user}', [App\Http\Controllers\MailController::class, 'sendEmail']);

참고할 부분

  • /send-email/{user} 을 한 이유는 보통 관리를 할 때 상대 유저마다 사용하는 email이 다르기 때문에 그 유저를 확인하고 그 데이터에서 email을 가지고 와서 보내기 위함입니다. 

6. MailController sendEmail에서 해당 queryString에 따른 user data email을 가지고 와서 Mail::to에 넣고 보내고자 하는 구성 데이터를 배열에 담아 TestMail에다가 보낼 수 있게 설정합니다.

<?php

namespace App\Http\Controllers;

use App\Models\User;
use App\Mail\TestMail;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class MailController extends Controller
{
    public function sendEmail($user)
    {
        $user = User::find($user);
        $user_email = $user->email;
        $details = [
            'title' => 'Mail from Surfside Media',
            'body' => 'This is for testing mail using gmail'
        ];

        Mail::to($user_email)->send(new TestMail($details));
        return "Email Sent";
    }
}

적용 순서

  1. use App\Models\User, use App\Mail\TestMail을 연결합니다. 
    • use App\Models\User을 연결한 이유는 해당 유저를 찾아 email을 Mail::to에 대입하기 위함입니다.
    • use App\Mail\TestMail은 상대 유저 email로 보낼 준비가 되었다면 어떤 데이터를 담아서 보낼 것인지 TestMail에다가 그 데이터를 보내기 위함입니다. 
  2. Mail::to($user_email)을 해서 상대 유저 email을 대입합니다.
  3. $details에 TestMail에 전달할 데이터를 배열 구성으로 넣습니다. 
  4. send(new TestMail($details)) 을 해서 TestMail에 $details 배열이 전달할 수 있게 셋팅합니다. 
  5. return "Email sent";로 해서 정상적으로 보내졌을 때 "Email sent"가 나오게 합니다. 

7. TestMail에 __construct에 $details를 담아 emails.TestMail 프론트에 데이터를 전달할 수 있게 셋팅을 하고 build에는 상대 유저 이메일에 전송이 되었을 때 제목과 그 제목을 눌렀을 때 보여질 화면에 프론트를 연결합니다.

<?php

namespace App\Mail;

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

class TestMail extends Mailable
{
    use Queueable, SerializesModels;

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

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->subject('Test Mail From Surfside Media')->view('emails.TestMail');
    }
}

이해해야할 부분

  • 먼저 public $details를 해서 mailController에서 전달한 $details를 받을 준비를 하고 그 구성을 __construct에 넣어서 진행한다고 보시면 됩니다. 이때 __construct 역할은 compact()로 해서 데이터를 프론트에 전달했던 원리랑 비슷하다고 보시면 됩니다.
  • build는 화면단위이기 때문에 subject는 하단에 이미지처럼 상대유저에게 보내지고 열면 view 단위에 구성한 폼이 보여지게 됩니다.
    build - subject 이해참고


build - view 이해참고

8. 상대 유저에게 보낼 이메일 폼 html을 만듭니다. view('emails.TestMail')을 했으니 resource\views에 만들어서 진행했습니다. 그리고 __construct에서 $details 데이터를 프론트에다가 가지고 올 수 있게 셋팅합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Test Mail</title>
</head>
<body>
    <h1>{{ $details['title'] }}</h1>
    <p>{{ $details['body'] }}</p>
    <p>Thank You</p>
</body>
</html>

9. /send-email/{user} url 입력해서 제대로 메일이 전송되는 지 확인합니다.

참고할 부분

  • 제대로 보내졌다면 아까 MailController에서 return에 기재된 내용이 나와야합니다.
  • 예를 들어서 1을 했을 경우 User::find(1) 즉 user db에서 첫번째 row을 가지고 오겠다는 의미이기 때문에 하실 때 db 데이터를 미리 만들고 그 email에는 확인할 수 있는 상대 email을 넣으시면 됩니다.
  • Email Sent라는 문구를 확인하시고 상대측 이메일로 접속했을 때 7번 참고 이미지 내용과 동일한 내용을 확인할 수 있을 것입니다.
728x90
반응형
Comments