본문 바로가기

프로그래밍/Delphi

SMTP를 이용하여 메일 발송시 아이폰에서 한글 깨지는 문제 처리

아이폰의 전용 메일 클라이언트에서는 일반적인 메일을 보낼 때 제목/보낸 사람이 깨지는 경우가 있다.
기본적으로 아이폰 메일 클라이언트는 UTF8 만 인식하기 때문인데 EUC-KR로도 깨지지 않는 메일을 발송할 수가 있다.

델파이와 IdSMTP, IdMessage 를 이용하여 깨짐없는 메일을 발송해 보자
이때 발송자 정보와 제목은 base64 로 인코딩해서 보내자.
보낸사람이 : 홍길동 <hong@naver.com>  이런식으로 뒤에 메일주소까지 같이 있을 경우에
"홍길동"만 인코딩을 하고 <hong@naver.com>은 그대로 써줘야 정상으로 가며 만일 전체를 인코딩 했을 때는
수신에서 발송자가 발신자 미확인으로 뜨니 주의 해야 한다.




메시지 헤더를 다음과 같이 작성한다.
    //base64로 인코딩된 정보를 얻는다.
    function TSendMailThread.GetEucKRString(AStr: string): string;
    begin
      result := '=?euc-kr?B?' + Base64EncodeStr(AStr) + '?=';
    end;
    ...


    with FIdMessage do
    begin
      Headers.Clear;
      Headers.Add('MIME-Version: 1.0');

      if Pos('<', From.Text) > 0 then
        tmp := '<' + sm.Mid('<', '>', From.Text) + '>'
      else
        tmp := '';

      // 발신자의 홍길동과  부분을 나눈다
      // 발신자의 "홍길동"만 base64로 인코딩 한다.

      Headers.Add('From: ' + GetEucKRString(sm.before('<', From.Text)) + tmp);
      Headers.Add('Subject: '+GetEucKRString(Subject));
      Headers.Add('Content-Type: '+ContentType+'; charset="euc-kr"');
      Headers.Add('Content-Transfer-Encoding: 8bit');
      Headers.Add('X-Mailer: SendMail');
    end;

    FIdSMTP.Send(FIdMessage);

아웃룩을 이용한 사내메일(QMail), 네이버, 구글 메일등 정상으로 잘 수신된다. 아이폰에서도 물론 깨짐없이 잘 보인다. 참고로 메일 발송서버에 대한 인증을 해야만 특정 메일서버(특히 관공서내)에서 필터링 되지 않고 잘 수신하는데 SPF(Sender Policy Framework) 문서를 잘 읽고 메일 서버에 반영해 놓도록 하자...