[PHP]Laravel-05 SMTP(Mailing)

Dev_Honey·2022년 11월 11일
0

Laravel

목록 보기
5/5
post-thumbnail

SMTP

단순 전자우편 전송 프로토콜(SMTP)이란?
단순 전자우편 전송 프로토콜(SMTP)은 네트워크를 통해 전자우편(이메일)을 전송하는 기술 표준입니다. 다른 네트워킹 프로토콜과 마찬가지로 컴퓨터와 서버는 SMTP를 이용하여 기반 하드웨어나 소프트웨어와 관계없이 데이터를 교환할 수 있습니다. 편지 봉투에 표준화된 주소 양식을 사용해서 우편 서비스가 이루어지는 것처럼, SMTP 덕분에 이메일이 발신자에게서 수신자에게로 이동하는 방식이 표준화되므로 광범위하게 이메일을 전송할 수 있습니다.
SMTP는 메일 검색 프로토콜이 아니라 메일 전송 프로토콜입니다. 우편 서비스로 우편함에 우편물이 전달되더라도 수신자는 우편함에서 우편물을 찾아야 합니다. 마찬가지로 SMTP도 이메일 공급자의 메일 서버로 이메일을 전송하지만, 수신자가 메일 서버에서 이메일을 검색해 읽는 데는 별도의 프로토콜이 이용됩니다.

SMTP의 작동 방식은?
모든 네트워킹 프로토콜은 미리 정의한 데이터 교환 프로세스를 따릅니다. SMTP는 이메일 클라이언트와 메일 서버 간의 데이터 교환 프로세스를 정의합니다. 사용자는 이메일 클라이언트와 상호 작용합니다. 이메일 클라이언트는 사용자가 액세스하여 이메일을 전송하는 컴퓨터나 웹 응용 프로그램을 말합니다. 메일 서버는 이메일의 전송, 수신, 전달을 위한 특화된 컴퓨터입니다. 사용자는 메일 서버와 직접 상호 작용하지 않습니다.

다음은 이메일 클라이언트와 전자 메일 서버 사이에서 이메일 전송이 시작되는 과정을 요약한 내용입니다.
SMTP 연결 열림: SMTP는 전송 프로토콜로 전송 제어 프로토콜(TCP)을 이용하므로 첫 번째 단계는 클라이언트와 서버 간 TCP 연결로 시작됩니다. 그 다음 이메일 클라이언트가 특화된 "Hello" 명령(HELO 또는 EHLO, 아래 설명됨)으로 이메일 전송 프로세스를 시작합니다.
이메일 데이터 전송: 클라이언트가 이메일 헤더(대상 및 제목 줄 포함), 이메일 본문, 기타 추가 구성 요소로 이루어진 실제 이메일 콘텐츠와 함께 일련의 명령을 서버에 보냅니다.
메일 전송 에이전트(MTA): 서버가 메일 전송 에이전트(MTA)라는 프로그램을 실행합니다. MTA는 수신자의 이메일 주소 도메인을 확인하고 발신자와 다를 경우 수신자의 IP 주소를 찾도록 도메인 네임 시스템(DNS)에 쿼리합니다. 이는 우체국에서 우편물 수신자의 우편번호를 조회하는 것과 비슷합니다.
연결 닫힘: 데이터 전송이 완료되면 클라이언트가 서버에 알림을 보내며 서버가 연결을 닫습니다. 이때 클라이언트가 SMTP 연결을 새로 열지 않는 한 서버는 클라이언트로부터 이메일 데이터를 추가로 받지 않습니다.
일반적으로, 이 첫 번째 이메일 서버는 이메일의 실제 최종 목적지가 아닙니다. 클라이언트로부터 이메일을 수신한 서버는 다른 메일 서버와 이러한 SMTP 연결 프로세스를 반복합니다. 최종적으로 이메일이 수신자의 이메일 공급자가 제어하는 메일 서버 내 수신자의 받은메일함에 도착할 때까지, 두 번째 서버도 같은 작업을 수행합니다.

우편이 발신자에게서 수신자에게로 이동하는 과정과 이 프로세스를 비교해봅시다. 우편 집배원은 발신자에게서 수신자에게로 직접 편지를 전달하지 않습니다. 우편 집배원은 그 대신 편지를 우체국으로 가져갑니다. 우체국은 편지를 다른 도시의 다른 우체국으로 보내고, 또 다른 우체국으로 가며, 이는 편지가 수신자에게 도착할 때까지 계속됩니다. 마찬가지로 이메일도 수신자의 받은메일함에 도착할 때까지 SMTP를 통해 서버에서 서버로 이동합니다.

SMTP에서 사용하는 포트는?
네트워킹에서 포트란 네트워크 데이터를 수신하는 가상 지점입니다. 우편 주소에 있는 아파트 번호라고 생각해보세요. 컴퓨터가 네트워킹 데이터를 올바른 응용 프로그램으로 정렬하는 데 포트가 도움을 줍니다. 방화벽과 같은 네트워크 보안 조치로 불필요한 포트를 차단하여 악의적 데이터의 전송 및 수신을 방지할 수 있습니다.
이전에 SMTP에는 포트 25만 사용했습니다. 현재도 SMTP에 포트 25를 여전히 사용하고 있으나 포트 465, 587, 2525를 사용하기도 함

  • 포트 25는 SMTP 서버 사이를 연결하는 데 가장 많이 사용
  • 포트 465는 보안 소켓 계층(SSL) 암호화와 함께 SMTP에 사용하도록 지정되었습니다. 하지만 SSL은 Transport Layer Security(TLS)으로 대체되어, 최신 이메일 시스템에서는 이 포트를 사용하지 않습니다. 레거시(이전) 시스템에서만 나타납니다.
  • 포트 587이 이메일 제출용 기본 포트입니다. 이 포트를 통과하는 SMTP 통신은 TLS 암호화를 이용
  • 포트 2525는 SMTP와 공식적으로 연결되어 있지는 않지만, 일부 이메일 서비스에서는 앞서 언급한 포트가 차단되었을 경우 이 포트로 SMTP 전송이 제공

내가 적용한 코드 in Laravel framework version 7
나는 라라벨에서 지원해주는 라이브러리를 이용하였다.

//.env파일
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=메일주소
MAIL_PASSWORD=gmail에서 smtp 사용할 때 만들어놓은 앱키
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=메일주소
MAIL_FROM_NAME="${APP_NAME}"
#/config/mail.php
<?php
return [
    /*
    |--------------------------------------------------------------------------
    | Mail Driver
    |--------------------------------------------------------------------------
    |
    | Laravel supports both SMTP and PHP's "mail" function as drivers for the
    | sending of e-mail. You may specify which one you're using throughout
    | your application here. By default, Laravel is setup for SMTP mail.
    |
    | Supported: "smtp", "sendmail", "mailgun", "ses",
    |            "postmark", "log", "array"
    |
    */
    'driver' => env('MAIL_DRIVER','smtp'),
    /*
    |--------------------------------------------------------------------------
    | SMTP Host Address
    |--------------------------------------------------------------------------
    |
    | Here you may provide the host address of the SMTP server used by your
    | applications. A default option is provided that is compatible with
    | the Mailgun mail service which will provide reliable deliveries.
    |
    */
    'host' => env('MAIL_HOST','smtp.gmail.com'),
    /*
    |--------------------------------------------------------------------------
    | SMTP Host Port
    |--------------------------------------------------------------------------
    |
    | This is the SMTP port used by your application to deliver e-mails to
    | users of the application. Like the host we have set this value to
    | stay compatible with the Mailgun e-mail application by default.
    |
    */
    'port' => env('MAIL_PORT',587),
    /*
    |--------------------------------------------------------------------------
    | Global "From" Address
    |--------------------------------------------------------------------------
    |
    | You may wish for all e-mails sent by your application to be sent from
    | the same address. Here, you may specify a name and address that is
    | used globally for all e-mails that are sent by your application.
    |
    */
    'from' => [
        'address' => 'env에서 불루와서 사용해도되고, 바로 메일 입력해도되고',    
        'name' => '메일 보내는 사람의 이름 예) (주)다있어'
    ],
    /*
    |--------------------------------------------------------------------------
    | E-Mail Encryption Protocol
    |--------------------------------------------------------------------------
    |
    | Here you may specify the encryption protocol that should be used when
    | the application send e-mail messages. A sensible default using the
    | transport layer security protocol should provide great security.
    |
    */
    'encryption' => env('MAIL_ENCRYPTION','tls'),
    /*
    |--------------------------------------------------------------------------
    | SMTP Server Username
    |--------------------------------------------------------------------------
    |
    | If your SMTP server requires a username for authentication, you should
    | set it here. This will get used to authenticate with your server on
    | connection. You may also set the "password" value below this one.
    |
    */
    'username' => env('MAIL_USERNAME'),
    'password' => env('MAIL_PASSWORD'),
    /*
    |--------------------------------------------------------------------------
    | Sendmail System Path
    |--------------------------------------------------------------------------
    |
    | When using the "sendmail" driver to send e-mails, we will need to know
    | the path to where Sendmail lives on this server. A default path has
    | been provided here, which will work well on most of your systems.
    |
    */
    'sendmail' => '/usr/sbin/sendmail -t',
    'pretend' => false,
    /*
    |--------------------------------------------------------------------------
    | Markdown Mail Settings
    |--------------------------------------------------------------------------
    |
    | If you are using Markdown based email rendering, you may configure your
    | theme and component paths here, allowing you to customize the design
    | of the emails. Or, you may simply stick with the Laravel defaults!
    |
    */
    'markdown' => [
        'theme' => 'default',
        'paths' => [
            resource_path('views/vendor/mail'),
        ],
    ],
    /*
    |--------------------------------------------------------------------------
    | Log Channel
    |--------------------------------------------------------------------------
    |
    | If you are using the "log" driver, you may specify the logging channel
    | if you prefer to keep mail messages separate from other log entries
    | for simpler reading. Otherwise, the default channel will be used.
    |
    */
    'log_channel' => env('MAIL_LOG_CHANNEL'),
];

메일을 보내기 위한 API를 만들었다.
Api 실행은 Postman을 활용하여 진행
Postman의 설치는
https://www.postman.com/downloads/
아래처럼 라우트도 만들어줘서, 포스트맨으로 api호출할 수 있도록 하였다.
Route::post('/report/mail',[컨트롤러이름::class,'mailing']);

//app/Http/Controllers/컨트롤러이름.php
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\DB;
use Mail;
class 컨트롤러이름 extends Controller
{
    //SMTP Function
    public function mailing(Request $request)
    {
    $mailData = array(
                'a' => $a,
                'b' => $b
            );
            //메일 보내기
            //reportmail은 php blade 이다.
            Mail::send('emails.reportmail', $mailData, function($message) use ($mailData)
            {
                $message->from('이메일주소', '회사이름');
                $message
                ->to($mailData['email'], $mailData['name'],$mailData['mobile'])
                ->subject("메일 제목")
                ->attach('파일경로(확장자까지)']);
            });
            // // dd("Email is sent successfully.");        
            return response()->json(
                [
                    'code' => 200,
                    'message' => 'success'
                ]
            );
        }
        else{
            return response("유효하지 않습니다.",404);
        }
    }         
}
// 위에서 메일을 보낼 때 사용한 php blade
<!DOCTYPE html>
<html>
<head>
    <title>Mailing Service</title>
</head>
<body>
메일 입니다.
여기에는 html태그로 메일 형태를 원하는 내용을 담아서 작성해주면 됩니다.
표를 만들고 싶으면 table만드는 태그를 강조,링크 등등 html 코드로 작성하면 됩니다.
</body>
</html>


이렇게 메일을 받을 수 있다.

출처 및 참조

https://www.cloudflare.com/ko-kr/learning/email-security/what-is-smtp/ 단순 전자우편 전송 프로토콜(SMTP)이란?

profile
자습서 같은 공부 블로그 만들기!

0개의 댓글