|
最近做一个程序要使用邮件发送功能传输图片,就在网上找了一个代码,代码链接是http://www.it165.net/pro/html/201407/16929.html,这个可以传输文本文件,但是传输BMP或JPG等图片时,就无法正常显示
bool CSendMail::SendFileBody(SOCKET &sock)
{
char* file_path;
int rt;
int len;
char file_name[128];
int pt = 0;
int dest_length = 0;
for (int index = 0; index < file_path_list_.size(); index++)
{
pt = 0;
memset(file_name, 0, 128);
file_path = file_path_list_[index];
len = GetFileData(file_path);
GetFileName(file_name, file_path);
sprintf_s(send_buff_, "--INVT\r\nContent-Type: application/octet-stream;\r\n name="%s"\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment;\r\n filename="%s"\r\n\r\n", file_name, file_name);
send(sock, send_buff_, strlen(send_buff_), 0);
while (pt < len)
{
memset(send_buff_, 0, sizeof(send_buff_));
// 760为1024的最大整数,(760/4)*3=570
dest_length = 4096;
Base64Encode((BYTE*)file_buffer_ + pt, min(len - pt, 570), send_buff_, &dest_length);
int len1 = strlen(send_buff_);
pt += min(len - pt, 570);
if (pt == len)
{
send_buff_[len1] = ""\r"";
send_buff_[len1 + 1] = ""\n"";
send_buff_[len1 + 2] = ""\0"";
}
else
send_buff_[len1] = ""\0"";
rt = send(sock, send_buff_, strlen(send_buff_), 0);
if (rt != strlen(send_buff_))
{
return false;
}
}
if (len != 0)
{
delete[] file_buffer_;
}
}
return true;
}
|
|
|
不能分段base64编码,应该将整个文件一次base64编码
|
|
|
您能说一下具体怎么改吗?我对这部分不是太懂 |
|
| 60分 |
bool CSendMail::SendFileBody(SOCKET &sock)
{
char* file_path;
int rt;
int len;
char file_name[128];
int pt = 0;
int dest_length = 0;
for (int index = 0; index < file_path_list_.size(); index++)
{
pt = 0;
memset(file_name, 0, 128);
file_path = file_path_list_[index];
len = GetFileData(file_path);
GetFileName(file_name, file_path);
sprintf_s(send_buff_, "--INVT\r\nContent-Type: application/octet-stream;\r\n name="%s"\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment;\r\n filename="%s"\r\n\r\n", file_name, file_name);
send(sock, send_buff_, strlen(send_buff_), 0);
while (pt < len)
{
memset(send_buff_, 0, sizeof(send_buff_));
// 760为1024的最大整数,(760/4)*3=570
dest_length = 4096;
Base64Encode((BYTE*)file_buffer_ + pt, min(len - pt, 570), send_buff_, &dest_length);
int len1 = strlen(send_buff_);
pt += min(len - pt, 570);
if (pt == len)
{
send_buff_[len1] = ""\r"";
send_buff_[len1 + 1] = ""\n"";
send_buff_[len1 + 2] = ""\0"";
}
else
send_buff_[len1] = ""\0"";
rt = send(sock, send_buff_, strlen(send_buff_), 0);
if (rt != strlen(send_buff_))
{
return false;
}
}
// if (len != 0)
// {
// delete[] file_buffer_;
// }
}
return true;
}
|
|
|
|
|
你用一个8×8像素的jpg测试。
|
|
|
8X8的可以,但是传大图该怎么办呢
|
|
bool CSendMail::SendFileBody(SOCKET &sock)
{
char *file_path;
int rt;
int len;
char file_name[256];
int dest_length;
BYTE *file_buffer_base64;
int index,len1;
for (index = 0; index < file_path_list_.size(); index++) {
file_path = file_path_list_[index];
len = GetFileData(file_path);
GetFileName(file_name, file_path);
sprintf_s(send_buff_, "--INVT\r\nContent-Type: application/octet-stream;\r\n name="%s"\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment;\r\n filename="%s"\r\n\r\n", file_name, file_name);
send(sock, send_buff_, strlen(send_buff_), 0);
file_buffer_base64=new BYTE[len*4/3+256];
Base64Encode((BYTE*)file_buffer_ , len, file_buffer_base64, &dest_length);
len1 = strlen(file_buffer_base64);
file_buffer_base64[len1 ] = ""\r"";
file_buffer_base64[len1 + 1] = ""\n"";
file_buffer_base64[len1 + 2] = ""\0"";
rt = send(sock, file_buffer_base64, strlen(file_buffer_base64), 0);
delete [] file_buffer_base64;
if (rt != strlen(file_buffer_base64)) {
return false;
}
}
return true;
}
|
|
|
参数类型不对不能运行,file_buffer_base64是BYTE*, Base64Encode((BYTE*)file_buffer_ , len, file_buffer_base64, &dest_length);中第二个参数要求是LPSTR类型,len1 = strlen(file_buffer_base64)中的参数是const char *类型。
|
|
|
Base64Encode((BYTE*)file_buffer_ , len, (LPSTR)file_buffer_base64, &dest_length);
en1 = strlen((const char *)file_buffer_base64) |
|
|
|
|
|
顶上去
|
|
|
VS IDE中,在符号Base64Encode上点鼠标右键,选转到定义。看看该函数各参数的定义和调用是否一致。
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 |
|