2013-02-02 1 views
0

데이터베이스의 내용을 읽고 이러한 내용을 전자 메일 메시지로 출력하기 위해 여러 PHP 스크립트를 작성했습니다. 가끔마다 출력에 SPACE (0x20) 문자가 포함되어 있으면 안됩니다. 예를 들어, 한 스크립트에서 정확히 "n"개의 공백이 아닌 문자를 포함하는 PHP 전역 변수를 참조하고 때로는 (항상은 아님) 해당 변수가 전자 메일 메시지에 덤프 될 때 문자열에 공백이 포함되어 나타납니다 문자열 "n + 1"의 전체 길이). 다른 경우 HTML 태그 (예 : <> BR>)는 <   BR>으로 표시됩니다 ('B'앞에 SPACE가 있음).내 PHP 스크립트의 출력에 문자열 내에 임의의 포함 된 공백이 포함 된 이유를 모르겠다.

스크립트의 동작이 일관성이 없기 때문에 (일부 전자 메일은 영향을 받고 다른 전자 메일은 영향을받지 않음) 문제를 찾을 수 없습니다.

가끔 BREAK 태그에 공백을 넣는 PHP 스크립트 링크를 포함하고 있습니다. 데이터베이스에 특정 로그인 정보를 제공하는 행을 제거했습니다. 그렇지 않으면 그 외 모든 것은 손상되지 않습니다. 아래 링크에서 찾을 수있는 코드 파일에서 281 행은 내장 SPACE가있는 BREAK 명령을 포함하고 있습니다 (위에서 설명한대로). 이것은 단 한 번 일어났습니다!

http://jem-software.com/temptest.txt

나는 유일한 다른 잠재적으로 관련 정보는이 스크립트 파일은 코드에서 찍은 줌라 내에 포함 된 JUMI 코드 블록에 입력되는 것 같다! 기반 웹 사이트.

편집 1 :

당신의 제안, 리카르도을 주셔서 감사합니다.

  1. 내가 이메일을 읽고 데이터베이스에 삽입하기 위해 결과를 분석하고 있지 않다 : 여기에 좀 더 설명이다. 그 반대로, 나는 데이터베이스에서 읽고 결과를 사용하여 전자 메일을 작성하고 있습니다. 어떤 문자 집합이 사용되었는지 확인하기 위해 데이터베이스를 검사하고 명시 적으로 문자 집합을 전달하여 차이가 있는지 확인합니다.

  2. 내가 참조하는 데이터베이스가 Joomla! 외부에 있기 때문에 데이터베이스에 액세스하는 데 Joomla 기능을 사용하지 않습니다. 환경. 몇 년 전에 작성된 PHP 스크립트로 작성된 기존 데이터베이스입니다. 이전 웹 사이트가 Joomla를 사용하여 다시 작성되었을 때 PHP 데이터베이스 액세스 코드를 그대로 "포트"하고 싶었 기 때문에 이것을 가능하게하기 위해 JUMI 플러그인을 설치했습니다.

  3. 데이터베이스의 문자 코딩을 확인하고 전자 메일 메시지의 문자 코드와 동기화합니다.

  4. 문자 코딩의 문제로 인해 하드 코딩 된 HTML 태그에 SPACE가 삽입되는 방식을 이해하지 못했습니다.이 태그는 데이터베이스에서 가져 오지 않았지만 전자 메일에 리터럴 형식으로 입력되었습니다 끈.

답변

0

이 이상한 문제이지만, 여기 내 두 센트 :

당신은 DB 및 메일 서브 시스템에 액세스 할 수 줌라 기능을 사용하지 않는 첫 번째. 이 방법이 효과가 있지만 실제로 좋지는 않습니다.

두 번째는 문자 집합/코드 페이지 문제와 비슷합니다.여기

는 문자 집합 문제에 대한 몇 가지 고려 사항 :

내가 빨리 코드를 읽고, 내가 잘못 아무것도 발견하지 않았다. 하지만 Joomla는 UTF-8을 사용하며 쿼리에서이를 지정하지 않습니다 (mysql_set_charset()가 누락되었습니다!). 이것은 첫 번째 문제 일 수 있습니다.

둘째, 읽는 전자 메일은 보낸 사람의 설정에 따라 다른 문자 집합을 갖게됩니다. 다음은 내가 이메일 구문 분석에 사용하는 기능의 코드 조각입니다 : 당신이 제대로 코드 페이지 문제를 처리 확인, 사용 확인

$mime = imap_fetchmime($this->connection, $this->messageNumber, $partNumber); 
return $this->decodeMailBody($data,$mime); // QUOTED_PRINTABLE 

function decodeMailBody($string,$mime) { 
    $str = quoted_printable_decode($string); 

    echo "<h3>mime: $mime; charset $charset</h3>"; 
    //mime: Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 
    //mime: Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=windows-1252 
    $mimes = explode('charset=',$mime); 
    foreach($mimes as $mimepiece) { 
     $charset = $mimepiece; 
    }  
    $charset = strtolower(trim($charset)); 
    if ($charset == 'utf-8') { 
     return $str; 
    } else { 
     return iconv($charset, 'UTF-8', $str); 
    } 
} 

마지막을 UTF-8 당신이 그것을 구문 분석 후 DB에 메일을 삽입 .

관련 문제