Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C++;通过SMTP?_C_Windows - Fatal编程技术网

如何从C++;通过SMTP?

如何从C++;通过SMTP?,c,windows,C,Windows,我正在尝试创建一个应用程序,它将发送一封带有附件的电子邮件。邮件发送工作正常,但我无法附加任何内容。我在网上找到了这个代码。有人能帮我,如何附加文件吗?到目前为止,我的代码是: int sendmail( char * smtpserver, char * from, char * to, char * subject, char * msg ) { int iProtocolPort = 0; char szSmtpServerName[64] =

我正在尝试创建一个应用程序,它将发送一封带有附件的电子邮件。邮件发送工作正常,但我无法附加任何内容。我在网上找到了这个代码。有人能帮我,如何附加文件吗?到目前为止,我的代码是:

int 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 1;
}

// Lookup email server's IP address.
lpHostEntry = gethostbyname( szSmtpServerName );
if ( !lpHostEntry )
{
    printf( "\nCannot find SMTP mail server %s", szSmtpServerName );
    return 1;
}

// 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 1;
}

// 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 1;
}

// 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" );

char buf[ 128 ], str[ 512 ];
char * pch;

memset( str, 0, sizeof( str ) );

strcpy_s( str, to );

pch = strtok( str, "," );//separate email addresses at ','
while (pch != NULL)
{
    memset( buf, 0, sizeof( buf ) );
    //printf("Buf: %s\n",pch);
    strcpy_s( buf, pch );
    pch = strtok (NULL, ",");

    // Send RCPT TO: <receiver@domain.com>
    sprintf_s( szMsgLine, "RCPT TO:<%s>%s", buf, 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 Cc
sprintf_s( szMsgLine, "Cc: %s%s", "test@domain.com",CRLF );
Check( send( hServer, szMsgLine, strlen( szMsgLine ), 0 ), "send() Cc" );

// 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", "BIOS Update" );
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" );

//Attach
sprintf_s( szMsgLine, "Attachment: %s%s", "d:\\test.txt",CRLF );   //this doesn't work
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" );

// Report message has been sent
printf( "\nMail sent!" );

// Close server socket and prepare to exit.
closesocket( hServer );

WSACleanup();

return 0;
}
int sendmail(char*smtpserver,char*from,char*to,char*subject,char*msg)
{
int iProtocolPort=0;
char szSmtpServerName[64]=“”;
char szToAddr[64]=“”;
char szFromAddr[64]=“”;
字符szBuffer[4096]=“”;
字符szLine[255]=“”;
char szMsgLine[255]=“”;
套接字服务器;
WSADATA-WSData;
LPHOSTENT lpHostEntry;
LPSERVENT LPSERVENT;
SOCKADDR_在SOCKADDR中;
//加载命令行参数
lstrcpyA(szSmtpServerName,smtpserver);
lstrcpyA(szToAddr,to);
lstrcpyA(szFromAddr,来自);
//尝试初始化WinSock(1.1或更高版本)
if(WSAStartup(MAKEWORD(主版本、次版本和WSData))
{
printf(“\n找不到Winsock v%d.%d或更高版本”,主要版本,主要版本);
返回1;
}
//查找电子邮件服务器的IP地址。
lpHostEntry=gethostbyname(szSmtpServerName);
如果(!lpHostEntry)
{
printf(“\n找不到SMTP邮件服务器%s”,szSmtpServerName);
返回1;
}
//创建TCP/IP套接字,无特定协议
hServer=socket(PF_INET,SOCK_STREAM,0);
if(hServer==无效的_套接字)
{
printf(“\n无法打开邮件服务器套接字!”);
返回1;
}
//获取邮件服务端口
lpServEntry=getservbyname(“邮件”,0);
//如果未指定其他端口,请使用SMTP默认端口
如果(!lpServEntry)iProtocolPort=htons(IPPORT\u SMTP);
else iProtocolPort=lpServEntry->s_端口;
//设置套接字地址结构
SockAddr.sin_family=AF_INET;
SockAddr.sinu端口=iProtocolPort;
SockAddr.sin\u addr=*((LPIN\u addr)*lpHostEntry->h\u addr\u列表);
//连接插座
if(connect(hServer,(PSOCKADDR)和SockAddr,sizeof(SockAddr)))
{
printf(“\n连接到服务器套接字时出错!”);
返回1;
}
//从SMTP服务器接收初始响应
检查(recv(hServer,szBuffer,sizeof(szBuffer),0),“recv()回复”);
//发送HELO server.com
sprintf_s(szMsgLine,“HELO%s%s”,smtpserver,CRLF);
检查(send(hServer,szMsgLine,strlen(szMsgLine),0),“send()HELO”);
检查(recv(hServer,szBuffer,sizeof(szBuffer),0),“recv()HELO”);
//从以下地址发送邮件:
sprintf_s(szMsgLine,“邮件发件人:%s”,发件人,CRLF);
检查(发送(hServer,szMsgLine,strlen(szMsgLine),0),“发送()邮件自”);
检查(recv(hServer,szBuffer,sizeof(szBuffer),0),“recv()邮件发件人”);
char-buf[128],str[512];
char*pch;
memset(str,0,sizeof(str));
strcpy_s(str,to);
pch=strtok(str,“,”);//在“,”处分开电子邮件地址
while(pch!=NULL)
{
memset(buf,0,sizeof(buf));
//printf(“Buf:%s\n”,pch);
strcpy_s(buf,pch);
pch=strtok(空,“,”);
//将RCPT发送至:
sprintf_s(szMsgLine,“RCPT至:%s”,buf,CRLF);
检查(发送(hServer,szMsgLine,strlen(szMsgLine),0),“发送()RCPT到”);
检查(recv(hServer,szBuffer,sizeof(szBuffer),0),“recv()RCPT TO”);
}
//发送数据
sprintf_s(szMsgLine,“数据%s”,CRLF);
检查(发送(hServer,szMsgLine,strlen(szMsgLine),0),“发送()数据”);
检查(recv(hServer,szBuffer,sizeof(szBuffer),0),“recv()数据”);
//发送抄送
sprintf_s(szMsgLine,“抄送:%s%s”test@domain.com“,CRLF);
检查(发送(hServer,szMsgLine,strlen(szMsgLine),0),“发送()Cc”);
//发送主题
sprintf_s(szBuffer,“主题:%s\n”,主题);
检查(发送(hServer,szBuffer,strlen(szBuffer),0),“发送()主题”);
//寄自
sprintf_s(szBuffer,“发件人:%s\n”,“BIOS更新”);
检查(send(hServer,szBuffer,strlen(szBuffer),0),“send()From”);
//寄往
sprintf_s(szBuffer,“收件人:%s\n\n”,收件人);
检查(send(hServer,szBuffer,strlen(szBuffer),0),“send()To”);
//附加
sprintf_s(szMsgLine,“附件:%s%s”,“d:\\test.txt”,CRLF);//这不起作用
检查(发送(hServer,szMsgLine,strlen(szMsgLine),0),“发送()附件”);
sprintf_s(szMsgLine,“%s%s”,msg,CRLF);
检查(发送(hServer,szMsgLine,strlen(szMsgLine),0),“发送()消息行”);
//发送空行和句点
sprintf_s(szMsgLine,“%s.%s”,CRLF,CRLF);
检查(发送(hServer,szMsgLine,strlen(szMsgLine),0),“发送()结束消息”);
检查(recv(hServer,szBuffer,sizeof(szBuffer),0),“recv()结束消息”);
//退出
sprintf_s(szMsgLine,“退出%s”,CRLF);
检查(发送(hServer,szMsgLine,strlen(szMsgLine),0),“发送()退出”);
检查(recv(hServer,szBuffer,sizeof(szBuffer),0),“recv()退出”);
//报告消息已发送
printf(“\n邮件已发送!”);
//关闭服务器套接字并准备退出。
closesocket(hServer);
WSACleanup();
返回0;
}

谢谢

我建议您阅读一下SMTP协议

在过去,内容是UUENCODE的,仅将其嵌入带有UUENCODE头的电子邮件正文就足够了。我在这段时间里做了很多:)

据我所知,现在一切都使用哑剧。遵循Rup的链接(参见他的评论)或搜索互联网以了解MIME的功能。搜索互联网也会给你带来两件事:

  • 附件编码后MIME的外观示例,以及如何在套接字上发送
  • 您可以使用资源(库等)为您进行MIME编码,甚至可以将其放入套接字
  • 您还可以找到SMTP库来处理所有SMTP协议

    您还需要进一步了解套接字。您是否真的期望将
    附件:%s%s”、“d:\\test.txt”、CRLF
    写入套接字会导致系统打开文件并以某种方式将文件内容流式传输到套接字

    关于代码的旁注:

    为什么是CRLF?所有其他电子邮件头发送
    \n
    以终止一行。它是