OpenSmtp는 .Net 플랫폼에서 좋은 이메일 전송 구성 요소이지만 사용 중에 이메일 제목 길이가 길면 잘못된 메시지가 표시되는 몇 가지 버그가 있습니다.
소스코드를 확인한 결과 원래의 처리 과정에 문제가 있는 것으로 확인됐다. 첫째, 테마를 ASCII로 인코딩했고, 둘째, QP 인코딩을 사용했지만 테마와 내용의 차이는 고려하지 않았다.
테마 내에서 코딩할 경우 각 행을 개별적으로 코딩해야 하며 전체 테마를 코딩할 수는 없습니다.
Outlook Express와 비교한 후 MailEncoding 클래스에 이메일 제목에 대해 특별히 Base64 인코딩을 수행하는 메서드가 추가되었습니다.
공개 정적 문자열 ConvertHeaderToBase64(문자열 s, 문자열 문자 집합)
{
int lineLength = 40; // 각 줄은 40바이트를 처리합니다.
Encoding 인코딩 = Encoding.GetEncoding( charset ) // 지정된 인코딩을 가져옵니다.
byte[] buffer = 인코딩.GetBytes(s ); // 바이트코드로 변환
StringBuilder sb = new StringBuilder(); // 최종 결과를 저장합니다.
문자열 linebase64;
int 블록 = buffer.Length%lineLength==0?buffer.Length/lineLength:buffer.Length/lineLength + 1;
for(int i=0; i< 블록; i++)
{
if( buffer.Length - i*lineLength >=lineLength )
linebase64 = Convert.ToBase64String( buffer, i*lineLength, lineLength );
또 다른
linebase64 = Convert.ToBase64String(buffer, i*lineLength, buffer.Length - i*lineLength);
sb.Append( "=?" );
sb.Append(문자 집합);
sb.Append( "?B?" );
sb.Append(linebase64);
sb.Append( "?=rnt" );
}
sb.Remove( sb.Length-3, 3); // 마지막 개행 문자를 제거합니다.
sb.ToString()을 반환합니다.
}
그런 다음 MailMessage 클래스의 ToString 메서드에서 이메일 제목 처리를 수정하여 사용자 지정 메서드를 호출합니다.
// sb.Append("제목: " + MailEncoder.ConvertHeaderToQP(cleanSubject.ToString(), charset) + "rn");
sb.Append("제목: " + MailEncoder.ConvertHeaderToBase64( cleanSubject.ToString(), charset) + "rn");
그냥 다시 컴파일하세요
소스: haogj