내 Postfix 서버가 특정 봉투 발신자의 이메일을 거부하는 것처럼 보이도록 하는 동시에 동일한 이메일을 의도한 수신자에게 계속 전달하는 방법을 찾으려고 노력 중입니다.
Microsoft의 이메일 서버는 내 메일 서버의 IP 주소를 계속 블랙리스트에 등록하고 내 서버에서 보내는 이메일을 거부하며 다음과 같은 메시지를 표시합니다.
해당 네트워크의 일부가 차단 목록(S3150)에 있으므로 해당 인터넷 서비스 제공업체에 문의하세요.
지난 몇 달 동안 호스팅 제공업체와 저는 저용량 메일 서버에서 의심스러운 활동이 발생하지 않고 역방향 DNS, SPF 및 DKIM 레코드가 올바르게 구성되어 있으며 블랙리스트에 표시되지 않음을 세 번 확인했습니다. 공개적으로 Gmail 및 Yahoo와 같은 다른 대규모 이메일 제공업체 도메인으로 메일을 보내는 데 문제가 없습니다.
내 제공업체는 지금까지 Microsoft 문제를 해결하고 "완화"를 성공적으로 달성하는 데 3번이나 도움을 주었습니다. 이를 통해 제가 그들의 도메인 중 하나에서 정기적으로 이메일을 보내는 사람들과 잠시 다시 통신할 수 있었지만 매번 안도감은 일시적인 것으로 판명되었고 상황은 빠르게 회복되었습니다. 돌아왔다.
나는 이 무의미한 게임에 지쳤기 때문에 이 일반 사용자에게 내 메일 서버에 계정을 부여했고, 이제 우리는 이 계정을 이메일 교환에 사용하므로 MS는 제외됩니다.
내 이메일 기록에 따르면 이 사람은 지난 몇 년 동안 내가 연락한 유일한 MS "고객"이므로 계속해서 MS를 통해 이동하는 수고를 겪고 싶지 않고 대신 메시지를 거부하고 싶습니다. MS 메일 서버에서 적절한 방식으로 뉴스를 받아보세요. 이메일을 거부하면 MS가 아무런 이유 없이 내 메일 서버를 계속 검열하기 때문에 내가 답장을 보낼 수 없다는 사실을 발신자에게 알리는 것입니다.
나는 그러한 이메일에 답장을 보낼 수 없기 때문에 이것이 그들에게 이 정보를 제공할 수 있는 유일한 방법인 것 같습니다. 하지만 동시에 내가 아는 누군가가 이메일 제공업체를 바꾸거나 일시적으로 연락이 끊길 경우를 대비해 그러한 보낸 사람이 무엇을 쓰고 있는지 확인할 수 있기를 원합니다.
그렇다면 Postfix를 사용하여 이와 같은 것이 가능한지 누구든지 말해 줄 수 있습니까? 그렇다면 이를 구성하는 가장 좋은 방법은 무엇입니까?
답변1
더 많은 연구와 실험을 거쳐 지금까지 효과가 있는 것으로 보이는 솔루션을 찾았습니다.
나는 설명된 방법을 따랐다.http://www.postfix.org/SMTPD_PROXY_README.html, 링크에 표시된 대로 master.cf를 편집하고 다음을 통해 socat을 사용합니다.
socat tcp-l:10025,fork,bind=127.0.0.1 system:/path/to/filterscript.sh
127.0.0.1:10025에서 수신하고 각 연결에서 내가 작성한 bash 필터 스크립트의 인스턴스를 시작합니다. 이는 아래에 게시되어 있습니다.
SMTPD_PROXY_README의 마지막 부분에 따르면 내 스크립트는 단순히 사전 필터 Postfix smtp 서버의 smtp 명령과 데이터를 127.0.0.1:10026의 Postix 사후 필터 smtp 서버로 다시 전달한 다음 (대부분의) 명령을 반환합니다. 필터 사후 필터 서버에서 수신한 명령 응답은 사전 필터 서버로 반환됩니다.
그러나 이 프로세스 중에 스크립트에 "@hotmail.com"으로 끝나는 "MAIL FROM:" 주소가 표시되면 메시지가 완료될 때 사후 필터 서버의 250 성공 응답이 사전 필터 서버로 다시 전달되지 않습니다. 그러면 사용자 지정 메시지와 함께 550 거부 코드가 사전 필터 서버로 전송됩니다. 이로 인해 Postfix의 사전 필터 서버는 사후 필터 서버가 실제로 메시지를 전달했음에도 불구하고 해당 메시지가 거부된 것으로 Hotmail에 보고하게 됩니다.
이것은 내가 사용하는 스크립트입니다.
#!/usr/bin/bash
exec 4<>/dev/tcp/127.0.0.1/10026 # output back to postfix
export IFS='$\n'
function relay_smtp_responses {
while read -r -t 1 -u 4 rline; do
if [[ $rline == "221 "* ]]; then
Finished=true
else
echo "$rline"
fi
done
}
InDataMode=false
Finished=false
Reject=false
relay_smtp_responses # relay initial smtp greeting from after filter server back to before filter server
until "$Finished"; do
if ! read -r -t 5 line; then # fetch line from before filter smtp server
relay_smtp_responses
echo -e "QUIT\r" >&4
exit
fi
echo "$line" >&4 # relay line to after filter smtp server
if "$InDataMode"; then
if [[ ${line%$'\r'} == "." ]]; then
InDataMode=false
if "$Reject"; then
echo "550 5.7.1 Replies to you are blocked, see <insert link to customized error explanation here>"
else
relay_smtp_responses # relay post-filter's eom response back to pre-filter server
fi
fi
else
relay_smtp_responses # relay command response from after filter server back to pre filter server
if [[ ${line%$'\r'} == "MAIL FROM:"*"@hotmail.com>" ]]; then
Reject=true
elif [[ ${line%$'\r'} == "DATA" ]]; then
InDataMode=true
fi
fi
done
Bash의 읽기 명령은 바이너리 데이터를 잘 처리하지 못하기 때문에 다음을 추가하여 BDAT 명령도 비활성화해야 했습니다.
smtpd_discard_ehlo_keywords = chunking
Postfix main.cf 파일에. 다른 언어를 사용하면 이를 피할 수 있습니다.
내 스크립트가 8비트 데이터를 얼마나 잘 처리하는지 아직 확신할 수 없지만 아직 8BITMIME 또는 SMTPUTF8을 비활성화하지 않았으며 어떤 문제도 발생하지 않았습니다.
지금까지는 내가 원하는 작업을 수행하고 있지만 이 스크립트는 여전히 주로 개념 증명을 위한 것이므로 추가 테스트 후에 이를 향상하거나 교체할 수 있기를 바랍니다.
어떤 생각이나 제안이라도 환영합니다. 이 정보가 누군가에게 도움이 되기를 바랍니다.
답변2
당신이 있는 곳에 있었습니다. 포기하다. 당신도 똑같이하는 것이 좋습니다.
대신, MS가 아무 이유 없이 내 메일 서버를 계속 검열하기 때문에 내가 답장을 보낼 수 없다는 것을 발신자에게 알리기 위해 적절한 거부 메시지를 사용하여 MS 메일 서버에서 보낸 메일을 거부하고 싶습니다.
이것은 아마도 당신이 원하는 방식으로 작동하지 않을 것입니다.
이메일 서버가 이메일에 응답할 수 있으면 이메일을 직접 보낼 수도 있습니다.
따라서 귀하가 할 수 있는 일은 실제로 배달되지 않는 이유를 수정하는 것입니다.하나줄이 너무 길어서는 안 됩니다.
이로 인해 Microsoft는 고객의 이메일을 보낼 수 없다는 메시지를 자동으로 생성하게 됩니다. 내 기억이 맞다면 그 이메일은~ 할 것이다거부 이유가 포함되어 있지만 저를 포함한 누구도 이 이메일을 읽지 않습니다. "이메일을 보낼 수 없습니다.": 좋습니다. 서로에게 다가갈 수 있는 다양한 방법을 모색할 에너지가 나에게 있는지 생각해 볼 필요가 있다. 대개,일은 그다지 중요하지 않아, 그리고 내가 편지를 보내는 사람들은 내가 제공하는 정보를 전혀 얻지 못할 것입니다. 이메일 서버가 잘못 구성되었는지, 디스크가 가득 찼는지, 보름달에 작동하지 않는지, 두운 이름을 가진 사람을 거부하는지 확인하기 위해 아래로 스크롤하지 않을 것입니다.
마이크로소프트와의 팔씨름 시합에서는 이길 수 없습니다. 그것은 이 힘의 역학이 작동하는 방식이 아닙니다.
기술적 타당성에 대하여: 의지하다. 일반적으로 postfix를 조기에 거부하도록 구성합니다. 즉, 일단 From:
서버에 전달되면 해당 시점에 이메일이 서버로 전송되지 않았기 때문에 이메일을 보낼 수 없습니다.
추가로 필터를 추가하고, 내부적으로 복사본을 만들고, 원본 메시지를 거부하고, 현지 배달 에이전트에 문의하여 이메일을 올바른 받은 편지함으로 받을 수 있습니다. 내가 아는 한, Postfix는 "거부에도 불구하고 전달"을 허용하지 않습니다. Postfix 플러그인을 직접 작성해야 합니다.