블로그 프로필 이미지




 PHP 를 이용해서 메일을 보내야하는 경우, 평소 잘 쓰지 않는 메일기능은 머리속에서 구현한 기억만 남아있지, 다시 구현하기란 정말 어려운일이다. 일반적으로 PHP 에서는 메일을 보내는 방법으로 두가지를 쓰고있다. 첫번째 방법으로는 mail 함수를 이용하는 방법이 있고, 두번째 방법은 smtp 로 보내는 기능을 직접 구축하여 사용하는 방법이 있다. 


 mail 함수의 경우 바로 쓸 수 있는게 아니라 sendmail 이라는 별도의 데몬이 필요하다. sendmail 은 유닉스 계열 시스템에서 사용되는 메일서버중 하나이다. sendmail 같은 경우 설명해야할 부분이 많기 때문에 여기서는 생략하도록 한다. 


 여기서 소개할려는 메일 보내기 소스파일은 smtp 전송을 이용하여 메일을 전송하는 프로그램이다. 참고로 메일 보내기 소스파일은 직접 만든게 아닌 타 웹싸이트의 글을 참고하여, 수정한 것이다. 메일 보내기 소스파일의 다운로드는 바로 아래를 이용하도록 하자.


 메일 보내기 소스파일 다운로드 (최종 수정일 : 2015-06-27)


Sendmail.php


 위의 파일을 수정하여 배포하는건 자유지만, 제작자나 수정자의 정보는 남겨두었으면 한다. 제작자 와 수정자 같은 경우 메일 소스파일 안에 주석으로 되어있으니, 자신이 소스파일 수정하여 배포할시 원본 제작자나 수정자를 지우지말고 밑쪽에 자신의 정보를 추가하여 배포했으면 하는 바램이다.



☞ Sendmail.php


 사실 처음에는 코드이그나이터의 Email.php 소스파일을 뜯어서 수정해볼까 했지만, 내가 줄곧 해온 프로그래밍 방식과 달라서 그런지 해석하기가 어려웠다. 그래서 할 수 없이 구글링을 하였고, 메일 함수를 만들기 정말 좋은 소스파일을 발견했다. 솔직히 수정하지 않아도, 모든기능이 완벽하게 구현되어 있엇지만, 편하게 사용하기 위해 몇가지를 수정하였다.


 우선 Sendmail.php 파일을 열어보면 클래스 안에 여러 함수들이 있을 것이다. 이 함수들은 전부 사용자가 사용하는게 아니라 몇가지만 사용하면 되기 때문에, 어려워 할필요는 없다. smtp 의 기본설정 같은경우 아래에서 설명하겠지만 클래스 안에 변수들을 이용 하거나 클래스 객체 변수 선언시 생성자의 인수로 넘겨주면 된다.


 아래는 메일 보내기 소스파일에서 사용할 수 있는 함수(메소드) 에 대한 설명이다. 아래의 함수들은 클래스 내에 선언 되어있으며 클래스를 잘 모르는 경우 클래스의 객체선언과 메소드 접근 방법에 대해 알아보면 도움이 될것이다.


 기본설정(Sendmail.php)


 기본설정 같은 경우, 메일 전송기능을 이용하는데 있어서 설정값의 변화가 거의 없을경우 설정해 놓으면, 사용 시 마다 새로운 설정값들을 생성자로 초기화 시켜줄 필요가 없다. 


 기본설정은 Sendmail.php 파일 내 클래스의 변수값들을 수정하면 된다. 각각의 설명은 Sendmail.php 파일내 주석으로 되어있으니, 그부분을 참고 하길 바란다.


 메일함수 객체 선언과 초기화


 기본적으로 메일기능을 사용하기 위해선 클래스 파일을 추가한뒤 클래스 객체를 변수에 선언해야한다. 선언하는 방법은 아래와 같다.


<?php /* 클래스 파일 로드 */ include "Sendmail.php"; /* 클래스 객체 변수 선언 */ $sendmail = new Sendmail(); ?>


 만약 설정값을 넘겨주어야 한다면 아래와같이 필요한 설정값을 배열로 넘겨주면된다.  아래의 예제에서는 전부다 넘겨주었지만, 기본적으로 생성자에서 자동적으로 설정된 값만 초기화 시키기 때문에 전부다 넘겨줄 필요없이 필요한 값만 넘겨주면 된다. 한가지 명심할점은 배열원소 첨자명은 주석에 나온 명칭처럼 반드시 일치하여야 한다.


<?php /* 클래스 파일 로드 */ include "Sendmail.php"; /* + host : smtp 호스트 주소 + smtp_id : smtp 계정 아이디 + smtp_pw : smtp 계정 비번 + debug : 디버그표시기능 [1 : 활성 0 : 비활성] + charset : 문자 인코딩 + ctype : 메일 컨텐츠의 타입 */ $config=array( 'host'=>'ssl://smtp.gmail.com', 'smtp_id'=>'example@gmail.com', 'smtp_pw'=>'password', 'debug'=>1, 'charset'=>'utf-8', 'ctype'=>'text/plain' ); $sendmail = new Sendmail($config); ?>


send_mail() - 메일보내기


 이 함수는 메일을 보내는 함수로 아래와 같은 인자값을 받는다. 기본적으로 앞쪽의 4개의 인자값들은 필수로 넣어주어야한다. 옵션의 경우 설정할 옵션값이 있을 경우에만 추가해 주면 된다.


<?php /* 클래스 파일 로드 */ include "Sendmail.php"; /* 클래스 객체 변수 선언 */ $sendmail = new Sendmail(); /* + $to : 받는사람 메일주소 ( ex. $to="hong <hgd@example.com>" 으로도 가능) + $from : 보내는사람 이름 + $subject : 메일 제목 + $body : 메일 내용 + $cc_mail : Cc 메일 있을경우 (옵션값으로 생략가능) + $bcc_mail : Bcc 메일이 있을경우 (옵션값으로 생략가능) */ $to="hgd@example.com"; $from="Master"; $subject="메일 제목입니다."; $body="메일 내용입니다."; $cc_mail="cc@example.com"; $bcc_mail="bcc@example.com"; /* 메일 보내기 */ $sendmail->send_mail($to, $from, $subject, $body,$cc_mail,$bcc_mail) ?>

 

 attach() - 첨부파일추가 하여 메일보내기


  메일에 첨부파일이 있을 시 이 함수를 사용하면 된다. 첨부파일 같은경우 대용량일 경우 전송이 제대로 이루어 지지 않을 수 있다. 한가지 명심할점은 메일을 보낼시 첨부파일 메소드를 먼저 사용한뒤 메일을 보내야 한다는 점이다.


<?php /* 클래스 파일 로드 */ include "Sendmail.php"; /* 클래스 객체 변수 선언 */ $sendmail = new Sendmail(); /* + $path : 파일의 절대 경로 + $name : 파일의 이름을 설정 + $ctype : 메일 컨텐츠 타입 (옵션값으로 기본값은 application/octet-stream 이다 ) */ $path="test.txt"; $name="example.txt"; $ctype="application/octet-stream"; /* 첨부파일 추가 */ $sendmail->attach($path,$name,$ctype); $to="hgd@example.com"; $from="Master"; $subject="첨부파일이 있습니다."; $body="첨부파일이 추가되었습니다."; $cc_email="cc@example.com"; $bcc_mail="bcc@example.com"; /* 메일 보내기 */ $sendmail->send_mail($to, $from, $subject, $body,$cc_mail,$bcc_mail) ?>


 Sendmail 함수의 대한 설명은 여기까지며, PHP 의 클래스까지 다룰줄 안다면 크게 어려운점이 없을것이다. smtp 메일 서버 같은 경우 많은 테스트를 거치지 못했기 때문에, 메일 전송이 되지 않는 smtp 메일 서버 도 있을것이다. 그런 경우 해결방안이 없거나 수정이 어려울 시, 다른 smtp 메일 서버를 이용하는게 정신건강에 좋을것이다. 마지막으로 에러나 궁금한점은 댓글을 이용해주길



 Sendmail.php 파일 - 몇가지 수정된 사항 알림!


- msg 변수관련 Notice 에러 부분을 수정. (2015-6-23)

- ereg => preg_match 함수로 대체 , split => explode 함수로 대체 (2015-06-23)

- 다수개의 메일이 보내지도록 수정 (2015-06-23)

 => ex1) $to="hong1@example.com, hong2@example.com";  

    ex2)  $to=array('hong1@example.com','hong2@example.com';

- Cc, Bcc 관련하여 참조된 리스트 메일주소만 보내지고, 직접적으로 메일이 보내지지 않던 부분 수정 (2015-06-24)


상세문의 : webmaster@redinfo.co.kr


댓글
Favicon of http://b.redinfo.co.kr Dreamload 2015.06.23 05:51 신고  Edit  Rep

[※ 메일 발송이 안되는 분들이 있어서 이렇게 댓글을 남깁니다]


소스가 이것저것 많이 수정되어, 원래 있던 Sendmail.php 파일소스는
수정하여 사용하기엔 힘들것같습니다.
현재 포스팅된 Sendmail.php 소스파일은 수정이 완료된 파일이기때문에
이파일을 다운받아서 사용하시면됩니다.

수정된 부분은 이글의 맨아래 쪽을 확인하시면 됩니다~

초보 2015.06.23 16:17 신고  Edit  Rep

안녕하세요.
msg 관련하여 메일을 보냈던 사람입니다.
빠른 피드백으로 수정파일 올려주셔서 오류는 해결했습니다.
염치불구하고 한가지 더 문의드립니다.
cc, bcc를 설정하였습니다만, 수신자는 메일이 수신되지만 cc, bcc는 메일이 수신되지 않습니다.
시간되시면 확인 부탁합니다.
즐거운 하루 되십시오.

Favicon of http://b.redinfo.co.kr Dreamload 2015.06.23 19:35 신고  Edit

cc, bcc 관련하여 참조된 목록도 메일이 전송되도록 수정하였습니다.
많은 테스트를 못해봐서 오류가 있을 수 있습니다~

소스파일에서 수정된 부분이 많기 때문에, 현재 올라온 Sendmail.php 파일소스를 다운받아서 사용해야합니다~

초보 2015.06.30 11:39 신고  Edit  Rep

수정하신 소스파일 잘 사용하고 있습니다.
빠른 피드백을 해주셨는데, 고마움을 전하는 답글이 늦어서 죄송합니다.
즐거운 하루 되십시오.

Favicon of http://b.redinfo.co.kr Dreamload 2015.07.01 10:47 신고  Edit

잘 사용하고 계신다니
정말 다행입니다 ^^ ~

신하민 2015.07.08 17:32 신고  Edit  Rep

안녕하세요 소스를 테스트 해봤는데 gmail, naver에서는 메일이 잘 오는데요,
네이트 메일에서 보낸 사람이 null로 입력되어 스팸 메일함으로 갑니다...
sendmail.php 대충 봤는데 $email 변수가 정의 없이 사용되서 그런것 같기도 한데 한번 봐주시겠습니까 ㅠㅠ

Favicon of http://b.redinfo.co.kr Dreamload 2015.07.08 18:11 신고  Edit

안녕하세요~ nate 메일로 보낼때 보낸사람이 null 로 표시된다는 말씀이시죠 ? 흠.. 이상하네요. 제가 테스트한 메일이 gmail, naver, daum, nate 로 nate 는 지금테스트에서도 보낸사람이 정확하게 표시되어 도착했습니다. mail 을 보내실때 보낸 사람은 $sendmail->send_mail($to, $from, $subject, $body,$cc_mail,$bcc_mail) 에서 $from 변수에 할당됩니다. 이부분이 없더라도, Sandmail.php 파일 맨위쪽에 var $smtp_id 변수의 담긴 주소가 기본값으로 사용됩니다.

$email 변수같은경우 foreach 문에서 쓰이는 변수로 값의 초기화가
필요없습니다. 또한 $email 변수는 보내는 사람이 아닌 받는 쪽의 메일 주소를 담고있습니다. 혹시 디버깅 모드가 켜져있다면 그부분을 봐야 할듯합니다~

도움이 되실련지는 모르겠지만 디버깅 모드 한번 확인해보시고 다시 답글달아주면 감사하겠습니다~

으앙 2015.09.14 13:41 신고  Edit  Rep

php 완전 초보입니다ㅠㅠ
메일 보내는 작업을 해야하는데
위에 설명주신대로 따라했습니다.
SMTP(ssl://smtp.gmail.com) Connecting...
Warning: fsockopen(): unable to connect to ssl://smtp.gmail.com:465 (Permission denied) in /home/jasonmg/www/Sendmail.php on line 77

Warning: fputs() expects parameter 1 to be resource, boolean given in /home/jasonmg/www/Sendmail.php on line 57
...
...
...
...

한페이지 가득 에러가 나옵니다

대충 보니 연결이 안됬다고 하는거 같은데....
위에 설명 해주신거 말고 뭐 설정해야하는 것이 있나요....

전혀 몰라서 어떻게 검색해야 할지도 모르고...답답한마음에
글 남깁니다...!!
어떤거를 또 해줘야하는지
너무 기본적인거라도..... 말씀해주시면 감사하겠습니다!!!!.....


Favicon of http://b.redinfo.co.kr Dreamload 2015.09.15 15:25 신고  Edit

저도 간만에 블로그에 들어와서 이소스를 확인하니 이소스가 가물가물 합니다~ ㅠㅠ

우선 에러같은경우 아래의 블로그를 참고하시면 될듯하네요~
http://shineum.tistory.com/64
그래도 안되신다면, 구글에 아래와 같은 키워드를 입력해보세요
"fsockopen() Permission denied"

설정같은 경우 smtp 주소와 smtp 아이디,비밀번호 만 정확하게 입력하셔도 문제없이 전송이 될듯합니다

많은 도움이 못되서 죄송합니다 ㅠ
좋은 하루되세요~

왕초보.. 2015.12.12 04:32 신고  Edit  Rep

SMTP(ssl://smtp.gmail.com) Connecting...AUTH LOGIN QUIT SMTP(ssl://smtp.gmail.com) Connecting...AUTH LOGIN QUIT SMTP(ssl://smtp.gmail.com) Connecting...AUTH LOGIN QUIT 이런식으로 반복적인 문구가 나오는데 이메일은 안가네요.. 건드린거없이 잘 써넣었는데 뭐가 문제인건지..
editplus에서 autoset을 통해 돌리고 있는데
뭐 따로 설정해야할게 있나요? 가령 오토셋 Sendmail경로라던가..

Favicon of http://blackapple.kr DH 2015.12.15 08:51 신고  Edit  Rep

좋은 소스 감사합니다.
처음에 new Sendmail($config); 선언할때 SMTP 포트번호도 설정할 수 있게 만들면 더 좋을 것 같네요
회사에서 cafe24 메일을 사용하는데 거기는 포트가 587 이더라구요 ㅎㅎ
아무튼 감사합니다

nzzi 2016.01.29 17:35 신고  Edit  Rep

안녕하세요. 좋은소스 너무 감사드립니다.
메일도 잘 발송되고 너무 잘됩니다만, HTML코드가 고대로 텍스트로 전송되네요.
HTML을 사용하려면 어떻게 해야 합니까?

nzzi 2016.01.29 17:50 신고  Edit  Rep

자문자답 합니다.
text/plain 을 text/html 로 바꿔주니 되네요.
그리고 다음 한메일로 보낼때 제목이 깨집니다.
function build_data 에서 Subject 부분을

$mime= "Subject: =?utf-8?b?".base64_encode($subject)."?=\r\n";

아래와 같이 처리하니 정상적으로 발송 되었습니다.

alwaysga 2016.02.29 13:24 신고  Edit  Rep

좋은 소스 감사드립니다. 유용합니다.

혹시나,,

보낸사람 이메일의 명을 바꾸는 방법은 없을까요??

Favicon of https://blog.joostory.net Joo 2016.03.21 19:16 신고  Edit  Rep

공유해주셔서 감사합니다. 수정해보고픈 곳이 몇군데 있는데 github 같은 곳에 올려주신다면 열심히 pr 날려보겠습니다.

nero 2016.05.25 16:15 신고  Edit  Rep

첨부파일을 보낼때에 메일쓰기에서 폼을 어떻게 구성하고, 함수에선 어떻게 받아야 할까요? 위 소스에선 서버에 있는 파일만 가능한것이 맞는지요?

su 2016.07.22 19:47 신고  Edit  Rep

안녕하세요! 초보개발자 입니다.
좋은 소스 감사합니다!

$from << 한글이 깨져 나오는데, 어떻게 수정하여야 하나요?

$mime .= "From: =?utf-8?b?".base64_encode($from)."?=\r\n";
-----------------------------------------------------------
$from=(iconv("EUC-KR", "UTF-8",$from));
이렇게 했더니 안되네요..
답변 부탁 드립니다!
--------------------------------------------------------------------------
해결했습니닷 mail.php
$from = "=?EUC-KR?B?".base64_encode(iconv("UTF-8","EUC-KR","작성자이름"))."?=\r\n";

parkhong 2016.12.26 03:49 신고  Edit  Rep

공유해주신 소스 너무나 잘 사용하고 있는데요, 이메일은 잘 보내지는데, 이메일을 보내지고 나서 잘 보내졌는지 아닌지 확인 할 수 있는 방법은 없나요??

나그네 2017.04.01 21:08 신고  Edit  Rep

좋은 정보 감사합니다. 흥하시길 바랍니다

aefa 2017.05.07 15:25 신고  Edit  Rep

엄...생초짜입니다! 이 글이 smtp를 이용해서 메일을 보내는거라고했는데 그럼 smtp 서버 구축은 알아서 찾아서 하고 이 소스를 사용해야하는건가요?

tkddn3001 2018.01.12 14:37 신고  Edit  Rep

네이버를 통하여 보내고있는 사람입니다. 네이트 다음 네이버 모두 잘가는데 지메일만 안가네요..ㅠㅠ

test 2018.10.29 14:24 신고  Edit  Rep

덕분에 잘 적용 하였습니다! 감사합니다 @_@

초보php 2019.01.15 17:03 신고  Edit  Rep

function send_mail(){
.....
$sendmail = new Sendmail();
$sendmail->send_mail($to, $from, $subject, $body);
.....
}
을 실행하면 send_mail() 이 다시 실행됩니다. 그래서 결국 메일이 두번 발송이 되어 집니다.. Sendmail() 에 문제가 있지 않나 생각이 드는데 원인을 못찾겠네요..

function dialogue($code, $cmd) {
fputs($this->fp, $cmd."\r\n");
$line = fgets($this->fp, 1024); <-- 이 행이 실행되면 위와 같은 현상이 생깁니다.


문제되는 $line 을 로그로 찍어봤습니다.
DEBUG - 2019-01-15 00:35:55 --> UTF-8 Support Enabled
DEBUG - 2019-01-15 00:35:55 --> Global POST, GET and COOKIE data sanitized
DEBUG - 2019-01-15 00:35:56 --> send_mail_pw 시작
DEBUG - 2019-01-15 00:35:57 --> 250 smtp.gmail.com at your service

DEBUG - 2019-01-15 00:35:57 --> 334 VXNlcm5hbWU6

DEBUG - 2019-01-15 00:35:57 --> 334 UGFzc3dvcmQ6

DEBUG - 2019-01-15 00:35:57 --> 235 2.7.0 Accepted

DEBUG - 2019-01-15 00:35:58 --> 250 2.1.0 OK z9sm5368882pfd.99 - gsmtp

DEBUG - 2019-01-15 00:35:58 --> UTF-8 Support Enabled
DEBUG - 2019-01-15 00:35:58 --> Global POST, GET and COOKIE data sanitized
DEBUG - 2019-01-15 00:35:58 --> 250 2.1.5 OK z9sm5368882pfd.99 - gsmtp

DEBUG - 2019-01-15 00:35:58 --> 354 Go ahead z9sm5368882pfd.99 - gsmtp

DEBUG - 2019-01-15 00:35:59 --> send_mail_pw 시작
DEBUG - 2019-01-15 00:35:59 --> 250 2.0.0 OK 1547541357 z9sm5368882pfd.99 - gsmtp

DEBUG - 2019-01-15 00:35:59 --> 221 2.0.0 closing connection z9sm5368882pfd.99 - gsmtp

DEBUG - 2019-01-15 00:35:59 --> send_mail_pw 끝
DEBUG - 2019-01-15 00:35:59 --> Total execution time: 3.9609
DEBUG - 2019-01-15 00:35:59 --> 250 smtp.gmail.com at your service

DEBUG - 2019-01-15 00:35:59 --> 334 VXNlcm5hbWU6

DEBUG - 2019-01-15 00:36:00 --> 334 UGFzc3dvcmQ6

DEBUG - 2019-01-15 00:36:00 --> 235 2.7.0 Accepted

DEBUG - 2019-01-15 00:36:00 --> 250 2.1.0 OK y89sm4450233pfa.136 - gsmtp

DEBUG - 2019-01-15 00:36:00 --> 250 2.1.5 OK y89sm4450233pfa.136 - gsmtp

DEBUG - 2019-01-15 00:36:01 --> 354 Go ahead y89sm4450233pfa.136 - gsmtp

DEBUG - 2019-01-15 00:36:01 --> 250 2.0.0 OK 1547541360 y89sm4450233pfa.136 - gsmtp

DEBUG - 2019-01-15 00:36:02 --> 221 2.0.0 closing connection y89sm4450233pfa.136 - gsmtp

DEBUG - 2019-01-15 00:36:02 --> send_mail_pw 끝
DEBUG - 2019-01-15 00:36:02 --> Total execution time: 3.9394

(비회원은 자신의 글을 볼 수 없습니다.)