sendmail 대기열에서 전자 메일 메시지를 영구적으로 삭제하고 다시 돌아오지 않게 하려면 어떻게 해야 합니까?

sendmail 대기열에서 전자 메일 메시지를 영구적으로 삭제하고 다시 돌아오지 않게 하려면 어떻게 해야 합니까?

여기에 꽤 짜증나는 문제가 있습니다. 나는 응용 프로그램을 테스트하고 있으며 가짜 전자 메일 주소로 몇 가지 테스트 전자 메일을 만들었습니다(어쨌든 내 서버가 실제로 전자 메일을 보내도록 설정되어 있지 않다는 것은 말할 것도 없습니다). 물론 에서는 sendmail이러한 메시지를 보낼 수 없으며 대기열에 갇혀 있습니다 sendmail. 일반적으로 재시도를 중지하는 데 걸리는 5일을 기다리는 대신 대기열에 쌓인 메시지를 수동으로 삭제하고 싶습니다 sendmail.

나는 Ubuntu 10.04를 사용하고 있으며 /var/spool/mqueue/내가 읽은 모든 방법에 대해 대기열에 있는 이메일이 보관되어 있다고 말하는 디렉토리입니다. 이 디렉토리의 파일을 삭제하면 sendmailcron 스크립트로 보이는 것이 실행될 때까지 이메일 처리 시도가 중지되고 전송을 원하지 않는 메시지로 이 디렉토리가 다시 채워집니다. 내 내용은 다음과 같습니다 syslog.

Jun  2 17:35:19 sajo-laptop sm-mta[9367]: o530SlbK009365: to=, ctladdr= (33/33), delay=00:06:27, xdelay=00:06:22, mailer=esmtp, pri=120418, relay=e.mx.mail.yahoo.com. [67.195.168.230], dsn=4.0.0, stat=Deferred: Connection timed out with e.mx.mail.yahoo.com.
Jun  2 17:35:48 sajo-laptop sm-mta[9149]: o4VHn3cw003597: to=, ctladdr= (33/33), delay=2+06:46:45, xdelay=00:34:12, mailer=esmtp, pri=3540649, relay=mx2.hotmail.com. [65.54.188.94], dsn=4.0.0, stat=Deferred: Connection timed out with mx2.hotmail.com.
Jun  2 17:39:02 sajo-laptop CRON[9510]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -n 200 -r -0 rm)
Jun  2 17:39:43 sajo-laptop sm-mta[9372]: o52LHK4s007585: to=, ctladdr= (33/33), delay=03:22:18, xdelay=00:06:28, mailer=esmtp, pri=1470404, relay=c.mx.mail.yahoo.com. [206.190.54.127], dsn=4.0.0, stat=Deferred: Connection timed out with c.mx.mail.yahoo.com.
Jun  2 17:39:50 sajo-laptop sm-mta[9149]: o51I8ieV004377: to=, ctladdr= (33/33), delay=1+06:31:06, xdelay=00:03:57, mailer=esmtp, pri=6601668, relay=alt4.gmail-smtp-in.l.google.com. [74.125.79.114], dsn=4.0.0, stat=Deferred: Connection timed out with alt4.gmail-smtp-in.l.google.com.
Jun  2 17:40:01 sajo-laptop CRON[9523]: (smmsp) CMD (test -x /etc/init.d/sendmail && /usr/share/sendmail/sendmail cron-msp)

이 메시지를 영구적으로 제거하는 방법을 아는 사람이 있습니까? 참고로, sendmail이메일을 "가짜"로 보내도록 설정할 수 있는 방법이 있는지도 알고 싶습니다 . 거기 있나요?

답변1

전송되었거나 전송하려는 메시지는 에 저장됩니다 /var/spool/mqueue. Sendmail이 아직 대기열에 넣지 않은 메시지는 에서 찾을 수 있습니다 /var/spool/mqueue-client.

그러니 이것을 시도해 보십시오(당신이 제거하고 싶어한다고 가정합니다모두대기열의 메시지):

  • 센드메일 중지
  • rm /var/spool/mqueue/*
  • 대기 중인 메시지를 제거하려면 rm /var/spool/mqueue-client/*.
  • 센드메일 시작

이렇게 하면 시스템이 다른 메시지를 받을 때까지 대기열 폴더가 지워집니다. mailq(두 대기열 폴더 모두) 또는 sendmail -bp(대기열 폴더만)을 실행하여 다시 확인할 수 있습니다 .

메모: service sendmail <start|stop|restart>대부분의 Linux 배포판에서는 또는 를 사용하여 서비스를 시작/중지할 수 있습니다 /etc/init.d/sendmail <start|stop|restart>. 두 옵션 모두 상태 플래그 없이 명령과 서비스를 입력하여 관찰할 수 있는 다른 많은 상태 플래그를 가지고 있습니다.

답변2

rm /var/spool/mqueue/*예를 들어 Sendmail의 mqueue 디렉토리에서 파일을 제거하라는 제안을 종종 보게 될 것입니다 rm -rf. IMHO, 이건 정말 위험해요. 많은 경우에 효과가 있지만 안전벨트를 매는 것이 좋습니다. 단순히 mqueue에서 모든 파일을 제거하면 합법적인 메시지가 삭제될 수 있습니다.

대기 중인 메시지를 제거하기 전에 Sendmail을 중지하는 것은 특히 많은 메시지를 제거해야 하는 경우 좋은 조언입니다. 그러나 몇 개의 메시지만 제거해야 하거나 cron 작업 등을 통해 정기적으로 대기열을 정리하는 경우 실제로 Sendmail을 중지할 필요가 없습니다. 최악의 경우 메시지 중 하나가 다시 대기열에 추가되며 다시 시도하면 거의 확실하게 제거됩니다.

반대로 Sendmail을 중지하는 것(예: Ubuntu에서 service sendmail stop)만으로는 충분하지 않을 수 있습니다. 중지된 경우에도 일부(하위) 프로세스가 계속 실행 중일 수 있습니다. 완료될 때까지 기다리거나(권장) 종료해야 합니다.

mqueue에서 메시지를 안전하게 제거하려면 메시지의 대기열 ID가 필요합니다. ID는 로그에서 "sm-mta[...]:" 뒤에 표시됩니다. 발췌한 로그의 ID는 o530SlbK009365, o4VHn3cw003597, ...입니다. 각 ID에 대해 2개의 파일이 mqueue에 저장됩니다. 하나는 "qf"로 시작하고 다른 하나는 "df"로 시작합니다.

mailq일반적으로 대기열의 내용을 나열하는 데 사용됩니다. 첫 번째 열에 ID가 표시됩니다. 또한 mailq메시지가 활성 상태인지/현재 처리 중인지 여부도 표시하므로 의 출력을 참조해야 합니다 . 예:

-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient----------
oBDDuKAB023946*    1058 Mon Dec 13 14:56 <[email protected]
                 (Deferred: 450-4.2.1 The user you are trying to contact is re)
                                         <[email protected]>
oBAEMuV8000429     1058 Fri Dec 10 15:22 <[email protected]
                 (Deferred: 450-4.2.1 The user you are trying to contact is re)
                                         <[email protected]>

이 예에서는 ID가 포함된 메시지가 oBDDuKAB023946현재 처리 중이며 별표가 추가되어 표시됩니다. 다른 메시지는 제거해도 안전합니다. 예를 들어 ID가 oBAEMuV8000429포함 된 메시지를 삭제하려면

rm /var/spool/mqueue/{d,q}foBAEMuV8000429

대기 중인 메시지를 제거하는 보다 다양한 접근 방식은 Brandon Hutchinson이 제공합니다.메일 대기열에서 메일 삭제. Brandon에는 도메인 부분, 이메일 주소 등을 기반으로 메시지를 제거하는 스크립트도 포함되어 있습니다. Brandon의 스크립트는 정기적인 정리 또는 대량 제거에 매우 유용합니다.

그럼에도 불구하고 Brandon의 스크립트조차도 메시지 상태를 처리하지 않습니다. 그러나 추가하는 것은 쉽습니다. 스크립트 시작 부분에 포함

# Get current mailq status
my $mailq = `mailq`;

그런 다음 하위 루틴 "wanted"의 시작 부분에 활성 메시지를 건너뛰는 체크를 추가합니다.

# skip if file is currently processed by MTA
if ($mailq =~ /\n$queue_id\*/) {
   $debug && print "$queue_id is locked.\n";
   last;
}

HTH. 그리고 꼭 백업해두세요 :-)

답변3

나는 이와 동일한 문제를 겪었고 대기 중인 메시지가 있는 폴더가 2개 있다는 것을 발견했습니다. /var/spool/clientmqueue/ 폴더에는 전달에 실패한 경우 /var/spool/mqueue/로 끝나는 메시지가 있었습니다. 문제를 해결하려면 두 폴더에서 파일을 삭제해야 했습니다.

rm -f /var/spool/clientmqueue/* rm -f /var/spool/mqueue/*

답변4

이 bash 스크립트를 사용하여 이 작업을 수행했습니다.

for i in `sudo ls /var/spool/mqueue`
do
    sudo rm -rv `echo /var/spool/mqueue/$i`
done

관련 정보