Попытка вставить файл eml в качестве вложения приводит к ошибке «Введена недопустимая строка Base-64, поскольку она содержит неосновной 64-символ» - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть MailMessage в c #, который я хочу преобразовать в EML для вставки в качестве вложения в другую систему, но я получаю ошибку

Введенные данные не являются допустимой строкой Base-64, поскольку они содержат неосновной 64-символ, более двух символов заполнения или недопустимый символ среди символов заполнения

textBody не используется .. Я передаю только в HTML

public Task<string> CreateEml(string @from, string to, string subject, string htmlBody, string textBody, List<Attachment> attachments = null)
    {
        using (var message = new MailMessage())
        {               
            message.To.Add(new MailAddress(to));
            message.From = new MailAddress(@from);
            //message.Bcc.Add(new MailAddress(bcc));
            message.Subject = subject;
            message.Body = htmlBody;
            message.IsBodyHtml = true;
            message.BodyEncoding = System.Text.Encoding.UTF8;
            if (attachments != null)
            {
                foreach (var item in attachments)
                {
                    message.Attachments.Add(item);
                }
            }

            if (!string.IsNullOrEmpty(textBody))
            {
                using (var stream = new MemoryStream())
                using (var writer = new StreamWriter(stream))
                {
                    writer.Write(textBody);
                    message.AlternateViews.Add(new AlternateView(stream));
                    var eml = message.ToEml();
                    return Task.FromResult(eml);
                }
            }

            return Task.FromResult(message.ToEml());
        }
    }

Существует метод расширения ToEml (), который делает это

 public static string ToEml(this MailMessage message)
    {
        var assembly = typeof(SmtpClient).Assembly;
        var mailWriterType = assembly.GetType("System.Net.Mail.MailWriter");

        using (var memoryStream = new MemoryStream())
        {
            // Get reflection info for MailWriter contructor
            var mailWriterContructor = mailWriterType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(Stream) }, null);

            // Construct MailWriter object with our FileStream
            var mailWriter = mailWriterContructor.Invoke(new object[] { memoryStream });

            // Get reflection info for Send() method on MailMessage
            var sendMethod = typeof(MailMessage).GetMethod("Send", BindingFlags.Instance | BindingFlags.NonPublic);

            // Call method passing in MailWriter
            sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true, true }, null);

            // Finally get reflection info for Close() method on our MailWriter
            var closeMethod = mailWriter.GetType().GetMethod("Close", BindingFlags.Instance | BindingFlags.NonPublic);

            // Call close method
            closeMethod.Invoke(mailWriter, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { }, null);

            return Encoding.ASCII.GetString(memoryStream.ToArray());
        }
    }    

Эти результирующие данные присваиваются data.EmailDataBus и используются для вставки электронного письма в качестве вложения в стороннюю систему, подобную этой

attachment.FileInfo[0] = new FileInfoClass
            {
                Description = emailDescription,
                Category = "EMAIL",
                FileName = "NewBusiness.eml",
                Data = data.EmailDataBus,
            };

            using (var webService = new ConneXion())
            {
                webService.Url = CloudConfigurationManager.GetSetting("tam.webservice.url");

                var response = webService.InsertAttachment(ref attachment);

Я получаю сообщение об ошибке

Введенные данные не являются допустимой строкой Base-64, поскольку они содержат неосновной 64-символ, более двух символов заполнения или недопустимый символ среди символов заполнения

Данные в data.EmailBus выглядят следующим образом, обратите внимание, что я не включаю все base64, но верхний и нижний колонтитулы не повреждены

https://plnkr.co/edit/n71EFK2gHRj6Nn4HX1Sn?p=preview

1 Ответ

0 голосов
/ 06 апреля 2019

Оказывается, мне просто нужно было закодировать все это в base64 ... что немного странно, поскольку части данных уже были base64 ... но я полагаю, что не все. Во всяком случае, теперь все это работает :) Вложение пошло в связи нормально.

byte[] emaildata = Encoding.UTF8.GetBytes(data.EmailDataBus);
 string b64 = Convert.ToBase64String(emaildata);
...