PHP 기본함수로 제공되는 mail 함수에서 파일첨부가 가능한것은 알고 있었지만

실제로 메일에 파일을 직접 첨부를 하여 사용할일이 거의 없었기에 별도로 커스텀하지는 않았다.

 

서버환경에따라 보내는 서버 와 메일을 받는 서버쪽 환경에 따라 대용량은 첨부가 안되기 때문에

대부분 보내는쪽 서버에 파일업로드하고, 인증권한 키값(키값, 유효기간) 생성하여 URL 링크로 제공했었다

 

아무튼 간단한 파일첨부 형태의 메일을 제공해야하는 작업이 있어 참고사이트에서 가져온 소스를 조금 손봐서

아래와 같이 만들어 보았으니 참고바란다.

 

PHP 파일첨부 메일 보내기 함수
function phpFmail($data = array()){
	/*
		참고사이트 : https://pythonq.com/so/php/452632
		$fromName: [필]보내는이 이름 
		$fromMail: [필]보내는이 메일
		$subject: 메일제목
		$content: [필]내용
		$file : 파일첨부(경로까지 포함) ex) /home/redinfo/www/files/test.zip
		$fileName : 파일이름 (2023-11-19 주석 수정)
		$to: [필]받는이 메일수조
		$cc: 참조 
		$bcc: 숨은참조		
	*/
	extract($data); // $data 배열을 변수화
 
	if( empty($fromName)){ return false; }
	if( empty($fromMail)){ return false; }
	if( empty($to) ) { return false; }
	if( empty($content)){ return false; }
	$subject = empty($subject) ? "SUBJECT EMPTY":$subject;

	// 데이터 가공
	$fromName   = "=?UTF-8?B?".base64_encode($fromName)."?=";
	$subject = "=?UTF-8?B?".base64_encode($subject)."?=";

	// 컨텐츠 검증
	$contentText = $contentHtml= "";
	if( strip_tags($content) == $content){
		$contentText = $content;
	}else{
		$contentHtml = $content;
	}

	// 메일검증
	$fromMail = filter_var($fromMail, FILTER_VALIDATE_EMAIL);
	$to = filter_var($to, FILTER_VALIDATE_EMAIL);
	if( $fromMail === false || $to === false){ return false; }

	// 해쉬
	$mailHash = md5(date('r', time())); 

	// 파일첨부 체크
	$attachment = "";
	if( !empty($file) && is_file($file)){
		if( empty($fileName)){ $fileName = basename($file); }
		$attachment = chunk_split(base64_encode(file_get_contents($file))); 
	}
	
	// ====== Header =======
	$header = "From: ". $fromName ." <". $fromMail .">".PHP_EOL; 
	$header .= "Reply-To: ".$fromMail.PHP_EOL;
	$header .= "Content-Type: multipart/mixed; boundary=\"PHP-mixed-".$mailHash."\""; 
	if (!empty($cc))  $header .= PHP_EOL."Cc: ". $cc ;
	if (!empty($bcc)) $header .= PHP_EOL."Bcc: ". $bcc;

	// ====== Body =======
	// MAIL BODY INFO
	$body = "--PHP-mixed-".$mailHash.PHP_EOL;
	$body .= "Content-Type: multipart/alternative; boundary=\"PHP-alt-".$mailHash."\"".PHP_EOL.PHP_EOL;

	// TEXT/PLAIN
	if( !empty($contentText) ) { 
		$body .= "--PHP-alt-".$mailHash;
		$body .= "Content-Type: text/plain; charset=\"UTF-8\"".PHP_EOL;
		$body .= "Content-Transfer-Encoding: 7bit".PHP_EOL.PHP_EOL;
		$body .= $contentText;
		$body .= PHP_EOL.PHP_EOL;
	}


	// TEXT/HTML
	if( !empty($contentHtml) ) {
		$body .= "--PHP-alt-".$mailHash.PHP_EOL;
		$body .= "Content-Type: text/html; charset=\"UTF-8\"".PHP_EOL;
		$body .= "Content-Transfer-Encoding: 7bit".PHP_EOL.PHP_EOL;
		$body .= $contentHtml;
		$body .= PHP_EOL.PHP_EOL;
	}

	// MESSAGE - END
	$body .= "--PHP-alt-".$mailHash."-- ".PHP_EOL;

	// FILE ATTACHMENT
	if( !empty($attachment)) { 
		$body .= "--PHP-mixed-".$mailHash."".PHP_EOL;
		$body .= "Content-Type: application/zip; name=\"".$fileName."\"".PHP_EOL;
		$body .= "Content-Transfer-Encoding: base64".PHP_EOL;
		$body .= "Content-Disposition: attachment".PHP_EOL.PHP_EOL;
		$body .= $attachment."".PHP_EOL;
		$body .= "--PHP-mixed-".$mailHash."--".PHP_EOL;
	}

	ob_start();
		echo "To: ".$to.'<br>';
		echo '<hr>';
		echo "Subject: ".$subject.'<br>';
		echo '<hr>';
		echo '<br><br><h1>HEADER</h1>';
		echo nl2br($header);
		echo '<br><br><h1>BODY</h1>';
		echo nl2br($body);
	$debug = ob_get_clean();

	$result = array('rst'=>@mail( $to, $subject, $body, $header ), 'debug'=>$debug);

	return $result;
}

 

사용예제
<?php 
$file =  $_SERVER['DOCUMENT_ROOT']."/sourcecode.php";
$data = array(
	'to'=>'lcy@redinfo.co.kr'
	,'fromName'=>'REDINFO'
	,'fromMail'=>'webmaster@redinfo.co.kr'
	,'subject'=>'안녕하세요'
	,'content'=>'<h1>파일입니다.</h1>'
	,'file'=>$file
	,'fileName'=>basename($file)
);
$rst = phpFmail($data);
var_dump($rst['rst']);