이메일을 보내고 대기열에 추가하는 객체 지향 방법을 제공합니다.
사용자 등록이나 비밀번호 재설정 기능 등 거의 모든 프로젝트에서 이메일을 보내야 하는 경우가 있습니다. 보내는 대부분의 이메일은 매우 쉽습니다. PGP 암호화 등과 같은 정교한 기능은 필요하지 않습니다. 이 라이브러리는 PHPMailer(기본 라이브러리)를 설정하지 않고도 이러한 이메일을 생성하고, 여러 이메일을 보내고, 심지어 데이터베이스가 지원하는 대기열을 사용하여 이메일 전송을 연기하는 방법을 제공합니다. 객체 지향 방식.
특징은 다음과 같습니다:
EmailQueue
객체에 SMTP 설정을 캡슐화합니다.이 프로젝트는 GNU LGPL 3.0에 따라 라이센스가 부여됩니다.
composer install technicalguru/email
GitHub 릴리스 페이지에서 소스 코드 패키지를 다운로드할 수 있습니다.
구성의 중심 클래스는 EmailConfig
입니다. 필요한 모든 정보를 담고 있습니다. 기본 뼈대부터 시작해 보겠습니다.
use TgEmailEmailConfig;
$config = new EmailConfig();
$config->setTimezone('Europe/Berlin');
$config->setDefaultSender('John Doe <[email protected]>');
$config->setSubjectPrefix('[MyAppName] ');
$config->setDebugAddress('[email protected]');
위의 줄은 구성을 생성하고 타임스탬프를 생성해야 할 때 Europe/Berlin
시간대를 사용하도록 지시합니다. 이는 주로 이메일이 대기열에 있고 타임스탬프를 기록해야 할 때 필요합니다. 이 값은 선택사항이며 기본값은 UTC
입니다.
다음으로 기본 보낸 사람 주소가 구성됩니다. 기본 보낸 사람은 보낼 특정 이메일에 보낸 사람 주소가 정의되지 않은 경우 사용됩니다. 이메일 주소 생성에 대해서는 아래에서 자세히 설명합니다.
제목 접두어는 나중에 전송되는 모든 이메일에 사용됩니다. 제목 앞에는 이 문자열이 붙습니다. 기본값은 NULL
이며 제목을 수정하지 않습니다.
디버그 주소는 테스트 메일을 보내야 하는 경우에만 필요합니다.
여전히 SMTP 서버가 어디에 있는지 알려줘야 합니다. 따라서 이러한 값을 설정하는 방법은 다음과 같습니다.
use TgEmailConfigSmtpConfig;
$host = 'smtp.example.com;
$port = 587;
$auth = TRUE;
$username = 'mySmtpUser';
$password = 'mySmtpPassword';
$secureOption = 'starttls';
$smtpConfig = new SmtpConfig($host, $port, $auth, $username, $password, $secureOption);
$config->setSmtpConfig($smtpConfig);
대부분의 옵션은 자체적으로 설명됩니다. $auth
기본 PHPMailer에게 주어진 사용자 자격 증명으로 인증할지 여부를 알려줍니다. $secureOption
PHPMailer
에 의해 정의되며 smtps
또는 starttls
값을 가져야 합니다. 자세한 내용은 PHPMailer 설명서를 참조하세요.
모든 속성은 setter를 사용하여 설정할 수 있습니다.
use TgEmailConfigSmtpConfig;
$smtpConfig = new SmtpConfig();
$smtpConfig->setHost('smtp.example.com');
$smtpConfig->setPort(587);
// continue setup...
technicalguru/utils
패키지의 TgUtilsAuthCredentialsProvider
인터페이스를 사용하여 인증 자격 증명을 설정할 수도 있습니다.
// Define here your provider
$provider = ...;
// Tell SMTP config
$smtpConfig->setCredentialsProvider($provider);
이제 중앙 MailQueue
객체를 생성할 차례입니다.
use TgEmailEmailQueue;
$mailer = new EmailQueue($config);
첫 번째 이메일을 보낼 준비가 되었습니다.
설정이 올바르게 작동하는지 확인하는 빠르고 쉬운 방법이 있습니다.
$email = $mailer->createTestMail();
$rc = $mailer->send($email);
이메일을 보내기 위한 최소 요구 사항을 설정했습니다.
use TgEmailEmail;
$email = new Email();
$email
->setSubject('Hello World')
->addTo('[email protected]', 'John Doe')
->addBcc('[email protected]')
->setReplyTo('[email protected]')
->setBody(Email::TEXT, 'The text e-mail body')
->setBody(Email::HTML, '<p>The HTML e-mail body</p>');
// Will return FALSE when sending fails
$rc = $mailer->send($email);
그게 다야. 위의 코드 조각은 이메일을 보내기 위해 애플리케이션 코드에 필요한 전부입니다. 구성 및 설정은 인프라 설정 어딘가에 묻혀 있어야 합니다.
파일을 첨부하거나 이미지를 삽입하는 것은 간단합니다. 파일 시스템에서 파일을 사용하고 읽을 수 있어야 합니다.
use TgEmailAttachment;
$myFile = new Attachment(Attachment::ATTACHED, 'file.pdf', NULL, '/local/path/to/file.pdf', 'application/pdf');
$myImage = new Attachment(Attachment::EMBEDDED, 'img.png', 'img1', '/local/path/to/img.png', 'image/png');
$email
->addAttachment($myFile)
->addAttachment($myImage);
삽입된 이미지의 세 번째 매개변수에 유의하세요. 이는 HTML 이메일 내에서 참조할 수 있는 고유 ID를 정의합니다.
// Using the embedded image
$myHTML = '<img src="cid:img1">';
MailQueue
파일 시스템의 모든 첨부 파일을 그대로 유지합니다. 그러나 때로는 이메일을 보낸 후 파일을 제거하고 싶을 수도 있습니다. 생성자는 두 개의 추가 인수를 사용합니다.
$myFile = new Attachment(Attachment::ATTACHED, $filename, $cid, $path, $mimeType, TRUE, TRUE);
첫 번째 부울은 이메일이 성공적으로 전송된 후 파일이 삭제되도록 트리거합니다. 두 번째 부울은 전송 실패 시 파일을 삭제할 수 있는지 여부를 나타냅니다. 이러한 매개변수를 사용하면 더 이상 임시 파일을 관리할 필요가 없습니다. 특히 대기열 및 지연된 전송과 관련하여.
MailQueue
소위 메일 모드를 지원합니다. 이는 메일러 객체에게 일반적으로 이메일을 처리하는 방법을 알려줍니다. 이는 설정을 테스트할 때, 실제 이메일 주소가 있는 환경(예: 사용자 승인 테스트 환경)에 있을 때 또는 실제로 이메일을 보내는 것이 별 의미가 없을 때 편리합니다.
다음 모드를 사용할 수 있습니다.
EmailQueue::DEFAULT
- 이는 정상적인 작업입니다. 모든 이메일은 정의된 대로 전송됩니다.EmailQueue::BLOCK
- 메일이 전송되거나 대기열에 추가되는 것을 방지합니다. 반환 코드는 항상 TRUE입니다.EmailQueue::REROUTE
- 모든 이메일은 일반적으로 관리자 또는 개발자 주소와 같은 다른 주소로 전송되며 이메일의 정의된 수신자는 무시됩니다.EmailQueue::BCC
- 이메일은 의도한 수신자에게 전송되지만 BCC에는 추가 주소가 설정됩니다.전송되거나 대기 중인 모든 이메일을 차단하는 것은 매우 쉽습니다.
$mailer->setMailMode(EmailQueue::BLOCK);
중앙 EmailConfig
개체에서도 동일한 방법을 사용할 수 있습니다.
기본 구성에 RerouteConfig
구성을 설정해야 합니다. 구성 개체를 생성할 때 이를 미리 설정하거나 메일 모드를 설정할 때 함께 설정할 수 있습니다.
use TgEmailConfigRerouteConfig;
// Create the config
$subjectPrefix = '[Rerouted]';
$recipients = array('[email protected]');
$rerouteConfig = new RerouteConfig($subjectPrefix, $recipients);
// And set the mail mode
$mailer->setMailMode(EmailQueue::REROUTE, $rerouteConfig);
기본 구성에서 설정하려면 BccConfig
구성이 필요합니다. 구성 개체를 생성할 때 이를 미리 설정하거나 메일 모드를 설정할 때 함께 설정할 수 있습니다.
use TgEmailConfigBccConfig;
// Create the config
$recipients = array('[email protected]');
$bccConfig = new BccConfig($recipients);
// And set the mail mode
$mailer->setMailMode(EmailQueue::BCC, $bccConfig);
애플리케이션 코드에서 직접 이메일을 보내는 것의 한 가지 단점은 시간이 많이 걸린다는 것입니다. 사용자는 전송이 완료될 때까지 기다려야 애플리케이션의 응답을 볼 수 있습니다. 이메일을 대기열에 넣는 것은 전송이 지연되고(크론 작업보다 선호됨) 사용자가 애플리케이션 응답을 빠르게 받을 수 있는 솔루션입니다.
전자 메일을 대기열에 추가하려면 TgDatabaseDatabase
개체가 필요합니다. 그렇지 않으면 이메일을 대기열에 넣으려고 할 때 EmailQueue
예외가 발생합니다. Database
개체를 만드는 방법은 TgDatabaseDatabase
설명서를 참조하세요. 다음과 같이 EmailsDAO
및 EmailQueue
설정하십시오.
use TgEmailEmailsDAO;
$dao = new EmailsDAO($database);
$mailer = new EmailQueue($config, $dao);
메일러는 대기열 테이블이 없으면 자동으로 생성합니다.
EmailsDAO
사용할 수 있게 되면 이메일을 쉽게 대기열에 추가할 수 있습니다.
// Create your email object here
$email = ...
// Queue it. Will return FALSE when sending fails
$rc = $mailer->queue($email);
다른 호출이나 cronjob 중에 대기열을 처리할 수 있습니다.
$mailer->processQueue($maxSeconds);
$maxSeconds
인수는 시간 제한에 도달하면 처리가 중지되도록 보장합니다. 인수는 선택 사항이며 기본값은 60초입니다.
이메일 주소를 만드는 방법에는 여러 가지가 있습니다. 모든 메일링 구성요소는 EmailAddress
객체를 사용합니다. 이메일 주소가 필요한 곳이면 어디든 이 개체를 인수로 사용할 수 있습니다. 이러한 객체를 생성하는 방법에는 여러 가지가 있습니다.
// From a string
$address = EmailAddress::from('[email protected]');
$address = EmailAddress::from('<[email protected]>');
$address = EmailAddress::from('John Doe <[email protected]>');
// From email string and name
$address = EmailAddress::from('[email protected]', 'John Doe');
// From another object
$obj = new stdClass;
$obj->name = 'John Doe';
$obj->email = '[email protected]';
$address = EmailAddress::from($obj);
// From another EmailAddress
$address = EmailAddress::from($anotherEmailAddressObject);
이는 이메일을 작성할 때 다음과 같은 특징을 사용할 수 있음을 의미합니다.
$email->addTo('John Doe <[email protected]>');
$email->addTo('[email protected]', 'John Doe');
$email->addTo(array('John Doe <[email protected]>', $anotherEmailAddressObject, $obj);
위에 소개된 구성 개체는 JSON 문자열, 개체 또는 연관 배열을 사용하여 생성할 수도 있습니다. 다음 조각에서는 JSON 개체를 짧은 표기법으로 설명합니다.
SmtpConfig:
-----------
{
"host": "www.example.com",
"port": 587,
"debugLevel": 0,
"auth": true,
"secureOption": "starttls",
"charset": "utf8",
"credentials": {
"user": "username",
"pass": "password"
}
},
RerouteConfig:
--------------
{
"recipients": "[email protected]",
"subjectPrefix": "[Rerouted]"
},
BccConfig:
----------
{
"recipients": "[email protected]"
},
EmailConfig:
------------
{
"timezone": "Europe/Berlin",
"mailMode": "default",
"smtpConfig": {... see above ...},
"rerouteConfig": {... see above ...},
"bccConfig": {... see above ...},
"debugAddress": "[email protected]",
"defaultSender": "[email protected]",
"subjectPrefix": "[PHPUnitTest] "
}
각 구성 클래스는 이러한 유형을 인수로 사용하고 구성 객체 자체를 반환하는 정적 from()
메서드를 제공합니다.
$smtpConfig = SmtpConfig::from($jsonStringOrObjectOrAssocArray);
$rerouteConfig = RerouteConfig::from($jsonStringOrObjectOrAssocArray);
$bccConfig = BccConfig::from($jsonStringOrObjectOrAssocArray);
$emailConfig = EmailConfig::from($jsonStringOrObjectOrAssocArray);
send()
및 queue()
함수에 Email
객체 배열을 전달할 수 있습니다. 그러나 특히 즉시 이메일을 보내는 경우 시간이 다소 걸릴 수 있다는 점을 염두에 두어야 합니다. 더 나은 전략은 대량 메일 발송을 대기열에 두는 것입니다.
대부분의 PHPUnit 테스트는 사용 가능한 SMTP 서버나 데이터베이스가 없으면 실행되지 않습니다. 단위 테스트는 환경 변수 EMAIL_TEST_SMTP
및 EMAIL_DATABASE
를 확인합니다. 이러한 변수를 생성하는 bash 스크립트인 set-test-env.sh
가 있습니다. 예를 들어 set-local-test-env.sh
에 복사하고 파일의 지침을 따르세요.
GitHub 이슈 트래커에서 버그를 보고하고 개선 사항을 요청하거나 끌어오기 요청을 해보세요.