접미사 : 대기중인 메시지에서 발신자 변경


8

전체 재설치 후 구성에 문제가 발생했습니다. 발신자 주소가 잘못되어 일부 수신자 (메일 서버)가 거부했습니다.

따라서 Postfix 대기열에 많은 메일이 붙어 있습니다.

큐에있는 메일에서 직접 보낸 사람 주소를 변경 한 다음 큐를 플러시하는 것이 가장 좋습니다.

나는 문제를 해결하는 이 대답 을 시도했다 . 그러나 내가 가지고있는 버전 (2.11.0)에서는 메시지를 쉽게 수정할 수없는 것 같습니다.

예를 들어 /var/spool/mqueue, dir은 없지만 대신에/var/spool/postfix/...

active
bounce
corrupt
defer
deferred
dev
etc
flush
hold
incoming
lib
maildrop
pid
private
public
saved
trace
usr

그리고 관심사는 deferred. 올바른 도메인으로 잘못된 도메인을 변경하는 몇 가지 파일을 수정하려고했습니다 (변경된 파일 만 확인하도록주의를 기울였습니다).

그러나이 메일은로 이동되었으므로 corrupt간단한 텍스트 변경이 작동하지 않는 것 같습니다 (로 완료 vi).

대기중인 메일에서 발신자를 변경하는 다른 깔끔한 방법이 있습니까?

답변:


19

나는 문제를 해결하는이 답변을 시도했다 . 그러나 내가 가지고있는 버전 (2.11.0)에서는 메시지를 쉽게 수정할 수없는 것 같습니다.

예를 들어 / var / spool / mqueue 디렉토리는 없지만 대신 / var / spool / postfix / ...가 있습니다.

두 가지를 명확히하고 싶습니다.

  • 첫째,이 답변은 sendmail NOT postfix에 적용되었습니다.
  • 둘째, 직접 조작 -raw-queue 파일은 전혀 지원되지 않았습니다.

여기 몇 가지 옵션이 있습니다

1. smtp_generic_maps 매개 변수

이 답변은이 훌륭한 답변에서 영감을 얻었습니다 . 이전 주소를 새 주소로 자동으로 다시 작성합니다. 이전 주소를 새 주소로 매핑 할 파일을 정의 할 수 있습니다.

/etc/postfix/main.cf:
    smtp_generic_maps = hash:/etc/postfix/generic

/etc/postfix/generic:
    account@localdomain.example.com       account@example.com

잊지 마세요 postmap /etc/postfix/generic및 실행postfix reload

  • 거꾸로 : 당신은 메시지를 다시 큐에 넣을 필요가 없습니다
  • 단점 : Postfix는 해당 발신자와 수신자 주소를 다시 작성합니다 account@localdomain.example.com.

2. sender_canonical_address

첫 번째 옵션의 단점을 극복하기 위해을 사용할 수 있습니다 sender_canonical_maps. 이 솔루션은 Postfix 작성자 제안을 기반으로 합니다 . 첫 번째 옵션과 동일하게 파일을 정의하여 이전 주소를 새 주소에 매핑 할 수 있습니다.

/etc/postfix/main.cf:
    sender_canonical_maps = hash:/etc/postfix/sender_canonical

/etc/postfix/sender_canonical:
    account@localdomain.example.com       account@example.com

실행 postmap /etc/postfix/sender_canonical한 다음 실행하십시오 postfix reload. postfix 대기열의 흐름으로 인해 명령을 사용하여 영향을받는 대기열을 다시 큐에 넣어야합니다.postsuper -r queueid

  • 거꾸로 : Postfix가 수신자 주소를 다시 쓰지 않습니다.
  • 단점 : 영향을받는 모든 메시지를 다시 큐에 넣어야합니다. 그러나 하나의 명령으로 연기 된 모든 것을 다시 큐에 넣을 수 있습니다postsuper -r ALL deferred

3. postfix queue의 직접 조작

이것은 고급 처리를 위해 큐를 수정하는 수동 이전 방법입니다. 이 답변은 postfix-users 메일 링리스트 에서 나왔습니다.

한마디로

  • 대기열 추출

    # postsuper -h queueid
    # postcat -qbh queueid > tempfile.eml
    # vi tempfile.eml
    
  • 큐를 다시 제출하고 이전 큐를 삭제하십시오.

    # sendmail -f $sender $recipient < tempfile.eml
    # postsuper -d queueid
    

위의 명령에 대한 설명서는 이 페이지를 참조하십시오

참고 : postfix-users 메일 링리스트의
원래 솔루션은 대기열을 추출 하는 데 사용 합니다. 이 명령은 대기열의 헤더, 본문 및 메타 정보를 추출합니다. 아래 뾰족한 Azendale으로 , 때문에 메타 정보의 잘못된 이메일을 보내 거부합니다.postcat -q queueid >tempfilesendmail

-bh매개 변수와 함께 매개 변수를 사용하면 qpostcat이 메타 정보를 포함하지 않고 머리글과 본문에만 출력을 필터링합니다. 이것의 부작용은 임시 파일이 대부분의 전자 메일 클라이언트가 .eml 형식으로 인식하는 형식이므로 결과 (편집 된) 메시지를 볼 수 있다는 것입니다.


1
나는 이것을 시도했고, 적어도 내 버전의 postfix에서는와 같은 것을 사용할 때까지 메시지를 보내지 않는 것 같습니다 postcat -qbh queueid >tempfile. (측면의 이점 : 그때는 .eml 형식입니다.) 방금 사용한 경우 -qsendmail을 실행할 때 아무것도하지 않는 것 같습니다. 접미사 버전 2.8.4. 누구든지 이것을 확인할 수 있습니까? 그렇다면이 답변을 편집하겠습니다.
Azendale

안녕 @Azendale, 나는 세 번째 솔루션을 다시 테스트하고 우리 qbh는 그것을 작동시키기 위해 사용해야 합니다. 업데이트 된 답변에 설명을 추가하는 중 ... :)
masegaloeh

감사 ! 같은 세 번째 솔루션을 찾고있었습니다. 그냥 완벽 해!
JazZ

1

그레이트 쓰기. 구성이 잘못되어 며칠 동안 실행중인 메일 서버에 문제가있어서 새 수신자에게 다시 보내야하는 대기열이 많이있었습니다. 그래서 모든 대기열을 반복하는 두 개의 라이너를 만들었습니다.

먼저 모든 대기열을 찾아서 보류하고 .eml 파일로 저장 한 후 다시 보내십시오.

for ID in `mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }' | tr -d \!`; do postsuper -h $ID; postcat -qbh $ID > tempfile$ID.eml; sendmail -f $sender $recipient < tempfile$ID.eml; done

대기열 삭제에 대한 두 번째 :

for ID in `mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }' | tr -d \!`; do postsuper -d $ID; done

이 마지막 코드를 실행하기 전에 보류되지 않은 새 큐가 없는지 확인하십시오. 이것을 발행하여 '!'없이 큐 ID를 찾으십시오. 끝에 :

mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }'

On은 두 개의 하나의 라이너를 쉽게 넣을 수는 있지만 대기열을 삭제하기 전에 실제로 메일을 받았는지 확인하여 더 많은 제어권을 가지고 있다고 느꼈습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.