procmailrc와 PHP

procmailrc와 PHP

이것은 작동하지 않습니다. 나에게 이메일을 보내야합니다. (테스트로서, 우리가 실제로 php 파일을 원하는 것은 mySQL 데이터베이스 테이블에 삽입하는 것입니다.)

입력은 PayPal의 결제 알림 메시지입니다.

(비슷한 요리법하다내용 입력란을 찾아 두 사람 모두에게 메일로 보내주세요.)

procmailrc:

VERBOSE=off
MAILDIR=/usr/home/our/mail
LOGFILE=/usr/home/our/paypal.log
EXITCODE = 99

:0b
|base64 -d|grep -i Description|php tp129.php

PHP 파일:

$rawmessage = "";
$fd = fopen("php://stdin", "r");
while(!feof($fd)) {
$rawmessage .= fread($fd, 1024);
}
fclose($fd);

$msg129 = 'raw is ' .$rawmessage;

mail('[email protected]','msg129',$msg129 );

답변1

수정하고 싶은 부분이 있습니다.

  1. 파일을 확인하세요 $HOME/.forward. 내 생각에는 644 권한이 있어야 하고 다음 줄이 포함되어 있어야 합니다. 이메일 "| /usr/bin/procmail"에 조치를 취하세요. procmail실제 경로를 확인하세요 . 시스템의 경로일 수도 있고 다른 경로일 procmail수도 있습니다 . 에 대한 정규화된 경로 /bin/procmail가 있어야 한다고 합니다 .procmail.forward
  2. <?php또한 파이프 라인 에는 인터프리터에 대한 전체 경로 나 다른 경로가 tp129.php있어야 할 수도 있습니다 .php/usr/bin/php
  3. 의 매개변수를 다시 확인하세요 .procmailrc. MAILDIR=/usr/home/our/mail파일 이름이 LOGFILE=/usr/home/our/paypal.log의심스러워 보입니다. 즉, /usr/home/이상한 디렉토리입니다. 사용자 ID의 "홈" 디렉터리는 일반적으로 다음 디렉터리에 있거나 /home거의 없습니다 /u./usr
  4. PHP 코드만 실행합니다.php tp129.php​​ 그런 다음 텍스트에 텍스트를 입력하고 Ctrl-D를 누릅니다. 그러면 필요한 주소로 이메일이 전송됩니까? 그렇지 않은 경우 문제의 원인이 무엇이든 해결하십시오.

답변2

PHP mail()함수에는 전체 헤더가 포함된 유효한 이메일 메시지가 필요합니다. 귀하의 코드는 메시지 본문만 생성하는 것 같습니다(디코딩된 base64 콘텐츠에 헤더가 포함되어 있지 않은 한, 헤더 앞에 임의의 문자열을 추가하면 메시지가 손상됩니다).

EXITCODE구문 오류가 포함되어 있지 않다면 명시적인 할당은 오류 메시지와 함께 Procmail을 종료할 것입니다. Procmail뿐만 아니라 쉘 스크립트에서도 할당 시 등호 주위에 공백이 허용되지 않습니다. 어쨌든, 당신이 달성하고자 하는 것이 무엇인지는 확실하지 않습니다 EXITCODE. 제 제안은 그냥 두는 것입니다.

최종 목표가 메시지를 MySQL로 가져오는 것이라면 더 간단한 테스트를 제안합니다. 추가할 두 번째 파일을 열고 그 파일에 출력을 작성합니다. 이를 통해 PHP 코드가 예상대로 작동하는지 여부를 알 수 있습니다. (결과가 언제 기록되었는지 확인할 수 있도록 타임스탬프를 추가하여 이전 결과를 확인하지 않을 수도 있습니다. 테스트하는 동안 실제로 추가하기보다는 덮어쓰고 싶을 수도 있지만 날짜 스탬프는 여전히 의미.) PHP가 선택한 도구라면 자유롭게 사용하세요. 하지만 .procmailrc비슷한 .

:0b
| base64 -d | \
  sed -n '/Description/s/.*/insert into table (field1,field2,field3) values (&);/p' \
  | mysql -uyou -pxyzzy -s db

그동안 귀하의 즉각적인 문제를 해결하는 방법은 다음과 같습니다.

전체 PHP 프로그램은 단일 sed 스크립트로 대체될 수 있습니다 sed '1s/^/raw is /'.쓸모없는 사용grep나는 또한 검색을 고려할 것이다 Description.

:0bfw   # Can be simplified if your sed supports a case-insensitive flag
| base64 -d | \
  sed -n '/[Dd][Ee][Ss][Cc][Rr][Ii][Pp][Tt][Ii][Oo][Nn]/s/^/raw is /p'
:0
! [email protected]

전달 작업에서는 원래 헤더가 유지됩니다. 이것이 원하는 것이 아니라면 예를 들어 formail;를 사용하여 유지하려는 항목을 추출하거나 를 사용하여 완전히 새로운 헤더를 생성할 수 있습니다 printf. 간단한 두 번째 레시피를 다음과 같이 더 복잡한 작업으로 바꿀 수 있습니다.! [email protected]

:0fhw
| ( formail -XSubject:; \
    printf "From: %s\nTo: %s\n" "[email protected]" "[email protected]" )
:0
! -t

( sendmail -t메시지 헤더에 있는 내용을 가져와 거기에 메시지를 보내는 것을 의미합니다.)

디버깅을 위해 레시피 파일 에는 명시적인 VERBOSE=off.VERBOSE=yes

관련 정보