2015/06/02

PHP 메일 보내기 소스 // Swift Mailer, Gmail 이용, PHP 메일 발송 소스

1. PHP로 메일을 보내보자!

PHP 페이지 개발 중 회원가입 시에 인증용 메일을 보내야 하는 부분이 발생.

일단 구글 검색 고고씽~ 하여 그럴싸한 자료 포착


- PHP 에서 mail 함수 정상 동작하는지 확인하는 소스 ( http://lifeful.tistory.com/19 )

예제 코드를 돌려본 결과, 내가 작업하고 있는 환경에는 SMTP 서버가 안 깔려 있구나~! 라는 결론에 도달 -.-;

Aㅏ...


2. (뒤늦게 살펴보는) 작업 환경

한 시대를 풍미했던(?) APMSETUP 으로

Apache 2.2 와 PHP 5.2 의 조합이 세팅됨.

OS는 MS 윈도우즈.

심플하다. 후훗!


3. Gmail 을 메일서버로 활용하자!

서버 프로그램을 추가로 깔아놓고 온갖 세팅을 다해서 겨우 돌렸는데 스팸으로 처리되서 메일이 막혀버리는 것보다는, (막히기도 전부터 별 걱정을 다...)

스팸 처리의 위험도 없으면서 외부에서 가볍게 가져다가 쓸 수 있는 무언가를 찾다가...

Gmail에 연동해서 메일 발송을 할 수도 있다는 정보를 얻음.

- Using Swift mailer, it is quite easy to send a mail through Gmail credentials ( http://stackoverflow.com/questions/712392/send-email-using-the-gmail-smtp-server-from-a-php-page )

- Swift mailer ( http://swiftmailer.org/ )

진리의 stackoverflow.com에 오늘도 무한감사!


4. Swift mailer 작업 개시

1) Swift mailer 라이브러리 설치

swift mailer 사이트( http://swiftmailer.org/ )에 가서 installation 메뉴로 가면 linux(?) 기준의 설치방법만 있음. -_-;

당황하지 말고, installation 화면 우측에 있는 GitHub 링크로 가서

다시 화면 우측에 있는 Download ZIP 버튼을 눌러서 swiftmailer 파일을 다운로드하고

적당한 폴더에 압축을 풀어서 설치 완료.


압축 파일 안에는 doc, lib, tests 등의 폴더가 있는데 lib 폴더 안에 있는 내용만 넣어주면 되는 듯.


2) 샘플 코드 테스트

PHP 메일 보내기 // PHP 메일 발송 소스, Swift Mailer, Gmail 사용


긁어가기용 코드는 아래에...

<?php
require_once 'swift/lib/swift_required.php';

$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, "ssl")
  ->setUsername('GMAIL_USERNAME')
  ->setPassword('GMAIL_PASSWORD');

$mailer = Swift_Mailer::newInstance($transport);

$message = Swift_Message::newInstance('Test Subject')
  ->setFrom(array('abc@example.com' => 'ABC'))
  ->setTo(array('xyz@test.com'))
  ->setBody('This is a test mail.');

$result = $mailer->send($message);
?>


위 샘플 코드를 돌릴 때 주의할 점! 따란~


2-1) 코드에서도 볼 수 있듯이 SSL이 지원되야 gmail로 메일을 보낼 수 있는데, 본인 환경에서는 기본 세팅으로 제공되고 있었음. 가볍게 통과~

SSL 설치(?) 여부는 각자의 환경에서 phpinfo() 로 확인 가능함.


PHP5 - openssl


2-2) require_once 다음의 swift 라이브러리 경로에 주의

라이브러리를 적당한 위치에 복사해서 넣은 후에 그 경로를 정확하게 지정하기가 어려울 수 있는데, 아래처럼 코드를 살짝 바꿔서 경로를 찍어보고...

require_once $_SERVER[DOCUMENT_ROOT].'/sample_proj/swiftmailer/lib/swift_required.php';

경로가 틀리다는 에러 메시지에 root 경로가 찍혀서 나오는 걸 보고 거기서부터 적당히 수정해주면 됨. 구분자(?)는 슬래쉬(/)임. (include 로 하면 역슬래쉬로 나오는 듯?)


2-3) 나머지 소스 코드도 적당히 변경

$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, "ssl") 에서

465는 gmail의 SSL 포트 번호(?)이니 그대로 놔두면 됨.

TLS 포트는 587 이라고 함.

SSL 이라도 465가 안 되면 25를 써보라는 구글의 도움말도 있음.


GMAIL_USERNAME, GMAIL_PASSWORD는 메일 발송용으로 사용하려는 계정(본인 계정)의 gmail ID, PW로 바꿔주고,

아래쪽에 있는 $message 부분은 메일 작성 내용으로 수정.


내용 수정을 모두 마친 후에 위 샘플 코드의 내용이 들어있는 php 파일을 서버에서 실행해보면 됨.

setTo() 에서 지정한 메일 주소로 메일이 날아오면 성공!


* 메일 본문에 html 코드를 넣어서 꾸미려면 setBody()나 addPart()에 두번째 매개변수로 'text/html'을 넣어주면 됨

참고 : http://swiftmailer.org/docs/messages.html#setting-the-body-content


5. php.ini 설정

위 코드가 정상적으로 돌아가게 하려면

php.ini 파일도 수정이 필요한데


php.ini 파일 내에서 'smtp'로 검색해서 mail function 부분(790번 라인 근처)으로 가서

SMTP = ssl://smtp.gmail.com
smtp_port = 465

sendmail_from = '사용할 gmail 계정'

정도로 고쳐주면 됨.


php.ini 파일을 수정한 다음에는 Apache 를 재시작해야 바뀐 내용이 적용된다고 하는 듯.

Apache를 재시작하려면, (Apache설치경로)/bin 에서 ApacheMonitor 실행해서 재시작(Restart) 버튼으로 해결. (윈도우즈 버전)


Apache Service Monitor


6. gmail 환경설정

메일 발송에 사용할 gmail 계정의 설정도 변경해주어야 하는데

IMAP 사용을 허용 해야 된다고 함.

* 2015-11-23 내용 추가 - 환경설정에 들어가는 방법은, gmail 화면에서 오른쪽 위에 보이는 본인 계정 이미지의 아래에 있는 톱니바퀴 모양 아이콘을 클릭 후 환경설정을 선택.


Gmail IMAP 설정


IMAP 사용이 허용된 상태에서 위의 코드를 실행하면, gmail에서 경고 메일이 날아옴

로그인 시도를 차단했다고 하는데 메일의 링크를 따라가서

본인이 쓴 게 맞고, 보안수준 낮은 앱 사용을 허용하겠다고 설정하면 됨

* 2015-11-23 내용 추가 - 경고 메일이 날아오기 전에 먼저 이 부분을 설정해 줄 수 있음.
gmail 화면에서 오른쪽 위에 보이는 본인 계정 이미지를 클릭 -> 내 계정 -> 로그인 및 보안 -> 연결된 앱 및 사이트 항목 아래쪽에서 보안 수준이 낮은 앱 허용 선택.


Google 계정: 로그인 시도 차단


Google 계정: 보안 수준이 낮은 앱의 액세스 허용


보안 수준이 낮은 앱으로 감히 구글에 액세스 해서 죄송합니다. 으힠ㅋ


gmail에서 해당 부분 설정이 안 되어 있는 상태에서는

php 코드가 정상이더라도 아래와 같은 에러를 포함해서 여러가지 문제가 발생함.

Wrong parameters for Exception([string $exception [, long $code ]]) 어쩌고저쩌고 쏼라쏼라~



댓글 1개:

  1. Swift mailer를 이용해서 메일을 발송할 때

    2~3초(?) 가량 지연시간이 있는데

    이는 SSL 인증 처리 과정 때문이라고 합니다. (저도 주워 들은 거예요 ㅎㅎ;)

    답글삭제