2

我有简单的代码来发送带有附件的电子邮件:

using (MailMessage mail = new MailMessage())
            {
                using (SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com"))
                {

                    mail.From = new MailAddress("my_mail@gmail.com");
                    mail.Sender = new MailAddress("my_mail@gmail.com");
                    mail.To.Add("my_mail@gmail.com");
                    mail.Subject = "TEST";
                    mail.Body = "Test body message";

                    //Add attachment
                    System.Net.Mail.Attachment attachment;
                    attachment = new System.Net.Mail.Attachment("1568817207ComputationC.part1.rar"); //Size 24MB
                    mail.Attachments.Add(attachment);

                    SmtpServer.Port = 587;
                    SmtpServer.Credentials = new System.Net.NetworkCredential("my_mail@gmail.com", "password");

                    SmtpServer.EnableSsl = true;
                    SmtpServer.Timeout = 0;

                    SmtpServer.Send(mail);
                }
            }

我的附件大小为 24MB + 一些文本 = 最大 25MB

我通过gmail收件箱中的“显示原始”选项测量了邮件的实际大小,然后我将此邮件下载到了我的硬盘上。

此外,当我测量我的应用程序发送电子邮件时发送的次数时,它显示为 33MB。

所以,我的问题是当我的附件 + 文本 = 最大 25MB :D 时,为什么这封电子邮件的实际大小是 33MB?

4

2 回答 2

2

因为您的电子邮件是MIME 编码的 - 二进制数据从 8 位数据更改为(通常)7 位数据,以便在服务器之间可靠地传输。有几种不同的编码方案,但它们通常会为您的电子邮件大小增加 33% 的开销——因此 25Mb 的电子邮件实际上是 32.5Mb 的数据。

编辑:此页面对 Base64 编码有很好的解释,通常在发送电子邮件时使用:

每个输入字节的输出字节数约为 4 / 3(33% 开销),并且对于大量字节收敛到该值。更具体地说,给定 n 字节的输入,输出将是 4[n/3] 字节长,包括填充字符。

于 2013-04-20T12:57:01.390 回答
0

电子邮件附件使用 base64 编码从二进制形式(8 位)编码为仅 ASCII 字符(7 位)。因此,您不会在一个字节中使用所有 8 位,而仅使用 7 位,并且电子邮件的大小会变得更大。

于 2013-04-20T12:54:34.780 回答