OpenSmtp — хороший компонент для отправки электронной почты на платформе .Net, но в нем есть некоторые ошибки, которые влияют на наше использование. Во время использования я столкнулся с искаженными сообщениями, когда длина темы электронного письма была большой.
После проверки исходного кода было обнаружено, что были проблемы с исходным процессом обработки: во-первых, тема была закодирована через ASCII, во-вторых, использовалась кодировка QP, но не учитывалась разница между темой и контентом.
При кодировании внутри тем каждая строка должна кодироваться индивидуально, а вся тема не может быть кодирована.
После сравнения с Outlook Express в класс MailEncoding добавляется метод, выполняющий кодировку Base64 специально для темы электронного письма.
общедоступная статическая строка ConvertHeaderToBase64 (строка s, кодировка строки)
{
int lineLength = 40 // Каждая строка обрабатывает 40 байт;
Кодировка кодировки = Encoding.GetEncoding(charset); // Получаем указанную кодировку
byte[] buffer =coding.GetBytes(s); // Преобразование в байт-код
StringBuilder sb = new StringBuilder(); // Сохраняем конечный результат
строка linebase64;
int блок =uffer.Length%lineLength==0?buffer.Length/lineLength:buffer.Length/lineLength + 1;
for(int i=0; i<block; i++)
{
if(uffer.Length - i*lineLength >=lineLength)
linebase64 = Convert.ToBase64String(буфер, 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();
}
Затем измените обработку темы электронного письма в методе ToString класса MailMessage, чтобы вызвать собственный метод.
// sb.Append("Subject: " + MailEncoder.ConvertHeaderToQP(cleanSubject.ToString(), charset) + "rn");
sb.Append("Тема: " + MailEncoder.ConvertHeaderToBase64( cleanSubject.ToString(), кодировка) + "rn");
Просто перекомпилируйте
Источник: haogj