451 See http://pobox.com/~djb/docs/smtplf.html.,
안녕하세요. 오늘은 SMTP 메일발송시 발생했던 문제에 대해서 정리하고자 합니다.
최근에 Windows 서버에 ASP로 구성된 웹페이지가 있습니다.
헌데 웹페이지에서 메일을 발송하는 소스를 실행시 몇몇받는 메일서버에서 거부를 하게 되고
메일 Queue 에 쌓이기만 하고 발송이 안되는 증상이 있었습니다.
헌데 로그에 451 See http://pobox.com/~djb/docs/smtplf.html., 이러한 로그가 남는겁니다.
당장 로그를 확인하려 해당 페이지에 접속을 해보았습니다.
대략내용을 분석해보니..
웹에서 발송하는 메세지의 컨텐츠 내용이 잘못된 LF LF. 으로 메시지를 종료, 즉 컨텐츠의 내용을 마무리할때에 잘못된 LF LF. 로 하고 있고, 대부분 LF(줄바꿈) 로 메세지를 마무리하고 있는 경우 발송한다고 되어있네요.
위 페이지에서는 CR LF 형식으로 수정을 해줘야 된다고 말하고 있습니다.
(Your mailer is violating 822bis section 2.3, which specifically prohibits all bare LFs.
노출된? LFs를 금지하는 822bis 섹션 2.3, 을 위반하였다고 되어있네요.. 맞나..? )
그리하여 웹소스를 확인해보니 컨텐츠의 내용이 chr(10) , 즉 LF 로 해당 라인을 마무리 하고 있었습니다..ㅜㅜ
ASP, 윈도우의 경우에는 메모장에서 Linux 나 Unix 계열에서 저장한 문서를 열어보면 줄바꿈이
이런형태(\n)로 저장이 되어집니다. Unix 계열에서는 줄바꿈 으로 정상적으로 출력이 되는데 말이죠..
그래서 윈도우에서 사용하는 ASP 파일에서는 chr(10) 앞에 chr(13)을 추가해줘야합니다.
좀 더 자세한 내용을 알기 위해서 찾아서 확인을 해보았습니다.
chr(10)은 캐리지 리턴이라 하며, 출력위치를 줄 맨 앞으로 옮기는거 입니다.
(타자기 로 비유하자면 글을 작성할때 오른쪽에서 왼쪽으로 글이 작성 되는데, 다음줄로 넘어가게 되면
종이를 오른쪽 끝으로 쭉 민다음에 한줄만큼 줄을 올리게 됩니다. 이게 캐리지 리턴이라 생각하면 됩니다.)
chr(13)은 라인피드 라 하며, 커서가 위치한 곳에서 아래로 한줄 내리는 기능 입니다.
C 에서는 각각 \r, \n 을 의미하게 되죠.
그래서 도스나 윈도우에서는 원래 의미대로 해석되기에 텍스트파일에서 다음줄로 내려갈때 "\r\n" 을 사용합니다.
하지만 Unix 계열에서는 \n 이 \r\n 의 의미를 모두 포함하게 됩니다.
때문에 Unix 계열에서 저장한 파일들을 윈도우 의 메모장에서 열어보게 되면 위 그림처럼 "\r\n" 이 아니기때문에
위 그림과 같은 문자로 표시하게 되고 글이 줄바꿈 없이 한줄로 보여지게 됩니다.
알아본 바로는 매킨토시쪽에서는 \r을 쓴다고 합니다.
따라서 엔터키가 캐리지리턴 인지 라인피드인지는 큰 의미가 없습니다. 프로그램에 따라 다르게 저장이 되니깐요.
(DOS(윈도우) 는 \r\n , Unix 는 \n , 메킨토시 는 \r )
정리하자면 ASP 소스상에서 chr(10), 즉! \n 으로만 작성이 되어있기에 받는메일서버에서 잘못된 LF 로 메세지를
종료하고 있다고 판단하여 메시지를 거부하였던 겁니다.
(받는메일서버의 MTA 에 따라서 차이가 있는듯 합니다. 대부분의 포털사이트들은 송신이 잘 되었습니다.)
그리하여 chr(10) 를 chr(13)&chr(10) 로 변경해주고 메일을 발송하니 아주아주 송신이 잘 되는군요.^^
어떻게 도움이 좀 되셨나요? ㅎㅎ 위 문제때문에 삽질도 많이 하였는데 한편으로는 뿌듯합니다. ^^
이상입니다.