The Pursuit of Happyness

예전에 포스팅했던 [PHP] Gmail SMTP를 이용하여 메일 보내기를 업데이트 합니다.



먼저 예전에 구글코드에서 관리하던 PHPMailer는 github를 통해서 소스가 관리되고 있습니다.


현재 릴리즈 된 버전은 6.x 인데, composer로 설치할 경우 PHP 버전에 따라서 5.2.x 버전이 설치되기도 합니다.


모듈을 로딩하는 방식이 조금 다르기 때문에 버전에 따라 사용법을 살펴보겠습니다.



0. PHP 는 설치되어 있다고 가정합니다.


1. PHPMailer를 설치하기 위해서 composer를 설치합니다.


참고 사이트

https://getcomposer.org/download/


CLI 설치 

$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

$ php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

$ php composer-setup.php

$ php -r "unlink('composer-setup.php');"


위의 명령들을 차례대로 실행하면, 명령어를 실행한 경로에 composer.phar 파일이 생성됩니다.


2. PHPMailer 설치 


참고 사이트

https://github.com/PHPMailer/PHPMailer   (최신 버전)

https://github.com/PHPMailer/PHPMailer/tree/5.2-stable  (5.2 버전)


composer.phar 파일이 있는 곳에서 다음의 명령으로 phpmailer 를 설치합니다.

$ php composer.phar require phpmailer/phpmailer


php 버전에 따라서 호환이 되는 PHPMailer 모듈이 설치됩니다.



3. 메일 보내기


6.x 버전에서는 사이트에 나와있는 샘플대로 아래와 같이 코드를 작성하면 됩니다. 

 

<?php
// Import PHPMailer classes into the global namespace
// These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

//Load composer's autoloader
require 'vendor/autoload.php';

$mail = new PHPMailer(true);                              // Passing `true` enables exceptions
try {
    //Server settings
    $mail->SMTPDebug = 2;                                 // Enable verbose debug output
    $mail->isSMTP();                                      // Set mailer to use SMTP
    $mail->Host = 'smtp1.example.com;smtp2.example.com';  // Specify main and backup SMTP servers
    $mail->SMTPAuth = true;                               // Enable SMTP authentication
    $mail->Username = 'user@example.com';                 // SMTP username
    $mail->Password = 'secret';                           // SMTP password
    $mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
    $mail->Port = 587;                                    // TCP port to connect to

    //Recipients
    $mail->setFrom('from@example.com', 'Mailer');
    $mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
    $mail->addAddress('ellen@example.com');               // Name is optional
    $mail->addReplyTo('info@example.com', 'Information');
    $mail->addCC('cc@example.com');
    $mail->addBCC('bcc@example.com');

    //Attachments
    $mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
    $mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name

    //Content
    $mail->isHTML(true);                                  // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'This is the HTML message body <b>in bold!</b>';
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
}


5.2.x 버전에서도 기존 사이트에 나와있는 샘플과 비슷하게 작성하면됩니다.

(샘플에서 require 부분의 경로만 살짝 변경해 주었습니다.)


<?php
require 'vendor/phpmailer/phpmailer/PHPMailerAutoload.php'; $mail = new PHPMailer; //$mail->SMTPDebug = 3; // Enable verbose debug output $mail->isSMTP(); // Set mailer to use SMTP $mail->Host = 'smtp1.example.com;smtp2.example.com'; // Specify main and backup SMTP servers $mail->SMTPAuth = true; // Enable SMTP authentication $mail->Username = 'user@example.com'; // SMTP username $mail->Password = 'secret'; // SMTP password $mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted $mail->Port = 587; // TCP port to connect to $mail->setFrom('from@example.com', 'Mailer'); $mail->addAddress('joe@example.net', 'Joe User'); // Add a recipient $mail->addAddress('ellen@example.com'); // Name is optional $mail->addReplyTo('info@example.com', 'Information'); $mail->addCC('cc@example.com'); $mail->addBCC('bcc@example.com'); $mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name $mail->isHTML(true); // Set email format to HTML $mail->Subject = 'Here is the subject'; $mail->Body = 'This is the HTML message body <b>in bold!</b>'; $mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; if(!$mail->send()) { echo 'Message could not be sent.'; echo 'Mailer Error: ' . $mail->ErrorInfo; } else { echo 'Message has been sent'; } 







Comment +0

테스팅


http://www.hanbit.co.kr/book/look.html?isbn=978-89-6848-225-0



- 테스트를 하는 이유

애플리케이션이 우리의 기대에 따라 지속적으로 작동하도록 보장하기 위해서!


- 테스트 시점

-- 개발 전

개발 전에 테스팅 도구를 설치하고 구성해야 한다.

-- 개발 도중

각 부분을 만들 때마다 테스트를 작성하고 실행한다. 새로운 클래스를 추가하면 그 즉시 테스트를 만들어 실행한다.

-- 개발 후

애플리케이션 출시 후 버그를 발견하면 버그 픽스를 만들어야 하며, 올바른 동작을 보장하기 위해 새로운 테스트도 함께 작성한다.

코드 수정시 그에 따른 영향을 받는 테스트 역시 수정해야 한다.


- 테스트 대상

애플리케이션을 구성하는 가장 작은 조각들 - 유닛 테스트 (미시적 관점)

전체 애플리케이션 - 기능 테스트 (거시적 관점)


- 테스트 방법

-- 단위 테스트

큰 애플리케이션에 포함된 클래스, 메써드, 함수를 고립시킨 상태로 검증하는 테스트 방식


-- 테스트 주도 개발 (TDD)

테스트 작성이 애플리케이션 코드 작성보다 선행

의도적인 실패를 통해 애플리케이션의 행동 방식을 묘사하고, 애플리케이션의 기능이 갖춰지고 나서야 성공적으로 수행된다.

목표 지향적이며 무엇을 만들어야 할지, 결과물은 어떻게 작동해야 할지를 사전에 인지할 수 있게 도와준다.


-- 행위 주도 개발 (BDD)

애플리케이션이 행동하는 방식을 이야기처럼 묘사하는 개발 방법론.

--- 스펙 BDD

인간 친화적인 언어로 애플리케이션 구현을 묘사하는 단위 테스트 유형

--- 스토리 BDD

하위 수준 구현 보다는 상위 수준 행동에 관심이 있다.


ex) PDF 보고서를 작성하고 이메일로 발송하는 애플리케이션 제작

---- 스펙 BDD : PDF 생성 클래스 메서드가 매개변수를 입력받아 올바르게 PDF 파일을 생성하는 지 검증

---- 스토리 BDD : 프로젝트 관리자 관점에서 PDF가 생성되어지는지와 email이 보내지는 지 같은 포괄적인 애플리케이션 동작을 검증

=> 둘 간의 차이는 테스트 영역이라고 생각하면 됨


- PHP 유닛

PHP 유닛 테스트 => 테스트 케이스 => 테스트 스위트

테스트 러너를 통해 테스트 스위트를 실행한다.

테스트 케이스는 PHPUnit_Framework_TestCase 클래스를 확장한 단일 PHP 클래스

컴포저를 이용하여 설치할 수 있다.


> composer require --dev phpunit/phpunit 




Comment +0

컴포넌트 사용


http://www.hanbit.co.kr/book/look.html?isbn=978-89-6848-225-0


PHP에서의 컴포넌트는 PHP 애플리케이션의 특정 문제를 해결하도록 도와주는 코드 모음이다. 기술적으론느 한가지 문제를 해결하는 데 관련된 클래스, 인터페이스, 트레이트의 모음이다.컴포넌트를 이루는 클래스, 인터페이스, 트레이트는 보통 동일한 네임스페이스 하위에 위치한다.


- 좋은 컴포넌트의 특징

-- 목적이 정확하다.

-- 작다.

-- 협력적이다.

-- 충분한 테스트를 거쳤다.

-- 문서화 수준이 높다.


- 컴포넌트 선택

-- 패키지스트에서 찾을 수 있음 

https://packagist.org


- 컴포넌트 사용

-- 컴포저를 사용한다.

https://getcomposer.org

-- 컴포저는 CLI로 동작하는 PHP 컴포넌트 의존성 관리자

-- 컴포저를 실행하면 해당 프로젝트에 필요한 컴포넌트와 의존성 컴포넌트를 프로젝트 폴더에 다운로드 하여 설치해준다.

-- 컴포저 설치


> curl -sS https://getcomposer.org/installer | php

> mv composer.phar /usr/local/bin/composer

> chmod +x /usr/local/bin/composer


첫 명령어는 getcomposer.org 사이트에서 installer 스크립트를 다운로드해서 php 로 실행하는 명령어로 그 결과 composer.phar 파일을 생성하는데, composer.phar 파일은 컴포저 바이너리 파일이다.

생성된 바이너리 파일을 실행이 가능한 위치 (/usr/local/bin) 에 composer 라는 이름으로 이동하고 나서 실행 가능한 권한을 준다.

-- 컴포저 사용법

1. 패키지스트에서 필요한 컴포넌트를 검색한다.

2. PHP 컴포넌트는 vendor / package 형식으로 되어 있다.

3. 아래 명령어를 프로젝트 루트 폴더에서 실행하면 컴포저가 flysystem  컴포넌트를 다운로드해서 vendor 폴더에 설치해 주고, composer.json 파일과 composer.lock 파일을 생성해 준다. composer.json 에는 프로젝트를 위해 설치한 콤포넌트 정보가 기록되며, composer.lock 에는 콤포넌트 설치 시점의 정보들이 기록된다.


> composer require league/flysystem






Comment +0