명령 줄 파이프를 통해 메일을 보내는 방법


9

파일을 실행하는 cron 명령이 있고 이메일을 보내도록 출력을 설정하려고합니다. 직접 파일을 수정하지 않으려는 타사 스크립트와 함께 이것을 사용하므로 PHP를 수정하는 대신 출력을 파이프해야합니다.

나는 서버에서 해당 용도를 마이그레이션하고있어 mail사용하는 서버에 sendmail. 커맨드 라인을 통해 sendmail에 제목을 올바르게 보내는 방법을 찾기 위해 고심하고 있습니다.

/usr/local/bin/php -f /path/to/file.php 2>&1 | /usr/sbin/sendmail -s "My Test Email Subject" test@email.com

sendmail는 시스템에서 제출 한 메일을 라우팅하기 위해 사용하는 바이너리입니다 mail. sendmail , postfix , exim 등과 같은 프로그램 모음의 일부입니다 . 따라서 적절한 메일 패키지를 설치해야합니다 . 사용중인 리눅스 배포판을 알려주십시오.
adamo

모든 POSIX 호환 UNIX / Linux 형식은 "sendmail"이라는 실행 파일을 제공해야하며 sendmail 기능의 하위 세트 (아래의 timday의 답변에 설명 된 -t 옵션 포함)와 호환되는 특정 옵션 세트를 사용해야합니다. Exim, Postfix 및 qmail은 모두 이러한 기능을 제공합니다. 예를 들어, / usr / bin 또는 / usr / sbin이 아닌 / usr / libexec / sendmail에 설치되기도합니다.
Jim Dennis

답변:


3

/ usr / sbin / sendmail

그건 틀렸어요.

mail어디 에서 명령을 내려야합니다 . 호출 할 수 있습니다 mailx. /bin/디렉토리에 있어야합니다 . 표준 연습으로 PHP 스크립트는 /sbin또는 에서 어떤 것도 호출해서는 안됩니다 /usr/sbin. sbin 프로그램은 일반적으로 루트 용입니다.

또한 php에는 mail 함수 가 내장되어 있습니다 .


그렇지 않은 mail경우 mailx일 수 있습니다 Mail. 그러나 그것들이 존재하지 않더라도 mutt 을 설치 하고 mutt -x에뮬레이트 할 수 있습니다 mailx.
adamo

이 사실 ... 내 경로를 결정하는 것입니다, 내가 실행 which mail과 반환 /bin/mail.
웹넷

2
sendmail이 더 나은 방법입니다 (Posix 표준입니다). 그러나 sendmail -t를 사용하는 것이 좋습니다 (입력 스트림에서 헤더를 가져옵니다). 이렇게하면 메일을 보내는 프로그램이 쉘을 전혀 호출하지 않고 sendmail 유틸리티와 만 상호 작용할 수있게함으로써 쉘 변수 보간 취약점을 피할 수 있습니다. 자세한 내용은 "timday 's"답변을 참조하십시오.
Jim Dennis

13

스크립트에서 메일을 보내려고 할 때 데비안 시스템 ( "실제"sendmail 대신 Exim을 가지고 있지만 여전히 호환성을 위해 sendmail 바이너리가 있습니다)에서 다음과 같은 작업을 수행합니다.

cat <<EOF | sendmail -t
To: recipient@example.com
Subject: Testing
From: sender@example.com

This is a test message
EOF

빈 줄이 중요합니다.


1
빈 줄은 메시지 본문에서 메시지의 헤더 부분을 분리하는 데 사용됩니다. sendmail -t <<EOF그래도 왜 ?
adamo

@adamo : 원래 질문의 패턴에 더 가깝기 때문에 '|'로 sendmail에 파이프하기 (실제로 내가 직접하는 장소는 일반적으로 generate_test_message.sh | sendmail -t와 같습니다).
timday

2
이것은 UNIX에서 안전한 프로그램 메일 전송에 대한 정식 접근 방식입니다.
Jim Dennis

sendmail에 대한 실제 예제를 얻었습니다! 감사합니다!
insidepower

경우 sendmail실패하고 STDERR에 쓸 수 있었다, 내가 어떻게 스크립트에서 나중에 사용할 수있는 변수로이 캡처 수 있을까?
streetster

1
echo -e "This is my body\nSecond line" 2>&1 | sed '1!b;s/^/To: test@email.com\nSubject: My Test Email Subject\n\n/' | sendmail -t

echo = 이메일 본문.
sed stuff = 이메일 헤더 및 본문과 헤더 사이의 중요한 이중선을 적용합니다.
sendmail -t = sendmail을 통해 직접 파이프합니다.


-1
php -f file.php 2>&1 | sed 's/^/To: test@email.com\nSubject: My Test Email Subject\n\n/' | sendmail -t

1
안녕하세요. 서버 오류에 오신 것을 환영합니다. 아마도 당신은 당신의 대답을 조금 정교하게 할 수 있습니까?
slm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.