php폼메일로 일본어 메일 보내기

일본어 메일은 반드시 JIS코드로 송신해야합니다.

메일 해더의 캐릭터셋은 ISO-2022-JP로 합니다.

일본어가 들어간 송신자이름, 수신자이름, 제목, 파일명은 반드시
ISO-2022-JP코드로 64B인코딩해야합니다.
(예,Subject: =?ISO-2022-JP?B?GyRCI1cjRSNCRVBPPyROJCpDTiRpJDsbKEI=?=)

RFC규정에 Quoted Printable 인코딩 방법이 있는데 이 인코딩 방법은
일본어 메일 헤더내에 절대로 사용하지 않아야 합니다. 의외로 이 인코딩
방법을 쓰는 메일들을 많이 봅니다. 많은 클라이언트 메일러에서
이 인코딩 방법을 지원하지 않습니다. 그리고 I-MODE등의 휴대전화로
메일을 보냈을때 여지 없이 깨어집니다. 많은 비지네스맨들이
메일을 휴대전화로 전송하여 확인하고 있다는 사실을 염두해야 합니다....

Shift_JIS코드로 아무 처리없이 그냥 메일을 보내지 말아야 합니다.
일부 메일러에서는 처리해주는 경우가 있으나 아직도 미비합니다.
이렇게 보내지는 메일도 많이 보아 왔습니다.휴대전화에서는 깨짐.

가급적이면 Content-type: text/html; 을 사용하지 않는다. 대부분의
PC에서는 지원이 되나 휴대전화에서 지원하지 않아 많은 사람들이
짜증을 냅니다. 이 콘텐트 타이프를 사용하고자 할때는
Content-Type: multipart/alternative; 를 사용합니다.
이 때에는 처음 텍스트 파트는
------=_NextPart
Content-Type: text/plain;
charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit
와 같은 방법으로 그냥 JIS코드로 본문을 작성합니다.
JIS코드는 ISO에 등록된 7bit코드라서 위와같이 지정합니다.
다음 HTML파트는
------=_NextPart
Content-Type: text/html;
charset="iso-2022-jp"
Content-Transfer-Encoding: quoted-printable
와 같은 방법으로 여기에서는 quoted-printable를 사용합니다.
일반적으로 64인코딩을 하는 경우도 있는데 일부 메일러와
휴대전화에서 지원하지 않습니다. 위와 같이 처리하면
휴대전화에서도 HTML로 송신된 메일을 받아볼 수 있습니다.

무작정 전부다 64인코딩이나 Q인코딩하지 말아야 합니다.
일부 텍스트 메일과 위의 multipart/alternative타입의 경우
메일 본문을 모두 64인코딩이나 Q인코딩하는 사례 역시 많이
발견합니다만, 휴대전화에서는 지원하지 않고 일본어 메일러에서
지원하지 않는 경우가 있습니다.

Content-Type: multipart/mixed; 의 경우도 위와 같은 방법으로
헤더와 메일 본문을 작성합니다.(아래 소스 참조)

(다 알고 있는 부분이겠지만...)
korea.internet.com의 경우 Content-Type: multipart/alternative; 를
사용하여 메일을 송신하고 있는데 위의 텍스트 부분은 64인코딩을하고
HTML부분은 Q인코딩하여 송신을 합니다. 이것은 한글의 완성형
euc-kr이나 ks_c_5601-1987은 8bit 코드 라서 텍스트 부분을 RFC규정에
준하여 64인코딩을 해주는 겁니다. 물론 이렇게 안해줘도 한국에서는
메일이 잘 전달이 됩니다. 요즈음은 거의 안 쓰이지만 이전의 7bit
ISO 한글코드를 사용하면 64인코딩을 하지 않아도 된다는 이야기 입니다.
이렇게 인코딩을 하는 것은 일부 메일 서버에서 아직도 8bit메일을 통과
시키지 못하는 경우가 가끔 있기 때문입니다.


function jpmail ($from_mail, $from_name, $to, $subject, $body, $attach, $filename)
{

$boundary = "____nogada" . uniqid("b");
$from_name = '=?ISO-2022-JP?B?'.base64_encode(euc2jis($from_name).'?=';

###입력값이 Shift_JIS 코드일때
//$from_name = '=?ISO-2022-JP?B?'.base64_encode(sjis2jis($from_name).'?=';

$from = $from_name." <".$from_mail.">";

### 제목을 jis(iso-2022-jp)코드로 변환해서 MIME 인코딩한다.
$subject = '=?ISO-2022-JP?B?'.base64_encode(euc2jis($subject)).'?=';

###입력값이 Shift_JIS 코드일때
//$subject = '=?ISO-2022-JP?B?'.base64_encode(sjis2jis($subject)).'?=';

### 본문을 jis코드로 변환한다.
$body = euc2jis($body);

###입력값이 Shift_JIS 코드일때
//$body = sjis2jis($body);

$body = str_replace("rn", "n", $body);
$body = str_replace("r", "n", $body);

### 첨부할 파일 데이터를 base64 인코딩 한다.
$attach = base64_encode($attach);

### 파일명을 jis( iso-2022-jp)코드로해서 MIME 인코딩한다.
$filename = '=?ISO-2022-JP?B?'.base64_encode(euc2jis($filename).'?=';

###입력값이 Shift_JIS 코드일때
//$filename = '=?ISO-2022-JP?B?'.base64_encode(sjis2jis($filename).'?=';

### 메일 송신

$sendmail = '/usr/sbin/sendmail';

$MAIL = popen("$sendmail -f $from_mail $to", "w");

###송신자의 메일어드레스가 없어도 송신이 가능한 경우
//$MAIL = popen("$sendmail -t -f $to", "w");



########################## 메일 데이타 작성

### 본문 헤더

fputs($MAIL, "From: $fromn");
fputs($MAIL, "To: $ton");
fputs($MAIL, "Subject: $subjectn");
fputs($MAIL, "MIME-Version: 1.0n");
fputs($MAIL, "Content-Type: Multipart/Mixed;n");
fputs($MAIL, " boundary="$boundary"n");
fputs($MAIL, "n");

### 메일 본문 파트
fputs($MAIL, "This is a multi-part message in MIME format.n");
fputs($MAIL, "n");
fputs($MAIL, "--$boundaryn");
fputs($MAIL, "Content-Type: text/plain;n");
fputs($MAIL, " charset="ISO-2022-JP"n");
fputs($MAIL, "Content-Transfer-Encoding: 7bitn");
fputs($MAIL, "n");
fputs($MAIL, "$bodyn");

### 첨부파일 파트
fputs($MAIL, "--$boundaryn");
fputs($MAIL, "Content-Type: application/octet-stream;n");
fputs($MAIL, " name="$filename"n");
fputs($MAIL, "Content-Transfer-Encoding: base64n");
fputs($MAIL, "Content-Disposition: attachment;n");
fputs($MAIL, " filename="$filename"n");
fputs($MAIL, "n");
fputs($MAIL, "$attachn");
fputs($MAIL, "n");

### 멀티 파트 끝
fputs($MAIL, "--$boundary" . "--n");
pclose($MAIL);
}


###Shift_JIS코드를 JIS코드로 변환
function sjis2jis(&$sjis_string)
{
$jis_code = '';
$c = 0;
$b = unpack("C*", $sjis_string);
$n = count($b);
$esc = array(chr(0x1B).chr(0x28).chr(0x42),
chr(0x1B).chr(0x24).chr(0x42),
chr(0x1B).chr(0x28).chr(0x49));

for ($i = 1; $i <= $n; $i++) {
$b1 = $b[$i];
if (0xA1 <= $b1 && $b1 <= 0xDF) {
if ($c != 2) {
$c = 2;
$jis_code .= $esc[$c];
}
$jis_code .= chr($b1 - 0x80);
} elseif ($b1 >= 0x80) {
if ($c != 1) {
$c = 1;
$jis_code .= $esc[$c];
}
$b2 = $b[$i+1];
$b1 <<= 1;
if ($b2 < 0x9F) {
if ($b1 < 0x13F) $b1 -= 0xE1; else $b1 -= 0x61;
if ($b2 > 0x7E) $b2 -= 0x20; else $b2 -= 0x1F;
} else {
if ($b1 < 0x13F) $b1 -= 0xE0; else $b1 -= 0x60;
$b2 -= 0x7E;
}
$jis_code .= chr($b1).chr($b2);
$i++;
} else {
if ($c != 0) {
$c = 0;
$jis_code .= $esc[$c];
}
$jis_code .= chr($b1);
}
}
if ($c != 0) $jis_code .= $esc[0];

return $jis_code;
}



###일본어 EUC코드를 JIS코드로 변환
function euc2jis(&$euc_string)
{
$jis_code = '';
$c = 0;
$b = unpack("C*", $euc_string);
$n = count($b);
$esc = array(chr(0x1B).chr(0x28).chr(0x42),
chr(0x1B).chr(0x24).chr(0x42),
chr(0x1B).chr(0x28).chr(0x49));

for ($i = 1; $i <= $n; $i++) {
$b1 = $b[$i];
if ($b1 == 0x8E) {
if ($c != 2) {
$c = 2;
$jis_code .= $esc[$c];
}
$jis_code .= chr($b[$i+1] - 0x80);
$i++;
} elseif ($b1 > 0x8E) {
if ($c != 1) {
$c = 1;
$jis_code .= $esc[$c];
}
$jis_code .= chr($b1 - 0x80).chr($b[$i+1] - 0x80);
$i++;
} else {
if ($c != 0) {
$c = 0;
$jis_code .= $esc[$c];
}
$jis_code .= chr($b1);
}
}
if ($c != 0) $jis_code .= $esc[0];

return $jis_code;
}

?>


###메일 송신 테스트 샘플

$from_name = 坂本
$from_mail = "my@sendmail.com";
$to = "your@testmail.com";
$subject = "日本語題名";
$body = "これは日本語の本文です.";
$attach_data = "これは添付ファイルです.n";
$attach_data .= "添付ファイルはバイナリデ-タの場合もあります.n";
$filename = "日本語ファイル.txt";

jpmail( $from_mail, $from_name, $to, $subject, $body, $attach_data, $filename);



メ-ル送信完了

?><div class='small'>[이 게시물은 관리자님에 의해 2011-10-31 17:12:10 PHP & HTML에서 이동 됨]</div>
|

댓글 2개

문제는 일본인들이 대부분의 메일을 휴대폰메일을 사용한다는 점입니다.

웹상에서는 정상적으로 전달이 됩니다만..모바일에서 확인한바는 없습니다...아직까진..

일반 웹메일에서 정상적으로 전달이 되어도 모바일메일에서는 문자가 깨질수 있다는 점을 이야기 하는데요.

야후재팬메일만 모바일메일로 정상적으로 전달이 된답니다.

일본인들이 쓰는 웹메일은 ..대부분 유료이거나 이동통신사 홈페이지에서 사용하기 때문에

외국인이 사용해보거나 테스트하기가 까다롭네요.

utf-8 방식도 실제 일본인들에게는 별로 소용없는 일인듯...합니다.

웹표준방식을 정해놓으면 뭐하나 ...에효.
php폼메일로 일본어 메일 보내기
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

태그 필터 (최대 3개) 전체 개발자 소스 기타 mysql 팁자료실 javascript php linux flash 정규표현식 jquery node.js mobile 웹서버 os 프로그램 강좌 썸네일 이미지관련 도로명주소 그누보드5 기획자 견적서 계약서 기획서 마케팅 제안서 seo 통계 서식 통계자료 퍼블리셔 html css 반응형 웹접근성 퍼블리싱 표준화 반응형웹 홈페이지기초 부트스트랩 angularjs 포럼 스크린리더 센스리더 개발자톡 개발자팁 퍼블리셔톡 퍼블리셔팁 기획자톡 기획자팁 프로그램강좌 퍼블리싱강좌
+
제목 글쓴이 날짜 조회
19년 전 조회 3,057
19년 전 조회 2,725
19년 전 조회 2,946
19년 전 조회 3,187
19년 전 조회 2,907
19년 전 조회 2,630
19년 전 조회 2,947
19년 전 조회 4,534
19년 전 조회 2,444
19년 전 조회 2,462
19년 전 조회 3,505
19년 전 조회 3,182
19년 전 조회 2,830
19년 전 조회 2,071
19년 전 조회 1,804
19년 전 조회 2,894
19년 전 조회 1,757
19년 전 조회 2,334
19년 전 조회 3,970
19년 전 조회 3,753
19년 전 조회 3,471
19년 전 조회 3,428
19년 전 조회 1,587
19년 전 조회 1,953
19년 전 조회 1,877
19년 전 조회 2,551
19년 전 조회 4,637
19년 전 조회 2,781
19년 전 조회 1,938
19년 전 조회 1,958
19년 전 조회 1,837
19년 전 조회 2,579
19년 전 조회 8,192
19년 전 조회 2,745
19년 전 조회 2,808
19년 전 조회 3,059
19년 전 조회 2,212
19년 전 조회 2,228
19년 전 조회 2,193
19년 전 조회 2,086
19년 전 조회 2,273
19년 전 조회 2,538
19년 전 조회 3,104
19년 전 조회 2,345
19년 전 조회 1,923
19년 전 조회 2,851
19년 전 조회 5,021
19년 전 조회 3,515
19년 전 조회 3,469
19년 전 조회 2,994
19년 전 조회 2,416
19년 전 조회 1,505
19년 전 조회 3,159
19년 전 조회 2,023
19년 전 조회 5,387
19년 전 조회 2,452
19년 전 조회 3,446
19년 전 조회 2,880
19년 전 조회 1,779
19년 전 조회 3,897
19년 전 조회 2,432
19년 전 조회 2,310
19년 전 조회 3,033
19년 전 조회 3,317
19년 전 조회 2,513
19년 전 조회 2,284
19년 전 조회 2,343
19년 전 조회 2,018
19년 전 조회 3,101
19년 전 조회 2,023
19년 전 조회 2,057
19년 전 조회 1,716
19년 전 조회 2,225
19년 전 조회 2,206
19년 전 조회 2,497
19년 전 조회 2,893
19년 전 조회 2,411
19년 전 조회 2,469
19년 전 조회 3,519
19년 전 조회 3,238
19년 전 조회 3,221
19년 전 조회 3,038
19년 전 조회 2,049
19년 전 조회 2,358
19년 전 조회 2,248
19년 전 조회 2,068
19년 전 조회 2,513
19년 전 조회 2,431
19년 전 조회 2,818
19년 전 조회 2,193
19년 전 조회 3,516
19년 전 조회 1,989
19년 전 조회 2,594
19년 전 조회 1,608
19년 전 조회 2,846
19년 전 조회 3,081
19년 전 조회 2,178
19년 전 조회 2,005
19년 전 조회 2,486
19년 전 조회 2,398