PHP mail 함수로 UTF-8 한글 이메일 안정적으로 발송하는 방법
페이지 정보

본문
PHP mail() 함수를 사용할 때 한글 제목과 본문, 발신자 정보가 깨지는 원인을 파악하고, Base64 인코딩과 적절한 헤더 설정을 통해 안정적으로 메일을 발송하는 방법을 안내합니다.
PHP mail() 함수로 UTF-8 한글 이메일 안정적으로 발송하는 방법
PHP의 mail() 함수를 사용하여 UTF-8 인코딩의 한글 제목, 본문, 그리고 보내는 사람 및 받는 사람 정보를 가진 이메일을 발송할 때 한글이 깨지는 현상을 방지하려면 적절한 Base64 인코딩과 헤더 설정이 필요합니다.
1. 주요 원인
UTF-8 인코딩된 문자열 및 MIME 헤더(Base64 인코딩 등) 처리가 누락되었기 때문에 메일 클라이언트에서 제목이나 이름 등의 한글이 깨지는 현상이 발생합니다.
2. 해결 및 적용 방법
이름 및 제목 인코딩 처리보내는 사람 이름, 받는 사람 이름, 참조, 숨은참조, 그리고 메일 제목은 =?utf-8?B?...?= 형식과 base64_encode()를 조합하여 인코딩합니다.
$sendmailFromName = "=?utf-8?B?".base64_encode($sendmailFromName)."?=";
$sendmailToName = "=?utf-8?B?".base64_encode($sendmailToName)."?=";
if ($sendmailSubject) {
$sendmailSubject = "=?utf-8?B?".base64_encode($sendmailSubject)."?=";
}
메일 헤더(Header) 및 본문 설정
HTML 형식과 UTF-8 인코딩을 명시하는 Content-Type 및 MIME-Version 헤더를 조합하여 전달합니다.
$sendmailHeader = "Content-Type: text/html; charset=utf-8\r\n";
$sendmailHeader.= "MIME-Version: 1.0\r\n";
$sendmailHeader.= "Return-Path: {$sendmailToName} <{$sendmailFromEmail}>\r\n";
$sendmailHeader.= "From: {$sendmailFromName} <{$sendmailFromEmail}>\r\n";
$sendmailHeader.= "Reply-To: <{$sendmailFromEmail}>\r\n";
$sendmailBody = $sendmailContent;
$send_mail = mail($sendmailToEmail, $sendmailSubject, $sendmailBody, $sendmailHeader);
3. 확인 및 주의사항
- 테스트 메일을 발송하여 수신함에서 제목, 본문, 보낸 사람 이름의 한글이 깨지지 않고 정상 표시되는지 확인합니다.
- 서버 환경(sendmail 설정 등)에 따라 메일 발송 성공 여부가 달라질 수 있으므로, 함수가
true를 반환하더라도 실제 수신 및 스팸 처리 여부를 함께 점검해야 합니다.
메일 본문 HTML 태그 및 UTF-8 인코딩 헤더 설정 방법
PHP mail() 함수를 사용하여 메일 본문에 HTML 태그를 사용하고 UTF-8 인코딩을 적용하려면, 메일 헤더($headers)에 MIME 버전과 Content-Type을 명시해야 합니다.
헤더 설정 예시
$headers = 'MIME-Version: 1.0'. "\r\n";
$headers.= 'Content-Type: text/html; charset=utf-8'. "\r\n";
$headers.= 'From: [email protected]'. "\r\n";
MIME-Version: 1.0: MIME 형식을 지원하도록 설정합니다.Content-Type: text/html; charset=utf-8: 본문 형식을 HTML로 지정하고, 문자셋을utf-8로 설정하여 한글을 포함한 다양한 문자가 올바르게 표시되도록 합니다.
적용 코드 예시
$to = "[email protected]";
$subject = "한글 제목!";
$content = "<p>한글 본문 내용</p>";
$headers = 'MIME-Version: 1.0'. "\r\n";
$headers.= 'Content-Type: text/html; charset=utf-8'. "\r\n";
$headers.= 'From: [email protected]'. "\r\n";
mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $content, $headers);
참고: 서버 환경(sendmail 설정 등)에 따라 메일 발송 성공 여부나 수신 상태가 달라질 수 있습니다.
PHP mail() 함수로 UTF-8 한글 이메일 안정적으로 발송하는 방법
PHP의 mail() 함수를 사용할 때 한글 제목, 본문, 보내는 사람 및 받는 사람 이름이 깨지지 않도록 하려면 Base64 인코딩과 올바른 MIME 헤더를 설정해야 합니다.
1. 주요 적용 사항
- 제목 및 이름 인코딩: 메일 제목과 보내는/받는 사람 이름은
=?utf-8?B?...?=형식(Base64)으로 인코딩하여 전달합니다. - 헤더 설정:
Content-Type헤더에text/html과charset=utf-8을 명시하고,MIME-Version: 1.0을 포함한 적절한 헤더 조합을 구성합니다.
2. 소스 코드 적용 예시
$sendmailFromName = "보내는이름";
$sendmailFromEmail = "보내는email";
$sendmailToName = "받는이름";
$sendmailToEmail = "받는email";
$sendmailSubject = "메일보내기";
$sendmailContent = "내용 1<br>내용 2<br>";
// Base64 인코딩 처리
$sendmailFromName = "=?utf-8?B?".base64_encode($sendmailFromName)."?=";
$sendmailToName = "=?utf-8?B?".base64_encode($sendmailToName)."?=";
if ($sendmailSubject) {
$sendmailSubject = "=?utf-8?B?".base64_encode($sendmailSubject)."?=";
}
// 헤더 조합
$sendmailHeader = "Content-Type: text/html; charset=utf-8\r\n";
$sendmailHeader.= "MIME-Version: 1.0\r\n";
$sendmailHeader.= "From: {$sendmailFromName} <{$sendmailFromEmail}>\r\n";
$sendmailHeader.= "Reply-To: <{$sendmailFromEmail}>\r\n";
// 메일 발송 실행
$send_mail = mail($sendmailToEmail, $sendmailSubject, $sendmailContent, $sendmailHeader);
3. 주의사항 및 다음 행동
- 서버 환경(sendmail 설정 등)에 따라 메일 발송 성공 여부나 실제 수신 상태가 달라질 수 있습니다.
- 발송 후 수신함에서 제목, 본문, 보낸 사람 이름의 한글이 깨지지 않고 정상 표시되는지 확인해야 합니다.
PHP mail() 함수 서버 환경 점검
PHP mail() 함수가 성공(true)을 반환하더라도 실제 수신이 되지 않거나 스팸으로 처리되는 경우, 서버 환경과 메일 설정에 따라 결과가 달라질 수 있습니다.
확인 위치 및 점검 사항
- 서버 sendmail 설정: 리눅스 서버 등에서 sendmail 또는 외부 SMTP 메일 전송 기능이 실제로 정상 작동하고 있는지 확인해야 합니다.
- 도메인 등록 확인: 리눅스 환경에서
mail()함수가 오류 없이 작동하지 않을 때는/etc/mail/local-host-names에 도메인이 등록되어 있는지 확인하고, 등록되지 않았다면 도메인을 등록한 뒤 sendmail을 재시작(/etc/init.d/sendmail restart)하여/var/spool/mqueue/에 쌓여 있던 메일이 전송되는지 확인할 수 있습니다. - 신뢰할 수 있는 사용자 설정: sendmail을 사용할 때
envelope sender (-f)를 설정하는 경우, 웹서버가 실행되는 사용자가 sendmail 설정의 신뢰할 수 있는 사용자 목록에 추가되어 있지 않으면 메시지에X-Warning헤더가 추가되거나 발송에 영향을 줄 수 있습니다. (예: sendmail 사용자 기준/etc/mail/trusted-users파일 확인)
상황별 표
| 내 상황 | 우선할 판단 | 다음 행동 |
|---|---|---|
| 메일 제목이나 보낸 사람 이름의 한글이 깨질 때 | =?utf-8?B?...?= 형식과 base64_encode() 적용 | 이름 및 제목 변수를 Base64로 감싸서 전달 |
| 메일 본문의 일부 글자가 느낌표(!) 등으로 변환될 때 | 메일 본문의 글자 수 초과 및 인코딩 헤더 누락 점검 | Content-Transfer-Encoding: base64 헤더 추가 및 본문 chunk_split(base64_encode($content)) 처리 |
mail() 함수가 성공(true)을 반환하나 메일이 수신되지 않을 때 | 서버 sendmail 설정 및 로컬 도메인 등록 상태 점검 | /etc/mail/local-host-names에 도메인 등록 후 sendmail 재시작 |
실전 FAQ
Q. mail() 함수 실행 시 true를 반환하는데 수신함에 메일이 오지 않습니다.
- 실제 막히는 지점: PHP 함수 자체는 시스템의 sendmail 호출 성공 여부만 반환하므로, 실제 MTA(Sendmail, Postfix) 설정이나 도메인 신뢰도 문제로 인해 메일이 큐에 쌓이거나 스팸 차단될 수 있습니다.
- 대안 및 해결: 서버의
/var/spool/mqueue/폴더를 확인하고,/etc/mail/local-host-names에 도메인이 올바르게 등록되어 있는지 점검한 뒤 sendmail 서비스를 재시작(sudo /etc/init.d/sendmail restart)해 보아야 합니다.
Q. 본문 내용이 길어질 때 특정 한글이나 특수문자가 느낌표(!)로 깨지는 이유는 무엇인가요?
- 실제 막히는 지점: 메일 본문 내용이 1,000자를 초과하는 경우 일반 텍스트 전송 시 줄바꿈이나 인코딩 제약으로 인해 문자가 변형될 수 있습니다.
- 대안 및 해결: 헤더에
Content-Transfer-Encoding: base64를 추가하고, 본문 데이터를chunk_split(base64_encode($content))형태로 변환하여 전송해야 합니다.
함께 보면 좋은 글
참고자료
기타 참고자료
- 이전글MySQL 쿼리 에러 발생 시 파일명과 라인 번호를 함께 출력하여 디버깅하는 방법 26.10.05
- 다음글그누보드 댓글 개수에 따른 원글 수정/삭제 제한 127개 이상으로 늘리는 방법 26.10.05
댓글목록
등록된 댓글이 없습니다.