我找到了以下函数,它可以发送邮件:
bool sendmail( char * smtpserver, char * from, char * to, char * subject, char * msg )
{
int iProtocolPort = 0;
char szSmtpServerName[64] = "";
char szToAddr[64] = "";
char szFromAddr[64] = "";
char szBuffer[4096] = "";
char szLine[255] = "";
char szMsgLine[255] = "";
SOCKET hServer;
WSADATA WSData;
LPHOSTENT lpHostEntry;
LPSERVENT lpServEntry;
SOCKADDR_IN SockAddr;
// Load command-line args
lstrcpyA( szSmtpServerName, smtpserver );
lstrcpyA( szToAddr, to );
lstrcpyA( szFromAddr, from );
// Attempt to intialize WinSock (1.1 or later)
if ( WSAStartup( MAKEWORD( VERSION_MAJOR, VERSION_MINOR ), &WSData ) )
{
printf( "\nCannot find Winsock v%d.%d or later", VERSION_MAJOR, VERSION_MAJOR );
return false;
}
// Lookup email server's IP address.
lpHostEntry = gethostbyname( szSmtpServerName );
if ( !lpHostEntry )
{
printf( "\nCannot find SMTP mail server %s", szSmtpServerName );
return false;
}
// Create a TCP/IP socket, no specific protocol
hServer = socket( PF_INET, SOCK_STREAM, 0 );
if ( hServer == INVALID_SOCKET )
{
printf( "\nCannot open mail server socket!" );
return false;
}
// Get the mail service port
lpServEntry = getservbyname( "mail", 0 );
// Use the SMTP default port if no other port is specified
if ( !lpServEntry ) iProtocolPort = htons( IPPORT_SMTP );
else iProtocolPort = lpServEntry->s_port;
// Setup a Socket Address structure
SockAddr.sin_family = AF_INET;
SockAddr.sin_port = iProtocolPort;
SockAddr.sin_addr = *( (LPIN_ADDR)*lpHostEntry->h_addr_list );
// Connect the Socket
if ( connect( hServer, ( PSOCKADDR ) &SockAddr, sizeof( SockAddr ) ) )
{
printf( "\nError connecting to Server socket!" );
return false;
}
// Receive initial response from SMTP server
Check( recv( hServer, szBuffer, sizeof( szBuffer ), 0), "recv() Reply" );
// Send HELO server.com
sprintf_s( szMsgLine, "HELO %s%s", smtpserver, CRLF );
Check( send( hServer, szMsgLine, strlen( szMsgLine ), 0 ), "send() HELO" );
Check( recv( hServer, szBuffer, sizeof( szBuffer ), 0 ), "recv() HELO" );
// Send MAIL FROM: <sender@mydomain.com>
sprintf_s( szMsgLine, "MAIL FROM:<%s>%s", from, CRLF );
Check( send( hServer, szMsgLine, strlen( szMsgLine ), 0 ), "send() MAIL FROM" );
Check( recv( hServer, szBuffer, sizeof( szBuffer ), 0 ), "recv() MAIL FROM" );
// Send RCPT TO: <receiver@domain.com>
sprintf_s( szMsgLine, "RCPT TO:<%s>%s", to, CRLF );
Check( send( hServer, szMsgLine, strlen( szMsgLine ), 0 ), "send() RCPT TO" );
Check( recv( hServer, szBuffer, sizeof( szBuffer ), 0 ), "recv() RCPT TO" );
// Send DATA
sprintf_s( szMsgLine, "DATA%s", CRLF );
Check( send( hServer, szMsgLine, strlen( szMsgLine ), 0 ), "send() DATA" );
Check( recv( hServer, szBuffer, sizeof( szBuffer ), 0 ), "recv() DATA" );
// Send Subject
sprintf_s( szBuffer, "Subject: %s\n", subject );
Check( send( hServer, szBuffer, strlen( szBuffer ), 0 ), "send() Subject" );
//Send From
sprintf_s( szBuffer, "From: %s\n", from );
Check( send( hServer, szBuffer, strlen( szBuffer ), 0 ), "send() From" );
//Send To
sprintf_s( szBuffer, "To: %s\n\n", to );
Check( send( hServer, szBuffer, strlen( szBuffer ), 0 ), "send() To" );
//Check( send( hServer, szMsgLine, strlen( szMsgLine ), 0 ), "send() Attachment" );
sprintf_s( szMsgLine, "%s%s", msg, CRLF );
Check( send( hServer, szMsgLine, strlen( szMsgLine ), 0 ), "send() message-line" );
// Send blank line and a period
sprintf_s( szMsgLine, "%s.%s", CRLF, CRLF );
Check( send( hServer, szMsgLine, strlen( szMsgLine ), 0 ), "send() end-message" );
Check( recv( hServer, szBuffer, sizeof( szBuffer ), 0 ), "recv() end-message" );
// Send QUIT
sprintf_s( szMsgLine, "QUIT%s", CRLF );
Check( send( hServer, szMsgLine, strlen( szMsgLine ), 0 ), "send() QUIT" );
Check( recv( hServer, szBuffer, sizeof( szBuffer ), 0 ), "recv() QUIT" );
// Close server socket and prepare to exit.
closesocket( hServer );
WSACleanup();
return true;
} 我正在进行一个SQL查询,我想通过电子邮件发送结果,但结果可以超过一行。所以我不知道,我怎么能一次发送全部结果。SQL查询的结果将存储在一个结构中(但如果有人有更好的想法,那么我正在听:)。所以我的问题是,是否有一种方法可以在电子邮件中发送这个结构?或者,我如何才能发送作为电子邮件结果的每一行?
谢谢!
发布于 2012-02-25 02:01:07
在你想要发送你的结构的旁边:
// All sorts of initializations and stuff
memcpy(yourbuffer,&yourstructure,sizeof(yourbuffer));在另一边:
// Trivial stuff like receiving your buffer :-)
memcpy(&yourstructure,yourbuffer,sizeof(yourstructure));发布于 2011-09-27 09:37:03
要回答您的第一个问题,如果您想通过套接字发送结构,首先必须序列化它。特别是,整数的字节在目标计算机上的顺序可能不同。有许多用于序列化数据的协议,例如ASN.1和JSON。对于C结构,最好使用msgpack或protobufs之类的东西。在序列化数据之后,您就有了一个字节数组,它可以简单地通过套接字发送,一次发送一个块。通常,您还会有一个协议来包装它,它可以像这样简单:
SENDBUF 437\r\n
GSUOHD*)*IHENHD{@DNJDPOJDPJONK:ND{D@O LDK?ND(G(OBDO*U|GR(G(DIU:OBD基本上,它是一个命令字符串,后跟这个包中的字节数,然后是回车符、换行符。这是HTTP、memcache和许多其他协议使用的典型协议样式。在换行符之后,您将在输入缓冲区的末尾收集接下来的n个字节(在本例中为437)。由于许多结构可能是多个数据包,因此您可以使用BEGIN和END命令,或者您可以简单地关闭套接字以标记结构的结束。
接收进程将收集字节,直到结构结束,然后反序列化它。
如果您使用像ZeroMQ这样的库,这将简化套接字处理,但您仍然必须处理序列化和反序列化结构。
https://stackoverflow.com/questions/7546128
复制相似问题