当使用 esmtp、C 代码将二进制文件作为附件发送时,为什么在“\n”(LF)之前附加“\r”(CR)

Why is '\r' (CR) is getting appended before '\n' (LF) when a binary file is sent as an attachment using esmtp, C code

我正在从设备发送电子邮件。电子邮件既有文本又有附件。下面是我正在使用的 MIMEheaders

     strLen += sprintf(&headerBuf[strLen], "%s\r\n","MIME-Version: 1.0");
     strLen += sprintf(&headerBuf[strLen], "From: %s\r\n", fromEmailAddr);
     strLen += sprintf(&headerBuf[strLen], "To: %s\r\n", toEmailAddr);
     strLen += sprintf(&headerBuf[strLen], "Subject: %s\r\n","PQdiff File");
     strLen += sprintf(&headerBuf[strLen], "%s\r\n","Content-Type:multipart/mixed; boundary=pqdiffdata");
     strLen += sprintf(&headerBuf[strLen], "%s\r\n","--pqdiffdata");
     strLen += sprintf(&headerBuf[strLen], "%s\r\n","Content-Type: text/html;");
     strLen += sprintf(&headerBuf[strLen], "%s\r\n"," charset=iso-8859-1");
     strLen += sprintf(&headerBuf[strLen], "%s\r\n","Content-Transfer-Encoding: 7bit");

     HTML text goes here
<html>
<body>
<table border="0" cellpadding="5" cellspacing="0" style="background-color:white;color:black;font-family:arial,helvetica,sans-serif;">
<tr><td colspan="4" style="padding:5px;background-color:white;color:black;font-size:175%;text-align:center">Text1<br /></td></tr>
                <tr style="text-align:left;font-size:100%;white-space:nowrap;" bgcolor="#DCDCDC""><td>Text </td><td>Text2</td></tr>
                <tr style="text-align:left;font-size:100%;white-space:nowrap;" bgcolor="#FFFFFF"><td>Text3</td><td>Text4</td></tr>
                <tr style="text-align:left;font-size:100%;white-space:nowrap;" bgcolor="#DCDCDC"><td>Text</td><td>Text5</td></tr>
                <tr style="text-align:left;font-size:100%;white-space:nowrap;" bgcolor="#FFFFFF"><td>Date/Time</td><td>Date</td></tr>
</table>
</body>
</html>
     strLen = snprintf(&headerBuf[strLen], sizeof(headerBuf), "%s\r\n","--pqdiffdata");
     strLen += sprintf(&buf[strLen], "%s\r\n","Content-Type: application/octet-stream");
     strLen += sprintf(&buf[strLen], "%s\r\n","Content-Transfer-Encoding: binary");
     strLen += sprintf(&buf[strLen], "Content-Disposition: attachment;\r\n filename=%s\r\n\r\n", pqdifFileName);

     Binary data of attached file goes here

     strLen = snprintf(buf, MAX_DATA_BUF_SIZE, "\r\n--pqdiffdata--\r\n\r\n");
   strLen += sprintf(&buf[strLen], "%s\r\n","Content-Type: application/octet-stream; charset=7bit");
   strLen += sprintf(&buf[strLen], "%s\r\n","Content-Transfer-Encoding: base64");
   strLen += sprintf(&buf[strLen], "Content-Disposition: attachment;\r\n filename=%s\r\n\r\n", pqdifFileName);

我正在使用 esmtp,我可以发送带有二进制文件附件的电子邮件。但问题是“\r”被附加到附加文件内容中的“\n”之前。

我正在以“rb”模式打开要附加的文件,然后使用下面的 API

将文件指针传递给 esmtp 库

smtp_set_messagecb(留言,readlinefp_cb,fp);

我也尝试过使用 API smtp_set_message_fp (message, fp);,但没有用

当我使用 outlook 将附加到电子邮件的同一文件发送到 gmail 时,我收到的文件内容没有任何变化。

请让我知道我在这里遗漏了什么。

谢谢

这里最安全的做法是对附件进行 Base64 编码并将其呈现为 7 位 MIME。有些服务器(但不是全部)支持 8BITMIME 扩展 (RFC6152),这意味着您在此处的有效负载无法传送到不支持的服务器。

您的库可能无法以这种方式附加原始二进制文件,因为它没有得到广泛支持。