알림 이메일을 보내기 위해 Linux 시스템 프로그램에서 사용하는 표준 인터페이스는 무엇입니까?

알림 이메일을 보내기 위해 Linux 시스템 프로그램에서 사용하는 표준 인터페이스는 무엇입니까?

내 이메일 요구 사항은 간단합니다. SMTP가 아닌 후크를 통해서만 시스템 알림을 보내고 싶습니다. (Hook은 https를 통해 mailgun 계정으로 전송됩니다.)

나는 모든 Linux 프로그램(예: cron)이 "(보내기) 메일 [옵션] 콘텐츠"와 같은 것을 호출한다고 상상합니다. 아니면 SMTP 서비스를 직접 호출합니까?

그들이 "(보내기) 메일 [옵션] 내용"을 호출하면 해당 호출을 내 후크로 변환하는 쉘 스크립트나 프로그램을 쉽게 적용/작성할 수 있어야 합니다.

내가 찾았어이 참조:

Linux 표준 기본 PDA 사양 3.0RC1

요약 /usr/sbin/sendmail [옵션] [주소...] 설명

전자 메일(이메일)을 보내려면 애플리케이션이 sendmail에서 제공하는 인터페이스(여기에 설명됨)를 지원해야 합니다. 이 인터페이스는 애플리케이션의 기본 전달 방법이어야 합니다.

프로그램은 필요에 따라 메시지를 라우팅하여 한 명 이상의 수신자에게 이메일을 보냅니다. 이 프로그램은 사용자 인터페이스 루틴이 아닙니다.

옵션이 없으면 sendmail은 파일 끝까지 또는 점이 하나만 포함된 줄까지 표준 입력을 읽고 거기에 있는 메시지의 복사본을 나열된 모든 주소로 보냅니다. 주소의 구문과 내용을 기반으로 사용할 네트워크를 결정합니다.

주소 앞에 백슬래시 "\"가 있으면 해당 주소가 로컬 별칭 확장 대상인지 여부가 지정되지 않습니다.

메시지 형식은 RFC 2822: 인터넷 메시지 형식에 정의되어 있습니다.

옵션

-bm은
표준 입력에서 메일을 읽고 이를 수신자 주소로 전달합니다. 이것이 기본 작동 모드입니다.

... (등) ...

내가 찾고 있는 게 이게 맞는 걸까? 즉, "sendmail"이라는 프로그램을 호출하면 stdin이 RFC2882 호환 이메일의 내용이 됩니다.

참고: "nullmail"이라는 프로그램이 있다는 것을 알고 있지만 이 프로그램이 아웃바운드 메일을 보내는 데 SMTP를 사용한다고 생각하므로 그런 프로그램은 원하지 않습니다. RFC2822 구문 분석 프런트 엔드에 적용하는 것이 가능할 수도 있습니다.


이를 알려준 @ivanivan에게 감사드립니다.이메일을 보내~이다사실은상호 작용. 따라서 모든 알림은 고정된 이메일 주소를 통해 전송됩니다.무료 메일 총계정을 만들고 기록하려면 다음 코드로 충분합니다.

#!/bin/bash
Logfile=/var/log/sendmail-dummy.log
Tmpf=$(mktemp -t sendmail-dummy-XXXXXX.txt)
TmpCurlLog=$(mktemp -t sendmail-dummy-XXXXXX.txt)
trap 'rm -f ${Tmpf} ${TmpCurlLog}' 0

Date=$(date +%F-%T)
echo "[$Date] Caller: $(caller)" >>${Tmpf}
echo "[$Date] Caller: $0" >>${Tmpf}
echo "[$Date] Args: ${@}" >>${Tmpf}
echo "[$Date] Content:" >>${Tmpf}
while read line ; do
    echo $line  >>${Tmpf}
done
echo "" >>${Tmpf}

MailgunDomain="example.com"
# The key is assigned by Mailgun when signing up for free account 
Key="key-<some hex string>"
# not sure if the from-mail-addr has to belong to example.com
FromAddr="[email protected]"
# the to-mail-addr must be registered on Mailgun by showing you own it 
ToAddr="[email protected]"

curl -s --user "api:${Key}" "https://api.mailgun.net/v3/${MailgunDomain}/messages" \
     -F from=" <$FromAddr>" \
     -F to="${ToAddr}" \
     -F subject='Notification' \
     -F text="<${Tmpf}" > ${TmpCurlLog}
rc=$?

echo "----------------------------------------" >> ${Logfile}
echo "[$Date] curl result = $rc" >> ${Logfile}
cat ${Tmpf} >> ${Logfile}
echo "----------------------------------------" >> ${Logfile}
cat ${TmpCurlLog} >> ${Logfile}
echo "" >> ${Logfile}
echo "++++++++++++++++++++++++++++++++++++++++" >> ${Logfile}

다음과 같이 사용할 수 있습니다.요점

보시다시피, sendmail 매개변수를 해석하거나 본문에서 의미 정보를 추출하려고 시도하지 않습니다. 모든 원본 정보를 이메일 본문의 서문으로 보내기만 하면 됩니다.

단점은 언젠가 사라질 수 있는 상업 기업의 무료, 비공개 소프트웨어 서비스에 의존한다는 것입니다. 그러나 단순성을 고려하면 실제로 손실되는 것은 없습니다.

배경 정보로 제거했습니다.접미사(sendmail을 대체) 재부팅 시 네트워크 오류가 발생했기 때문입니다. 이는 가상 머신 실행의 일부 모호한 부작용으로 인해 발생할 수 있습니다 systemd-nspawn. ( systemd-nspawn그런데 훌륭하게 작동합니다). 고려하면이메일을 보내이 기능은 시스템 알림을 보내는 간단한 요구 사항에 비해 약간 과잉입니다. 기꺼이 덤프하겠습니다.이메일을 보내기능은 위의 솔루션을 용이하게 하고 디버깅을 방지합니다.

답변1

예. Good Old sendmail는 초기 메일 프로그램 중 하나였으며 내부 시스템 메시지(cron 출력, 사용자 대 사용자, 루트 대 사용자 등) 및 네트워크 기반 메일. 네트워크 인터페이스에서 수신 대기하고 SMTP 서버 역할을 하도록 구성할 수 있으며, 시스템 내부의 경우 /usr/bin/sendmail직접 호출하거나 이와 유사한 역할을 할 수 있습니다.

이제 Postfix, Exim 등 선택할 수 있는 다른 메일 서버가 너무 많아졌습니다. 두 개의 메일 시스템이 공존해야 하거나 다른 메일 시스템이 sendmail내부 시스템과 관련된 손상을 방지하기 위해 정확히 동일한 옵션/동작을 제공해야 합니다. 메시지.

따라서 몇 가지 옵션이 있습니다.

일부 메일 프로그램을 설치 및/또는 구성하고 스마트 호스트 또는 릴레이 호스트로 작동하도록 설정합니다. 그 역할은 메일을 수락하는 것이며, 수신자가 로컬이 아닌 경우 smtpd는 메일 클라이언트 역할을 하며 ISP(또는 다른 공급자) 메일 서버에 연결하여 메일을 보냅니다. 빠른 Google은 mailgun을 사용하여 Postfix를 설정하는 것이 잘 문서화되어 있고 메일 서버 구성에 관한 한 매우 간단하다는 것을 보여주었습니다. 저는 postfix를 좋아하기 때문에 다른 메일러 옵션을 확인하지 않았습니다. 로컬 수신자는 다른 주소의 별칭을 사용하거나 ~/.forward파일을 사용할 수 있습니다...

호환 가능한 대체 유틸리티를 제공 /usr/bin/sendmail하고 HTTPS 호출을 통해 메일을 보내도록 구성할 수 있는 다른 유틸리티를 찾으세요. (API 호출이 서비스와 같은 RESTful에 대한 것 같나요?)

그래도 작동하지 않으면 옵션이 하나 더 있습니다. 즐겨 사용하는 텍스트 편집기를 실행하고 포함 경로를 확인하세요. sendmail지정된 동작의 구현을 직접 작성하세요 . 매뉴얼 페이지는 cron(예를 들어) 다른 프로그램/시스템에서 예상되는 동작과 옵션에 대한 좋은 아이디어를 제공해야 하며, 필요한 경우 언제든지 소스 코드를 확인할 수 있습니다.

관련 정보