sendmail 대기열에서 전자 메일 메시지를 영구적으로 삭제하고 다시 나타나지 않도록하려면 어떻게합니까?


18

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

나는 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전자 메일을 "가짜" 로 설정할 수있는 방법이 있는지 알고 싶습니다 . 있습니까?


글쎄, 나는 여전히이 문제에 대한 해결책을 찾지 못했습니다. 그것은 어떤 종류의 크론 스크립트가 발생하는 것을 분명히 보이지만, 대기 메시지를 어디에 저장하고 있는지 알 수 없습니다 ...
Steven Oxley

답변:


28

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

그래서 이것을 시도하십시오 ( 큐 의 모든 메시지를 제거하고 싶다고 가정합니다 ).

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

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

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


그는 이미이 작업을 수행했다고 말했지만 메시지가 다시 나타납니다.
Massimo

1
그러나 sendmail을 먼저 멈추지 않으면 바로 그 점입니다.
weeheavy

글쎄, 당신이 내가 놓친 발걸음에 부딪친 것 같습니다.
Steven Oxley

Fedora 19에서 / var / spool / clientmqueue (및 / var / spool / mqueue)
TomG

어떤 이유로 sudo를 사용하더라도 나에게는 효과가 없을 것입니다 (라고 말할 것입니다 no matches found). 그래서 chmod폴더를 편집 777하고 내용을 삭제할 수있었습니다.
Sridhar Sarnobat가

9

당신은 종종 예를 들어와 센드 메일의 mqueue 디렉토리에서 파일을 제거 할 수있는 제안을 찾을 수 rm /var/spool/mqueue/*또는 악화 ( rm -rf등). IMHO, 이것은 명백한 위험입니다. 많은 경우에 작동하지만 안전 벨트를 고정하는 것이 좋습니다. mqueue에서 모든 파일을 제거하면 합법적 인 메시지가 삭제 될 수 있습니다.

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

반대로 Sendmail을 중지하는 service sendmail stop것만으로는 충분하지 않을 수 있습니다 (예 : with with Ubuntu ). 중지 된 경우에도 일부 (하위) 프로세스가 여전히 실행 중일 수 있습니다. 그들이 완료 (권장)하거나 죽일 때까지 기다려야 할 것입니다.

큐에서 메시지를 안전하게 제거하려면 메시지의 큐 ID가 필요합니다. ID는 "sm-mta [...] :"다음에 로그에 표시됩니다. 로그 발췌에서 ID는이다 o530SlbK009365, o4VHn3cw003597...이 개 파일이 mqueue에 저장되어있는 ID를, 각각에 대해 하나 "QF", "DF"와 다른 시작과 함께 시작.

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

-----Q-ID----- --Size-- -----Q-Time----- ------------Sender/Recipient----------
oBDDuKAB023946*    1058 Mon Dec 13 14:56 <vfn-l-bounces+so=example.com@fam.tuwi
                 (Deferred: 450-4.2.1 The user you are trying to contact is re)
                                         <so@example.com>
oBAEMuV8000429     1058 Fri Dec 10 15:22 <vfn-l-bounces+sby=example.com@fam.tuw
                 (Deferred: 450-4.2.1 The user you are trying to contact is re)
                                         <so@example.com>

이 예에서 ID oBDDuKAB023946가 있는 메시지 는 현재 별표로 표시되어 처리되고 있습니다. 다른 메시지는 제거해도 안전합니다. 예를 들어 ID를 oBAEMuV8000429사용 하여 메시지를 제거 하려면

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

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

그럼에도 불구하고 Brandon의 스크립트조차도 메시지의 상태를 관리하지 않습니다. 그러나 쉽게 추가 할 수 있습니다. 그의 대본 시작 부분에 포함

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

그런 다음 하위 루틴 "원함"의 시작 부분에 활성 메시지를 건너 뛰는 검사를 추가하십시오 (예 :

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

HTH. 그리고 백업하는 것을 잊지 마십시오 :-)


4

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

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


0

나는 이것이 cron 스크립트의 작업이라고 생각하지 않으며, 응용 프로그램 문제이거나 sendmail 자체와 관련된 것일 가능성이 높습니다. 어쨌든,이 작업을 수행하는 cron 작업을 배제 crond하기 위해 잠시 멈추고 이것이 계속 발생하는지 확인할 수 있습니다.


0

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

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

따라서 서브 쉘을 열어 매개 변수로 사용하기위한 echosaid의 출력 을 호출 하고 검색하십시오 . 과 의 무례한 포크를 무시하더라도이 서브 쉘링은 매우 낭비입니다. echormsudorm
Felix Frank

글쎄, 당신이 더 '허용 가능한'해결책을 가지고 있다면, 주석이 얼마나 쓸모 없는지를 보여주는 대신 해결책을 설명하는 데 시간을 낭비하지 않을 것입니다. 미리 감사드립니다
Shu Hikari

2
이것이 불쾌하고 오만한 경우에 죄송합니다. 보다 경제적 인 접근 방식은 다음과 같습니다 sudo find /var/spool/mqueue -maxdepth 1 -delete. 나는 그것이 중요한 지적 발견 한 것을 특히 스크립트에 문제가있다. 재치 부족에 대한 사과.
Felix Frank

2
네, 그러나 지금 당신은 당신의 요점을 설명했고 나는 그것을 완전히 이해했습니다. 그리고 사과를 받아도 걱정하지 마십시오. 감사합니다 : D
Shu Hikari
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.