通过SMTP发送文件时,它将丢失一些字节 C ++

问题描述

我正在尝试通过SMTP发送电子邮件,我发送多部分邮件,其中包括文本部分和应用程序/八位字节流部分。当我尝试不发送* .txt文件时(例如.jpg或.docx),它已损坏并且丢失了一些字节。例如,当我尝试发送123.docx文件时,此文件的大小为166020字节我在电子邮件中收到文件,但是只有166006,但无法打开。变量“总计”显示发送的字节数正确。 我的代码在下面:

   viewmodel.itemPosition.observe(requireActivity(),object : Observer<Int> {
            override fun onChanged(t: Int?) {
                //you will get the position on selection os spinner
                //get value by position

        })

解决方法

MIME编码中有几个基本错误,在这里:

首先,应该使用空白行将标题和内容分开。空行丢失了:

strcpy(text,"Content-Type: multipart/mixed; boundary=\"---nsabnqeaSA43ds2\"\n");

此处生成了一个换行符。

strcpy(text,"-----nsabnqeaSA43ds2\nContent-Type: text/plain; charset=utf8\nContent-Transfer-Encoding: 8bit\n\n");

邮件内容从此处开始,前面没有空行。

此外,在边界定界符之前的换行符是边界定界符的逻辑部分,因此也缺少换行符。有关更多信息,请参见MIME文档。

strcpy(text,"\n-----nsabnqeaSA43ds2 \nContent-Type: application/octet-stream\nContent-Length: ");

请注意,此处您是在边界定界符之前显式发送换行符,因此您必须了解此要求。

第二:

while((readBytes = fin.read(buf,1024).gcount())>0) {
     int sent= send(s,buf,readBytes,0);

按原样发送二进制文件的内容吗?那不会飞。即使它可能是正确的MIME编码或不是正确的MIME编码,SMTP仍然是基于纯文本的传输协议。二进制数据传输有一个扩展,但是显示的代码未使用它。

按原样,这是SMTP版本的未定义行为。没有保证的结果。如果需要可靠地附加此文件,则必须对其进行base64编码。