OpenSmtp é um bom componente de envio de e-mail na plataforma .Net, mas há alguns bugs que afetam nosso uso. Durante o uso, encontrei mensagens distorcidas quando o comprimento do assunto do e-mail era grande.
Após verificação do código-fonte, constatou-se que havia problemas no processo de processamento original: primeiro, o tema foi codificado em ASCII e, em segundo lugar, foi utilizada a codificação QP, mas a diferença entre tema e conteúdo não foi considerada.
Ao codificar dentro de temas, cada linha deve ser codificada individualmente e o tema inteiro não pode ser codificado.
Após a comparação com o Outlook Express, um método é adicionado à classe MailEncoding para realizar a codificação Base64 especificamente para o assunto do email.
string estática pública ConvertHeaderToBase64 (string s, string charset)
{
int lineLength = 40; // Cada linha processa 40 bytes
Encoding encoding = Encoding.GetEncoding( charset );
byte[] buffer = encoding.GetBytes( s );
StringBuilder sb = new StringBuilder(); // Salva o resultado final
stringlinebase64;
bloco int = buffer.Length%lineLength==0?buffer.Length/lineLength:buffer.Length/lineLength + 1;
for(int i=0; i< bloco; i++)
{
if(buffer.Comprimento - i*comprimentolinha >=comprimentolinha)
linebase64 = Convert.ToBase64String(buffer, i*lineLength, lineLength);
outro
linebase64 = Convert.ToBase64String(buffer, i*lineLength, buffer.Length - i*lineLength);
sb.Append("=?");
sb.Append(conjunto de caracteres);
sb.Append( "?B?" );
sb.Append(linebase64);
sb.Append( "?=rnt" );
}
sb.Remove( sb.Length-3, 3); // Remove o último caractere de nova linha
return sb.ToString();
}
Em seguida, modifique o processamento do assunto do email no método ToString na classe MailMessage para chamar um método personalizado
// sb.Append("Assunto: " + MailEncoder.ConvertHeaderToQP(cleanSubject.ToString(), charset) + "rn");
sb.Append("Assunto: " + MailEncoder.ConvertHeaderToBase64( cleanSubject.ToString(), charset) + "rn");
Basta recompilar
Fonte: haogj