PHP

php 메일 보내기

Machine_웅 2018. 10. 25. 14:05
728x90
반응형


 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)


상세문의 :

출처: http://b.redinfo.co.kr/87 [꿈꾸는 개발자]

출처: http://b.redinfo.co.kr/87 [꿈꾸는 개발자]

728x90
반응형