Mimekit добавляет rtf как вложение, а не тело

Используя следующий код, тело файла winmail.dat в формате rtf добавляется в качестве вложения к сохраненному электронному письму, а не в тело:

using (Stream stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.None))
{
    MimeKit.MimeMessage mimeMessage = MimeKit.MimeMessage.Load(stream);

    int i = 1;
    foreach (MimeKit.MimePart attachment in mimeMessage.Attachments)
    {
        if (attachment.GetType() == typeof(MimeKit.Tnef.TnefPart))
        {
            MimeKit.Tnef.TnefPart tnefPart = (MimeKit.Tnef.TnefPart)attachment;

            MimeKit.MimeMessage tnefMessage = tnefPart.ConvertToMessage();
            tnefMessage.WriteTo(path + $"_tnefPart{i++}.eml");
        }
    }
}

Как я могу это исправить?


Глядя в Attachments его там нет, но вложения и файл body.rtf присутствуют в BodyParts. Итак, я могу получить файл body.rtf следующим образом:

int b = 1;
foreach (MimeKit.MimeEntity bodyPart in tnefMessage.BodyParts)
{
    if (!bodyPart.IsAttachment)
    {
        bodyPart.WriteTo(path + $"_bodyPart{b++}.{bodyPart.ContentType.MediaSubtype}");
    }
}

Боковое примечание: файл body.rtf не является истинным rtf, потому что он начинается со следующего:

Тип содержимого: текст/rtf; имя=тело.rtf

(новая линия)


person TheLethalCoder    schedule 09.02.2017    source источник


Ответы (1)


Причина, по которой вы получаете заголовок Content-Type, заключается в том, что вы пишете конверт MIME, а также содержимое.

Что вам нужно сделать, так это:

int b = 1;
foreach (MimeKit.MimeEntity bodyPart in tnefMessage.BodyParts)
{
    if (!bodyPart.IsAttachment)
    {
        var mime = (MimeKit.MimePart) bodyPart;
        mime.ContentObject.DecodeTo(path + $"_bodyPart{b++}.{bodyPart.ContentType.MediaSubtype}");
    }
}
person jstedfast    schedule 16.02.2017