네이트 메일 깨짐 -이전에 문의 올렸는데요. > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

네이트 메일 깨짐 -이전에 문의 올렸는데요. 정보

네이트 메일 깨짐 -이전에 문의 올렸는데요.

본문

그누보드로 작성된 싸이트에서
메일을 보내면

내용이ㅣ 전부 깨져서 들어 옵니다.   질문답변게시판이나 활용팁을 검색 한 결과

케릭터 셋때문에 오류가 나는거 같은데...     올려준거 하나하나 다 검색 해서 적용해봐도

계속 깨져서 나오네요..

어떻게 해야 할까요? ㅠㅜ  


이전에 다른 분깨서 문의한 제와 비슷한 내용이구요(전  eu-kr)
http://sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=5923&sca=&sfl=wr_subject%7C%7Cwr_content&stx=%B8%DE%C0%CF&sop=and&page=4

http://sir.co.kr/bbs/board.php?bo_table=g4_qa&wr_id=118286&sca=&sfl=wr_subject%7C%7Cwr_content&stx=%B8%DE%C0%CF&sop=and&page=7

아래는 제가 운영하는 싸이트 mailer.lib.php 내용입니다.


<?
if (!defined("_GNUBOARD_")) exit;

// 메일 보내기 (파일 여러개 첨부 가능)
// type : text=0, html=1, text+html=2
function mailer($fname, $fmail, $to, $subject, $content, $type=0, $file="", $cc="", $bcc="")
{
    global $config;
    global $g4;

    // 메일발송 사용을 하지 않는다면
    if (!$config[cf_email_use]) return;

    $fname   = "=?$g4[charset]?B?" . base64_encode($fname) . "?=";
    $subject = "=?$g4[charset]?B?" . base64_encode($subject) . "?=";
    //$g4[charset] = ($g4[charset] != "") ? "charset=$g4[charset]" : "";

    $header  = "Return-Path: <$fmail>\n";
    $header .= "From: $fname <$fmail>\n";
    $header .= "Reply-To: <$fmail>\n";
    if ($cc)  $header .= "Cc: $cc\n";
    if ($bcc) $header .= "Bcc: $bcc\n";
    $header .= "MIME-Version: 1.0\n";
    //$header .= "X-Mailer: SIR Mailer 0.91 (sir.co.kr) : $_SERVER[SERVER_ADDR] : $_SERVER[REMOTE_ADDR] : $g4[url] : $_SERVER[PHP_SELF] : $_SERVER[HTTP_REFERER] \n";
    // UTF-8 관련 수정
    $header .= "X-Mailer: SIR Mailer 0.92 (sir.co.kr) : $_SERVER[SERVER_ADDR] : $_SERVER[REMOTE_ADDR] : $g4[url] : $_SERVER[PHP_SELF] : $_SERVER[HTTP_REFERER] \n";

    if ($file != "") {
        $boundary = uniqid("http://sir.co.kr/");

        $header .= "Content-type: MULTIPART/MIXED; BOUNDARY=\"$boundary\"\n\n";
        $header .= "--$boundary\n";
    }

    if ($type) {
        $header .= "Content-Type: TEXT/HTML; charset=$g4[charset]\n";
        if ($type == 2)
            $content = nl2br($content);
    } else {
        $header .= "Content-Type: TEXT/PLAIN; charset=$g4[charset]\n";
        $content = stripslashes($content);
    }
    $header .= "Content-Transfer-Encoding: BASE64\n\n";
    $header .= chunk_split(base64_encode($content)) . "\n";

    if ($file != "") {
        foreach ($file as $f) {
            $header .= "\n--$boundary\n";
            $header .= "Content-Type: APPLICATION/OCTET-STREAM; name=\"$f[name]\"\n";
            $header .= "Content-Transfer-Encoding: BASE64\n";
            $header .= "Content-Disposition: inline; filename=\"$f[name]\"\n";
   $header .= "Content-Type:text/html;charset=euc-kr\r";


            $header .= "\n";
            $header .= chunk_split(base64_encode($f[data]));
            $header .= "\n";
        }
        $header .= "--$boundary--\n";
    }
    @mail($to, $subject, "", $header);
}

// 파일 첨부시
/*
$fp = fopen(__FILE__, "r");
$file[] = array(
    "name"=>basename(__FILE__),
    "data"=>fread($fp, filesize(__FILE__)));
fclose($fp);
*/

// 파일을 첨부함
function attach_file($filename, $file)
{
    $fp = fopen($file, "r");
    $tmpfile = array(
        "name" => $filename,
        "data" => fread($fp, filesize($file)));
    fclose($fp);
    return $tmpfile;
}

// 메일 유효성 검사
// core PHP Programming 책 참고
// hanmail.net , hotmail.com , kebi.com 등이 정상적이지 않음으로 사용 불가
function verify_email($address, &$error)
{
    global $g4;

    $WAIT_SECOND = 3; // ?초 기다림

    list($user, $domain) = split("@", $address);

    // 도메인에 메일 교환기가 존재하는지 검사
    if (checkdnsrr($domain, "MX")) {
        // 메일 교환기 레코드들을 얻는다
        if (!getmxrr($domain, $mxhost, $mxweight)) {
            $error = "메일 교환기를 회수할 수 없음";
            return false;
        }
    } else {
        // 메일 교환기가 없으면, 도메인 자체가 편지를 받는 것으로 간주
        $mxhost[] = $domain;
        $mxweight[] = 1;
    }

    // 메일 교환기 호스트의 배열을 만든다.
    for ($i=0; $i<count($mxhost); $i++)
        $weighted_host[($mxweight[$i])] = $mxhost[$i];
    ksort($weighted_host);

    // 각 호스트를 검사
    foreach($weighted_host as $host) {
        // 호스트의 SMTP 포트에 연결
        if (!($fp = @fsockopen($host, 25))) continue;

        // 220 메세지들은 건너뜀
        // 3초가 지나도 응답이 없으면 포기
        socket_set_blocking($fp, false);
        $stoptime = $g4[server_time] + $WAIT_SECOND;
        $gotresponse = false;

        while (true) {
            // 메일서버로부터 한줄 얻음
            $line = fgets($fp, 1024);

            if (substr($line, 0, 3) == "220") {
                // 타이머를 초기화
                $stoptime = $g4[server_time] + $WAIT_SECOND;
                $gotresponse = true;
            } else if ($line == "" && $gotresponse)
                break;
            else if ($g4[server_time] > $stoptime)
                break;
        }

        // 이 호스트는 응답이 없음. 다음 호스트로 넘어간다
        if (!$gotresponse) continue;

        socket_set_blocking($fp, true);

        // SMTP 서버와의 대화를 시작
        fputs($fp, "HELO $_SERVER[SERVER_NAME]\r\n");
        echo "HELO $_SERVER[SERVER_NAME]\r\n";
        fgets($fp, 1024);

        // From을 설정
        fputs($fp, "MAIL FROM: <info@$domain>\r\n";
        fgets($fp, 1024);

        // 주소를 시도
        fputs($fp, "RCPT TO: <$address>\r\n");
        echo "RCPT TO: <$address>\r\n";
        $line = fgets($fp, 1024);

        // 연결을 닫음
        fputs($fp, "QUIT\r\n");
        fclose($fp);

        if (substr($line, 0, 3) != "250") {
            // SMTP 서버가 이 주소를 인식하지 못하므로 잘못된 주소임
            $error = $line;
            return false;
        } else
            // 주소를 인식했음
            return true;

    }
   
    $error = "메일 교환기에 도달하지 못하였습니다.";
    return false;
}
?>

그리고 아래는 내용이 깨져서 호스팅 데몬메일로 들어온 내용입니다.

Hi. This is the qmail-send program at gp-029.cafe24.com.
I'm afraid I wasn't able to deliver your message to the following addresses.
This is a permanent error; I've given up. Sorry it didn't work out.

<*** 개인정보보호를 위한 이메일주소 노출방지 ***>
MIME-Version: 1.0
X-Mailer: SIR Mailer 0.92 (sir.co.kr) : 211.34.104.16 : 59.10.186.196 : 
웹싸이트주소 /www/adm/mail_test.php :
웹싸이트주소/www/adm/mail_list.php
Content-Type: TEXT/HTML; charset=EUC-KR
Content-Transfer-Encoding: BASE64

PHRhYmxlIGlkPSJUYWJsZV8wMSIgd2lkdGg9IjYwMCIgaGVpZ2h0PSIyOTIiIGJvcmRlcj0iMCIg
Y2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4NCgk8dHI+DQoJCTx0ZCBjb2xzcGFuPSIz
Ij4NCgkJCTxpbWcgc3JjPSJodHRwOi8vd3d3LnRvbW50b21zLmNvbS93d3cvaW1hZ2VzLzIwMDAw
XzAxLmdpZiIgd2lkdGg9IjYwMCIgaGVpZ2h0PSI5MyIgYWx0PSIiPjwvdGQ+DQoJPC90cj4NCgk8
dHI+DQoJCTx0ZD4NCgkJCTxpbWcgc3JjPSJodHRwOi8vd3d3LnRvbW50b21zLmNvbS93d3cvaW1h
Z2VzLzIwMDAwXzAyLmdpZiIgd2lkdGg9IjQyNSIgaGVpZ2h0PSIxNiIgYWx0PSIiPjwvdGQ+DQoJ
CTx0ZCB3aWR0aCA9IDEzNT57dGVzdH0NCgkJCTwvdGQ+DQoJCTx0ZD4NCgkJCTxpbWcgc3JjPSJo
dHRwOi8vd3d3LnRvbW50b21zLmNvbS93d3cvaW1hZ2VzLzIwMDAwXzA0LmdpZiIgd2lkdGg9IjQ1
IiBoZWlnaHQ9IjE2IiBhbHQ9IiI+PC90ZD4NCgk8L3RyPg0KCTx0cj4NCgkJPHRkIGNvbHNwYW49
IjMiPg0KCQkJPGltZyBzcmM9Imh0dHA6Ly93d3cudG9tbnRvbXMuY29tL3d3dy9pbWFnZXMvMjAw
MDBfMDUuZ2lmIiB3aWR0aD0iNjAwIiBoZWlnaHQ9IjE4MyIgYWx0PSIiPjwvdGQ+DQoJPC90cj4N
CjwvdGFibGU+PGhyIHNpemU9MD48cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjlwdDsgZm9udC1m
YW1pbHllOic+ICADOyAgIAEhIKmqIFs8YSBocmVmPSdodHRwOi8vdG9tbnRvbXMuY29tL3d3dy9i
YnMvZW1haWxfc3RvcC5waHA/bWJfaWQ9YWRtaW4mbWJfbWQ1PTRjZTI2MDkxODkwMTMxZmU5Y2M2
Y2QxODQyNGJhMjA3JyB0YXJnZXQ9J19ibGFuayc+AXABejwvYT5dICAFvQK9AP8uPC9zcGFuPjwv
cD4=


입니다.

꼭 해결좀 부탁드릴게요 ㅠㅠ

  • 복사

댓글 전체

캐릭셋 문제가 아니라 인코딩 문제인것같습니다.

간간히 Encoding: BASE64 요거보이시죠? 이게 인코딩해서 메일을 보내는 것인데

받는 메일 계정쪽에서 디코딩을 안해주는 거 같습니다.

인코딩 소스 부분을 죄다 지워주면 되겠지만, 메일 전송 보안에 문제가 없을런지는;;;

테스트겸 인코딩 부분을 죄다 지워보세요;;
if ($file != "") {
        foreach ($file as $f) {
            $header .= "\n--$boundary\n";
            $header .= "Content-Type: APPLICATION/OCTET-STREAM; name=\"$f[name]\"\n";
            $header .= "Content-Transfer-Encoding: BASE64\n";
            $header .= "Content-Disposition: inline; filename=\"$f[name]\"\n";
  $header .= "Content-Type:text/html;charset=euc-kr\r";

여기서 $header .= "Content-Type:text/html;charset=euc-kr\r"; 를 빼셔야 합니다. 그리고 그누의 메일러도 사실 규격이 잘못되었어요. \n이 아니라 \r\n이 와야 합니다. 일단 급한 건 잘못된 Content-Type이 왔다는 점만 언급하는 게 좋을 듯하네요.
© SIRSOFT
현재 페이지 제일 처음으로