Twilio SendGrid 및 Mezzio를 사용하여 PHP로 이메일을 보내는 방법

게시 됨: 2021-03-24

이메일은 그 어느 때보다도 중요한 커뮤니케이션 도구입니다. 이메일을 더 잘 활용할 수 있도록 PHP의 Mezzio 프레임워크와 Twilio SendGrid의 API를 사용하여 이메일을 보내는 방법을 보여 드리겠습니다.

특히, PDF 첨부 파일이 포함된 일반 텍스트와 HTML 본문이 모두 포함된 이메일을 보내는 방법을 배우게 됩니다. 또한 Twilio SendGrid의 트랜잭션 템플릿 기능을 사용하여 개발 팀과 조직 내 다른 팀 모두에서 이메일 본문을 더 간단하게 만드는 방법을 배우게 됩니다.

좋은 소리? 의 시작하자.

빠른 애플리케이션 개요

이 튜토리얼을 더 의미 있게 만드는 방법으로, 우리가 작성할 코드가 The Little PHP Shop 이라는 이름의 Mezzio로 구축된 가상의 온라인 전자 상거래 상점 의 일부라고 가정 합니다. 특히 고객이 구매한 직후의 부분입니다. 사용자 흐름의 해당 지점에서 고객은 구매에 대해 감사하는 이메일을 받고 기록용 PDF 송장이 포함됩니다.

고객이 완료한 주문에서 구매 세부 정보를 수신하는 구매 후 이메일을 보내기 위해 Handler 클래스를 만들 것입니다. 해당 구매 정보를 사용하여 Handler 클래스는 SendGrid PHP API의 여러 클래스를 사용하여 구매 확인 이메일을 작성하고 보냅니다.

이 중 가장 중요한 것은 "SendGrid\Mail\Mail" 및 "\SendGrid"입니다. "SendGrid\Mail\Mail"은 Twilio SendGrid를 통해 보낼 이메일 메시지의 모든 속성을 저장하는 개체입니다. "SendGrid" 개체는 전송 계층을 형성하여 Twilio SendGrid를 통한 이메일 전송을 용이하게 합니다.

전제 조건

이 자습서를 완료하려면 로컬 개발 환경에서 다음 4가지 항목이 필요합니다.

  1. Twilio SendGrid 계정
  2. cURL , mbstring Open SSL 확장이 설치되고 활성화 PHP 7.4
  3. Composer는 전 세계적으로 설치됨
  4. 곱슬 곱슬하다

Mezzio 애플리케이션 스캐폴드

먼저 기본 응용 프로그램을 만들어야 합니다. 그렇게 하기 위해 우리는 항상 그렇듯이 Mezzio Skeleton 을 사용하여 이를 수행할 것입니다. 기본 애플리케이션을 스캐폴딩하면 새로 생성된 프로젝트 디렉토리로 전환합니다. 그런 다음 첫 번째 명령의 프롬프트에 따라 터미널에서 다음 명령을 실행합니다.

필요한 종속성 설치

프로젝트 스캐폴드를 사용하여 프로젝트를 완료하려면 3개의 추가 종속성을 추가해야 합니다. 이것들은:

  • Twilio SendGrid API 와 상호 작용하기 위한 Twilio SendGrid의 PHP API 라이브러리
  • HTTP 요청을 보내기 위한 PHP HTTP 클라이언트
  • 환경 변수 저장 및 검색을 위한 PHP Dotenv

설치하려면 터미널에서 다음 명령을 실행하십시오.

PHP Dotenv 초기화

종속성이 설치된 상태에서 PHP Dotenv를 로드하여 ".env"에 설정된 변수를 읽고 PHP에서 환경 변수로 사용할 수 있도록 합니다. 이렇게 하려면 "require vendor/autoload.php" 바로 뒤에 있는 "public/index.php"에 다음 코드를 삽입합니다.

Twilio SendGrid 계정 세부 정보 추가

이제 SendGrid API 키로 애플리케이션을 제공해야 합니다. 그렇게 하려면 Twilio SendGrid 에 로그인한 후 "설정 -> API 키로 이동합니다. " 일단 거기 :

  1. API 키를 생성하려면 " API 키 생성 "을 클릭하십시오.
  2. 새 API 키에 이름을 지정하고 기본 API 키 권한 " 전체 액세스 " 수락한 다음 " 생성 및 보기 " 를 클릭합니다.

API 키가 생성된 상태에서 키를 클릭하여 복사한 다음 " 완료 . "

그런 다음 파일에 "SENDGRID_DEFAULT_SENDER_ADDRESS" 및 "SENDGRID_DEFAULT_SENDER_NAME" 키를 2개 더 추가합니다. 이름에서 알 수 있듯이 재정의되지 않는 한 애플리케이션에서 보낸 모든 이메일에 사용할 이메일 주소와 이름입니다.

참고: 이렇게 하려면 발신자 인증 에서 "단일 발신자 확인" 테이블에 "확인됨"으로 표시되어 있는지 확인합니다.

애플리케이션 메일 구성 세부정보 설정

Twilio SendGrid API 키 외에도 몇 가지 다른 전역 메일 구성 설정을 저장할 것입니다. 특히 모든 이메일 메시지에 사용할 이메일 주소와 이름을 보낸 사람과 답장으로 설정합니다. 그렇게 하면 매번 설정할 필요가 없습니다.

우리는 또한 2개의 이메일 본문 템플릿을 만들 것입니다. 하나는 일반 텍스트 이메일용이고 다른 하나는 HTML 이메일용입니다. 그렇게 하려면 "config/autoload"에서 "mail.global.php"라는 새 파일을 만들고 그 안에 다음 코드를 추가합니다.

메일 개체를 인스턴스화하는 클래스 만들기

주요 응용 프로그램 구성 세부 정보가 설정되면 이제 기본 속성이 설정된 기본 메일 개체를 인스턴스화하는 클래스를 생성해 보겠습니다. 그렇게 하려면 새 디렉토리 "src/App/src/Mailer"에 "SendGridMailMessageFactory.php"라는 새 파일을 만들고 그 안에 아래 코드를 추가합니다.

클래스를 호출하면 클래스는 애플리케이션의 DI(종속성 주입) 컨테이너에 액세스할 수 있으며 여기에서 "config/autoload/mail.global.php"에 저장한 구성 세부 정보를 검색합니다.

그런 다음 새 "SendGrid\Mail\Mail" 개체를 인스턴스화하고 "Mail", "setFrom" 및 "setReplyTo" 메서드 호출에 각각의 구성 세부 정보를 전달하여 세부 정보에서 보낸 사람과 회신을 설정합니다. 그런 다음 인스턴스화된 "Mail" 개체를 반환합니다.

단, 사용하려면 DI 컨테이너에 등록해야 합니다. 그렇게 하려면 "src/App/src/ConfigProvider"에서 "getDependencies" 메서드에서 반환된 배열의 "factories" 요소에 다음 항목을 추가합니다.

이메일을 보낼 핸들러 생성

다음으로 이메일을 작성하고 보내기 위한 Handler 클래스를 생성해야 합니다. 이를 위해 아래 명령을 실행하여 Composer를 통해 제공되는 Mezzio의 CLI 도구 를 사용합니다.

위의 명령을 실행하면 다음 네 가지 작업이 수행됩니다.

  1. C 는 "src/App/Handler/EmailSenderHandler.php"라는 새로운 Handler 클래스를 생성합니다.
  2. 핸들러 클래스 "src/App/Handler/EmailSenderHandlerFactory.php"를 인스턴스화하는 팩토리 클래스를 생성합니다.
  3. 필요하지 않은 템플릿 파일("src/App/templates/app/email-sender.html.<ext>")을 생성합니다 . 파일 이름 "<ext>"는 "create-project" 단계에서 선택한 템플릿 엔진 에 의해 결정됩니다.
  4. "config/autoload/mezzio-tooling-factories.global.php" 항목을 추가하여 새 핸들러 클래스를 DI 컨테이너에 서비스로 등록합니다.

이메일을 보내도록 핸들러 리팩토링

"EmailSenderHandler.php"가 생성되었으므로 이제 이메일을 보낼 수 있도록 리팩토링해야 합니다. 이를 위해 먼저 "EmailSenderHandler의" 생성자를 리팩터링하여 "TemplateRendererInterface" 매개변수를 3개의 새 매개변수로 교체합니다. 다음은 3개의 새 클래스 멤버 변수를 초기화합니다.

  • "\SendGrid\Mail\Mail" 개체
  • "\SendGrid" 개체
  • 필수 구성 세부 정보가 포함된 어레이

아래 예제에서 관련 클래스 멤버 변수와 함께 수정된 생성자를 볼 수 있습니다. 기존 클래스 멤버 변수와 생성자를 이 코드로 바꿉니다.

참고: 다음으로 "handle" 메서드를 리팩토링해야 합니다. "EmailSenderHandler" "handle" 메소드의 기존 내용을 아래 코드로 교체한 다음 그 역할을 단계별로 살펴보겠습니다.

"$request->getParsedBody()"를 사용하여 요청 본문에 제공된 매개변수를 검색하는 것으로 시작합니다. 그러면 연관 배열이 반환되어 "$details"가 초기화됩니다. 매개변수를 사용할 수 있는 경우 "SendGrid\Mail\Mail" 개체의 "addTo" 메서드를 호출하여 전자 메일 수신자를 설정하고 처음 2개의 인수에 수신자의 전자 메일 주소와 이름을 전달하고 세 번째 인수대체 배열을 전달합니다.

대체를 사용하면 각 받는 사람에 대한 전자 메일 메시지를 사용자 지정할 수 있습니다. 일반 텍스트 이메일에서 "-first_name-"과 같이 바로 하이픈으로 묶인 문자열은 대체입니다. HTML 이메일에서는 이중 괄호로 문자열을 묶는 Handlebars 구문을 사용합니다 (예: "{{ first_name }}").

다음으로 메시지의 제목을 설정하고 일반 텍스트와 HTML 메시지 본문을 추가합니다. 이로써 이메일을 보낼 준비가 되었습니다. 그래서 "SendGrid" 개체인 "$this->mailer"를 사용하여 메시지를 보내려고 시도한 응답으로 새 변수 "$response"를 초기화합니다. 마지막으로 응답의 상태 코드와 본문을 포함 하는 JsonResponse 객체 를 반환합니다.

참고: EmailSenderHandlerFactory의 __invoke 메소드 리팩토링

"EmailSenderHandler" 리팩토링을 완료했으므로 "EmailSenderHandlerFactory"를 리팩토링해야 합니다. 이렇게 하면 "EmailSenderHandler"가 올바르게 인스턴스화됩니다. 그렇게 하려면 "__invoke`" 메서드의 기존 정의를 다음 코드로 바꿉니다.

이렇게 하면 DI 컨테이너에서 "\SendGrid\Mail\Mail" 개체를 검색하고, 보낸 사람과 이메일 세부 정보에 대한 회신으로 미리 초기화하고 "$message"라는 새 개체를 초기화합니다. 그런 다음 메일 메시지를 보내기 위해 "$mailer"라는 새 "SendGrid" 개체를 인스턴스화합니다. 마지막으로 애플리케이션 구성에서 메일 구성을 검색합니다. 그런 다음 이를 사용하여 "EmailSenderHandler" 개체를 초기화하고 반환합니다.

라우팅 테이블 업데이트

이러한 모든 변경 사항과 함께 코드를 테스트하고 이메일을 보내기 전에 마지막으로 변경해야 할 사항이 있습니다. 기본 경로가 "HomePageHandler" 대신 경로의 처리기로 새 Handler 클래스를 사용하도록 라우팅 테이블을 업데이트해야 합니다. 그렇게 하려면 "config/routes.php"의 기본 경로 정의를 다음 예제로 바꾸십시오.

첫 번째 이메일 보내기

이제 첫 번째 이메일을 보낼 시간입니다. 그러려면 먼저 터미널에서 아래 명령을 실행하여 애플리케이션을 시작합니다.

그런 다음 아래 예와 같이 cURL을 사용하여 " http://localhost:8080 "에 GET 요청을 하고 꺾쇠 괄호 안의 값을 이메일에 대한 관련 세부 정보로 바꿉니다.

터미널에 "{"status":202,"message":""}" 출력이 표시되어야 하고 아래 이미지와 같은 이메일이 수신되어야 합니다.

참고: 대신 브라우저나 템플릿 문자열 대신 트랜잭션 이메일 템플릿 사용

우리는 일반 텍스트와 HTML 본문을 모두 포함하는 이메일을 보낼 수 있었지만 그렇게 하는 방법은 이상적이지 않습니다. 우리가 보내는 각 이메일과 애플리케이션에서 꽤 많은 이메일을 보낼 수 있을 때마다 일반 텍스트와 HTML 본문을 추가해야 합니다.

그러나 이메일 본문 정의를 코드에 저장하는 것은 개발 팀의 노력의 대부분을 차지합니다. 그러나 적어도 제 경험에 따르면 다른 팀(종종 마케팅)에서 이메일 템플릿을 만들고 유지 관리하는 경우가 많습니다.

따라서 개발 속도를 높이고 여러 팀에서 로드를 공유하기 때문에 트랜잭션 이메일 템플릿 을 사용하도록 애플리케이션을 리팩토링할 것 입니다. 코드 대신 기술 경험이 거의 또는 전혀 없는 팀 구성원이 Twilio SendGrid UI를 통해 이러한 항목을 만들고 유지 관리할 수 있습니다.

들어 본 적이 없다면 Twilio SendGrid 용어집 에서 다음과 같이 정의합니다.

거래 이메일 템플릿은 마케팅 담당자, 디자이너 및 개발자가 거래 이메일 캠페인을 빠르고 쉽게 만드는 데 사용할 수 있는 사전 코딩된 이메일 레이아웃입니다. Twilio SendGrid의 트랜잭션 이메일 템플릿을 사용하면 비기술적인 사람과 기술적인 사람 모두 수신자가 받는 이메일을 실시간으로 변경할 수 있습니다.

이 기사에서는 상당히 기본적인 것만 필요합니다. 그렇게 하려면 Twilio SendGrid 설명서 의 세부 정보를 따르고 단일 텍스트 모듈에서만 콘텐츠가 포함된 항목을 만듭니다. 그런 다음 본문 텍스트는 아래 텍스트를 사용합니다.

이메일에는 6개의 대체 항목이 있습니다.

  • "first_name": 고객의 이름
  • "last_name": 고객의 성
  • “sender_name”: 전자상거래 상점의 이름(The Little PHP Shop)
  • "sender_state": 전자 상거래 상점의 상태
  • “sender_country”: 전자상거래 상점의 국가
  • "support_email": 고객이 판매 후 지원을 받는 데 사용할 수 있는 지원 이메일

이를 감안할 때 해당 정보를 애플리케이션에서 사용할 수 있도록 해야 합니다. 고객의 이름과 성은 이미 있습니다. 나머지 4개의 대체 항목은 전역적이므로 이전에 했던 것처럼 "templates" 요소 뒤의 " config/autoload/mail.global.php "에 아래 구성을 추가합니다.

새 구성 파일이 생성되면 "EmailSenderHandler" "handle" 메서드에서 "$this->mail->addContent()"에 대한 2번의 호출을 다음 코드로 교체합니다.

2 메서드 호출은 보낸 사람 세부 정보를 추가하고 전자 메일 주소를 전역 대체로 지원합니다. 이러한 대체는 다른 대체보다 먼저 이메일 본문에 적용되지만 이메일 수신자에 대해 동일한 키로 대체가 있는 경우 재정의됩니다.

다음으로 트랜잭션 이메일 템플릿의 ID를 검색해야 합니다. 아래 스크린샷에서 볼 수 있듯이 템플릿 목록 에서 템플릿 이름을 클릭하면 찾을 수 있습니다 .

그것을 복사하여 "template_id" 키가 있는 새 요소의 "config/autoload/mail.global.php"에 저장한 다음 "plain" 및 "HTML"을 제거합니다. 완료되면 반환된 배열의 "mail/templates" 요소는 아래 코드와 같이 표시됩니다. 여기서 "<the template's id>"는 템플릿 ID를 대체합니다.

구성이 업데이트되면 이제 "EmailSenderHandler" "handle" 메서드에서 "Mail" "setTemplateId" 메서드에 대한 호출을 추가하고 "config/autoload/mail.global"에 방금 추가한 템플릿 ID를 전달해야 합니다. PHP.” 아래 코드에서 예제를 볼 수 있습니다.

변경 사항을 테스트해 보겠습니다.

이전과 마찬가지로 cURL을 사용하여 " http://localhost:8080 " 에 GET 요청을 만들어 변경 사항이 예상대로 작동하는지 테스트합니다. 이전 예에서와 같이 터미널에 "{"status":202,"message":""}" 출력이 표시되어야 합니다. 이메일 받은 편지함에 아래 스크린샷과 같이 대체 항목이 있는 멋진 이메일이 표시되어야 합니다.

PDF 인보이스 첨부

이제 동적 템플릿을 사용하고 있으므로 기사 상단에서 언급한 PDF 인보이스를 첨부해 보겠습니다. 직접 찾거나 만드는 시간과 노력을 절약 하기 위해 이 기사에 사용할 수 있는 샘플 PDF 인보이스 를 만들었습니다. 응용 프로그램의 " 데이터" 디렉터리에 저장합니다.

참고: 인보이스를 첨부하려면 다음 코드 예제에서 볼 수 있는 "Mail" "addAttachment" 메서드를 사용해야 합니다. 이 메서드는 5개의 인수를 사용하지만 처음 4개만 제공합니다. 이들은 다음과 같습니다.

  1. " 첨부" 개체 또는 Base64로 인코딩된 문자열 입니다. 이 매개변수의 값이 base64로 인코딩되지 않은 경우 메소드가 이를 수행합니다.
  2. 첨부 파일의 MIME 유형 (현재는 미디어 유형 이라고 함 ).
  3. 첨부 파일의 파일 이름 . 이것은 사용자가 변경하지 않는 한 기본적으로 파일이 다른 이름으로 저장되는 이름입니다.
  4. 첨부 파일의 콘텐츠 처리 . 내용 처리에 익숙하지 않은 경우 인라인 내용 처리는 메시지가 표시될 때 첨부 파일이 자동으로 표시되어야 함을 의미하고 첨부 내용 처리는 첨부 파일이 자동으로 표시되지 않고 열어 봐.

아래 코드 예제에서 PHP의 file_get_contents 메소드는 파일의 내용을 "$invoice"라는 이름의 새 변수로 읽어들입니다. 그런 다음 "addAttachment" 메서드를 호출하여 PDF가 메시지에 첨부됩니다.

여기에서 우리는:

  • Base64로 인코딩되는 송장의 내용을 전달하십시오.
  • PDF 파일을 첨부할 때 MIME 유형을 "application/pdf"로 설정합니다.
  • 송장의 파일 이름을 고객이 합리적으로 기대할 수 있는 가상의 이름으로 설정합니다.
  • 콘텐츠 처리를 "첨부"로 설정

변경 사항을 완료했으므로 이제 작동하는지 테스트해 보겠습니다. 이전에 2번 실행한 것과 동일한 cURL 요청을 실행합니다. 그런 다음 이메일 받은 편지함에 이메일을 볼 때 볼 수 있는 예제 PDF 송장과 함께 멋진 이메일이 표시되어야 합니다.

Twilio SendGrid 및 Mezzio를 사용하여 PHP로 이메일을 보내는 방법입니다.

Twilio SendGrid 및 Mezzio를 사용하여 이메일을 보낼 때 가능한 것의 표면만 긁었지만 이제 첨부 파일은 물론 일반 텍스트 및 HTML 본문이 포함된 이메일을 보낼 수 있습니다. 또한 전역적으로 그리고 받는 사람별로 설정할 수 있는 트랜잭션 템플릿 및 대체를 사용하는 방법을 배웠습니다.

이메일 전송 예약, Amazon S3에서 파일 첨부, 헤더 추가, 섹션 및 범주 추가와 같이 사용할 수 있는 다른 기능을 보려면 PHP 라이브러리의 설명서 를 참조하시기 바랍니다 .

Matthew Setter는 Twilio Voices 팀의 PHP 편집자이며 당연히 PHP 개발자입니다. 그는 또한 Mezzio Essentials 의 저자이기도 합니다 . 그는 PHP 코드를 작성하지 않을 때 여기 Twilio에서 훌륭한 PHP 기사를 편집하고 있습니다. 다음을 통해 연락할 수 있습니다.

  • 이메일: [email protected]
  • 웹: http://matthewsetter.com
  • 트위터: @settermjd
  • 깃허브: https://github.com/settermjd