|
|
我想通过smtp发email, 在C 程序中走过DATA后,就该注明Header了,可是这个Header有哪些内容,该怎么写,哪位大哥能指点一下,或有一个列子?先谢谢了。
| sdupoplar 回复于:2003-10-16 20:58:49
| 你上个问题中已给你了个C++的简单发邮件程序,你把程序中传输的数据输出一看就明白了。我有个C的程序,不过当时只是测试一下可不可以,不可以直接用的,数据存放时只是直接用了数组,数据长了会越界的,没有错误检查,不过可以发送邮件,你如果需要的话我可以给你贴出来。
| | littlescorpian 回复于:2003-10-17 07:19:47
| 需要需要。请贴出C程序。谢谢!
| | sdupoplar 回复于:2003-10-17 08:20:35
| 不太好读,你看看吧。
[code:1:0a42cdba85]#include <stdio.h>
#include <winsock2.h>
#include <time.h>
#define PORT 25
#define BUFFERLEN 1024
#define TEMPLEN 1024
int WaitForRead( SOCKET socket, int seconds );
int WaitForWrite( SOCKET socket, int seconds );
int MyRecv( SOCKET socket, char *buffer, int len );
int MySend( SOCKET socket, char *buffer, int len );
//char* decode( const char* in_str, char* out_str);
char* encode( const char* in_str, char *out_str );
int main( void )
{
SOCKET srvrSocket;
struct sockaddr_in srvrAddr;
WORD ver;
WSAData data;
int z, len;
char buffer[BUFFERLEN];
char temp[TEMPLEN];
char hostname[] = "smtp.163.com";
char username[] = "***";
char password[] = "***";
char sendname[] = "senderyjf";
char recvname[] = "recvyjf";
char subject[] = "Test mail";
char sendaddr[] = "****@163.com";
char recvaddr[] = "*****@163.com";
char plaincontent[] = "Test content !!!";
char filecontent[] = "d:\\test.txt";
char htmcontent[] = "<a href='http://morningspace.51.net'>click me</a>";
ver = MAKEWORD( 2, 0 );
z = WSAStartup( ver, &data );
if ( z < 0 )
{
fprintf( stderr, "WSAStartup() error!\n" );
return 1;
}
struct hostent* host = gethostbyname( hostname );
if (host == 0)
{
fprintf(stderr,"gethostbyname() error!\n");
}
//srvrSocket = socket( PF_INET, SOCK_STREAM, IPPROTO_TCP );
srvrSocket = socket( PF_INET, SOCK_STREAM, 0 );
if ( srvrSocket < 0 )
{
fprintf( stderr, "Alloc socket handle failed!\n" );
return 1;
}
memset( &srvrAddr, 0, sizeof srvrAddr );
srvrAddr.sin_family = AF_INET;
srvrAddr.sin_port = htons(PORT);
srvrAddr.sin_addr.s_addr = *(ULONG *)host->h_addr ;
if ( srvrAddr.sin_addr.s_addr == INADDR_NONE )
{
fprintf( stderr, "inet_addr() error!\n" );
return 1;
}
len = sizeof srvrAddr;
z = connect( srvrSocket, ( struct sockaddr * ) &srvrAddr, len );
if ( z < 0 )
{
fprintf( stderr, "connet() error!\n" );
return 1;
}
z = MyRecv( srvrSocket, buffer, BUFFERLEN );
if ( z < 0 ) return 1;
if ( strncmp( buffer, "220", 3 ) != 0 ) return 1;
//hello
if ( gethostname( temp, TEMPLEN ) != 0 )
{
fprintf( stderr, "gethostname() error");
}
sprintf( buffer, "HELO %s\r\n", temp );
z = MySend( srvrSocket, buffer, strlen( buffer ) );
if ( z < 0 ) return 1;
z = MyRecv( srvrSocket, buffer, BUFFERLEN );
if ( z < 0 ) return 1;
if ( strncmp( buffer, "250", 3 ) != 0 ) return 1;
//login
strcpy( buffer, "AUTH LOGIN\r\n" );
z = MySend( srvrSocket, buffer, strlen( buffer ) );
if ( z < 0 ) return 1;
z = MyRecv( srvrSocket, buffer, BUFFERLEN );
if ( z < 0 ) return 1;
if ( strncmp( buffer, "334", 3 ) != 0 ) return 1;
sprintf( buffer, "%s\r\n", encode( username, temp ) );
z = MySend( srvrSocket, buffer, strlen( buffer ) );
if ( z < 0 ) return 1;
z = MyRecv( srvrSocket, buffer, BUFFERLEN );
if ( z < 0 ) return 1;
if ( strncmp( buffer, "334", 3 ) != 0 ) return 1;
sprintf( buffer, "%s\r\n", encode( password, temp ) );
z = MySend( srvrSocket, buffer, strlen( buffer ) );
if ( z < 0 ) return 1;
z = MyRecv( srvrSocket, buffer, BUFFERLEN );
if ( z < 0 ) return 1;
if ( strncmp( buffer, "235", 3 ) != 0 ) return 1;
//send header
sprintf( buffer, "MAIL FROM: <%s>\r\n", sendaddr );
z = MySend( srvrSocket, buffer, strlen( buffer ) );
if ( z < 0 ) return 1;
z = MyRecv( srvrSocket, buffer, BUFFERLEN );
if ( z < 0 ) return 1;
if ( strncmp( buffer, "250", 3 ) != 0 ) return 1;
sprintf( buffer, "RCPT TO: <%s>\r\n", recvaddr );
z = MySend( srvrSocket, buffer, strlen( buffer ) );
if ( z < 0 ) return 1;
z = MyRecv( srvrSocket, buffer, BUFFERLEN );
if ( z < 0 ) return 1;
if ( strncmp( buffer, "250", 3 ) != 0 ) return 1;
///////////////////////////////////////////////////////////
strcpy( buffer, "DATA\r\n" );
z = MySend( srvrSocket, buffer, strlen( buffer ) );
if ( z < 0 ) return 1;
z = MyRecv( srvrSocket, buffer, BUFFERLEN );
if ( z < 0 ) return 1;
if ( strncmp( buffer, "354", 3 ) != 0 ) return 1;
sprintf( buffer, "From: \"%s\" <%s>\r\n", sendname, sendaddr );
sprintf( temp, "To: \"%s\" <%s>\r\n", recvname, recvaddr );
strcat( buffer, temp );
time_t seconds;
time( &seconds );
strftime( temp, TEMPLEN,
"%a, %d %b %y %H:%M:%S",
localtime(&seconds));
strcat( buffer, "Date: " );
strcat( buffer, temp );
strcat( buffer, "\r\n" );
sprintf( temp, "Subject: %s\r\n", subject );
strcat( buffer, temp );
strcat( buffer, "X-Mailer: SMailer\r\n" );
strcat( buffer, "X-Priority: 3\r\n" );
strcat( buffer, "MIME-Version: 1.0\r\n" );
strcat( buffer, "Content-type: multipart/mixed; boundary=\"" );
strcat( buffer, "#BOUNDARY#\"\r\n\r\n" );
z = MySend( srvrSocket, buffer, strlen( buffer ) );
if ( z < 0 ) return 1;
//plainttxt
strcpy( buffer, "--#BOUNDARY#\r\n" );
strcat( buffer, "Content-Type: text/plain; charset=gb2312\r\n" );
strcat( buffer, "Content-Transfer-Encoding: 8bit\r\n\r\n" );
z = MySend( srvrSocket, buffer, strlen( buffer ) );
if ( z < 0 ) return 1;
strcpy( buffer, plaincontent );
strcat( buffer, "\r\n\r\n" );
z = MySend( srvrSocket, buffer, strlen( buffer ) );
if ( z < 0 ) return 1;
//htm
strcpy( buffer, "--#BOUNDARY#\r\n" );
strcat( buffer, "Content-Type: text/html; charset=gb2312\r\n" );
strcat( buffer, "Content-Transfer-Encoding: 8bit\r\n\r\n" );
z = MySend( srvrSocket, buffer, strlen( buffer ) );
if ( z < 0 ) return 1;
strcpy( buffer, htmcontent );
strcat( buffer, "\r\n\r\n" );
z = MySend( srvrSocket, buffer, strlen( buffer ) );
if ( z < 0 ) return 1;
//file
char drive[_MAX_DRIVE];
char direc[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
char filename[_MAX_FNAME+_MAX_EXT];
_splitpath(filecontent, drive, direc, fname, ext);
strcpy( filename, fname );
strcat( filename, ext );
strcpy( buffer, "--#BOUNDARY#\r\n" );
strcat( buffer, "application/octet-stream; name=" );
strcat( buffer, filename );
strcat( buffer, "\r\n" );
strcat( buffer, "Content-Disposition: attachment; filename=" );
strcat( buffer, filename );
strcat( buffer, "\r\n" );
strcat( buffer, "Content-Transfer-Encoding: base64\r\n\r\n" );
z = MySend( srvrSocket, buffer, strlen( buffer ) );
if ( z < 0 ) return 1;
strcpy( buffer, encode( filecontent, temp ) );
strcat( buffer, "\r\n\r\n" );
z = MySend( srvrSocket, buffer, strlen( buffer ) );
if ( z < 0 ) return 1;
//end data
strcpy( buffer, "\r\n--#BOUNDARY#--\r\n.\r\n" );
z = MySend( srvrSocket, buffer, strlen( buffer ) );
if ( z < 0 ) return 1;
z = MyRecv( srvrSocket, buffer, BUFFERLEN );
if ( z < 0 ) return 1;
if ( strncmp( buffer, "250", 3 ) != 0 ) return 1;
//quit
strcpy( buffer, "QUIT\r\n" );
z = MySend( srvrSocket, buffer, strlen( buffer ) );
if ( z < 0 ) return 1;
z = MyRecv( srvrSocket, buffer, BUFFERLEN );
if ( z < 0 ) return 1;
if ( strncmp( buffer, "221", 3 ) != 0 ) return 1;
fprintf( stdout, "Successful end!!!\n" );
closesocket( srvrSocket );
WSACleanup();
return 0;
}
char* encode( const char* in_str, char *out_str )
{
const char base64_encode_chars[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
unsigned char c1, c2, c3;
int i = 0;
int j = 0;
int len = strlen( in_str );
while ( i<len )
{
// read the first byte
c1 = in_str[i++];
if ( i==len ) // pad with "="
{
out_str[j++] = base64_encode_chars[ c1>>2 ];
out_str[j++] = base64_encode_chars[ (c1&0x3)<<4 ];
out_str[j++] = '=';
out_str[j++] = '=';
break;
}
// read the second byte
c2 = in_str[i++];
if ( i==len ) // pad with "="
{
out_str[j++] = base64_encode_chars[ c1>>2 ];
out_str[j++] = base64_encode_chars[ ((c1&0x3)<<4) | ((c2&0xF0)>>4) ];
out_str[j++] = base64_encode_chars[ (c2&0xF)<<2 ];
out_str[j++] = '=';
break;
}
// read the third byte
c3 = in_str[i++];
// convert into four bytes string
out_str[j++] = base64_encode_chars[ c1>>2 ];
out_str[j++] = base64_encode_chars[ ((c1&0x3)<<4) | ((c2&0xF0)>>4) ];
out_str[j++] = base64_encode_chars[ ((c2&0xF)<<2) | ((c3&0xC0)>>6) ];
out_str[j++] = base64_encode_chars[ c3&0x3F ];
}
out_str[j] = 0;
return out_str;
}
/*
char* decode( const char* in_str, char* out_str)
{
const base64_decode_chars[] =
{
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
};
char c1, c2, c3, c4;
int i = 0;
int j = 0;
int len = strlen( in_str );
while ( i<len)
{
// read the first byte
do {
c1 = base64_decode_chars[ in_str[i++] ];
} while ( i<len && c1==-1);
if ( c1==-1)
break;
// read the second byte
do {
c2 = base64_decode_chars[ in_str[i++] ];
} while ( i<len && c2==-1);
if ( c2==-1 )
break;
// assamble the first byte
out_str[j++] = char( (c1<<2) | ((c2&0x30)>>4) );
// read the third byte
do {
c3 = in_str[i++];
if ( c3==61 ) // meet with "=", break
return out_str;
c3 = base64_decode_chars[ c3 ];
} while ( i<len && c3==-1);
if ( c3==-1 )
break;
// assamble the second byte
out_str[j++] = char( ((c2&0XF)<<4) | ((c3&0x3C)>>2) );
// read the fourth byte
do {
c4 = in_str[i++];
if ( c4==61 ) // meet with "=", break
return out_str;
c4 = base64_decode_chars[ c4 ];
} while ( i<len && c4==-1 );
if ( c4==-1 )
break;
// assamble the third byte
out_str[j++] = char( ((c3&0x03)<<6) | c4 );
}
return out_str;
}
*/
int MyRecv( SOCKET socket, char *buffer, int len)
{
int z;
z = WaitForRead( socket, 100 );
if ( z < 0 )
{
fprintf( stderr, "Select() faield!\n" );
closesocket( socket );
return -1;
}
else if ( z == 0 )
{
fprintf( stdout, "Receive Time Out!\n" );
closesocket( socket );
return -1;
}
z = recv( socket, buffer, len, 0 );
if ( z < 0 )
{
fprintf( stderr, "Receive failed!\n" );
closesocket( socket );
return -1;
}
else if ( z == 0 )
{
fprintf( stdout, "Break by remote!\n" );
closesocket( socket );
return -1;
}
buffer[z]=0;
fprintf( stdout, "[INFO]RECV( ):%s\n", buffer);
return z;
}
int MySend( SOCKET socket, char *buffer, int len)
{
int z;
z = WaitForWrite( socket, 100 );
if ( z < 0 )
{
fprintf( stderr, "Select() faield!\n" );
closesocket( socket );
return -1;
}
else if ( z == 0 )
{
fprintf( stdout, "Receive Time Out!\n" );
closesocket( socket );
return -1;
}
z = send( socket, buffer, len, 0);
if ( z < 0 )
{
fprintf( stderr, "Receive failed!\n" );
closesocket( socket );
return -1;
}
else if ( z == 0 )
{
fprintf( stdout, "Break by remote!\n" );
closesocket( socket );
return -1;
}
fprintf( stdout, "[INFO]SEND:%s\n", buffer );
return z;
}
int WaitForRead( SOCKET socket, int seconds )
{
fd_set fds;
struct timeval timeOut;
int z;
FD_ZERO( &fds );
FD_SET( socket, &fds );
timeOut.tv_sec = seconds;
timeOut.tv_usec = 0;
z = select( socket+1, &fds, NULL, NULL, &timeOut );
return z;
}
int WaitForWrite( SOCKET socket, int seconds )
{
fd_set fds;
struct timeval timeOut;
int z;
FD_ZERO( &fds );
FD_SET( socket, &fds );
timeOut.tv_sec = seconds;
timeOut.tv_usec = 0;
z = select( socket+1, NULL, &fds, NULL, &timeOut );
return z;
}
[/code:1:0a42cdba85]
| | 蓝色键盘 回复于:2003-10-17 13:34:02
| 露山购热情,老夫置为精彩回帖。
| | littlescorpian 回复于:2003-10-17 16:01:36
| 
| | aiqin21sgy 回复于:2003-10-23 00:16:03
| "你上个问题中已给你了个C++的简单发邮件程序"?
能不能给贴出来看看,谢谢!!
| |
|