bool CFileUploadFTP::SendAlarmMail(std::string file, uint32_t size, std::string recv_mail_addr)
{
const char* szServer = "smtp.126.com";
short nPort = 25;
int sockfd;
struct sockaddr_in server_addr;
struct hostent *host;
//取得主机IP地址
if((host=gethostbyname(szServer))==NULL)
{
logn_error(5,"gethostname error: [%s]", strerror(errno));
return false;
}
//建立SOCKET连接
if((sockfd=socket(AF_INET,SOCK_STREAM,0)) == -1)
{
logn_error(5,"Socket Error:[%s]>", strerror(errno));
return false;
}
// 客户程序填充服务端的信息
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(nPort);
server_addr.sin_addr=*((struct in_addr *)host->h_addr);
//客户程序发起连接请求
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
logn_error(5,"Connect Error:[%s]>", strerror(errno));
return false;
}
char szBuf[1024] = {0};
char buf[256] = {0};
char server[256] = {0};
gethostname(server,256);
strcpy(buf, "HELO ");
strcat(buf, szServer);
strcat(buf, " \r\n");
// Wait for a reply
recv(sockfd,szBuf,sizeof(szBuf)+1,0);
send(sockfd, buf, strlen(buf), 0);
recv(sockfd, szBuf, sizeof(szBuf), 0);
//发送准备登陆信息
send(sockfd, "AUTH LOGIN\r\n", strlen("AUTH LOGIN\r\n"), 0);
recv(sockfd, szBuf, sizeof(szBuf), 0);
//发送用户名和密码,必须用base64进行转码,对于126邮箱来说用户名是@前面的字符串
send(sockfd,"转码后的用户名\r\n", strlen("转码后的密码\r\n"),0);
recv(sockfd, szBuf, sizeof(szBuf),0);
send(sockfd,"WnlqXzIxNjU5Mw==\r\n", strlen("WnlqXzIxNjU5Mw==\r\n"), 0);
recv(sockfd, szBuf, sizeof(szBuf),0);
logn_info(5,"\nrecv login rerurn info:%s", szBuf);
//发送[发送邮件]的邮箱,该邮箱要与用户名一致,否则发送不成功
send(sockfd,"MAIL FROM: <xxxx@126.com>\r\n",strlen("MAIL FROM: <xxxx@126.com>\r\n"),0);
recv(sockfd, szBuf, sizeof(szBuf), 0);
//发送[接收邮件]的邮箱
char dat_buf[1024] = {0};
sprintf(dat_buf, "RCPT TO: <%s>\r\n", recv_mail_addr.c_str());
send(sockfd,dat_buf,strlen(dat_buf),0);
recv(sockfd, szBuf, sizeof(szBuf), 0);
//发送主题
//char mail_data[1024] = {0};
sprintf(dat_buf, "From: \"xxxx.126.com\"<xxxx@126.com>\r\nTo: %s\r\nSubject:file:[%s],size:[%d]\r\n", recv_mail_addr.c_str(), file.substr(12).c_str(), size);
//告诉邮件服务器,准备发送邮件内容
send(sockfd,"DATA\r\n", strlen("DATA\r\n"),0);
//发送邮件标题
send(sockfd,dat_buf, strlen(dat_buf),0);
//发送邮件内容
//send(sockfd,"hello 126\r\n", strlen("hello 126\r\n"),0);
//发送邮件结束
send(sockfd,"\r\n.\r\n", strlen("\r\n.\r\n"),0);
//接收邮件服务器返回信息
recv(sockfd,szBuf,sizeof(szBuf),0);
//发送结束会话标识
send(sockfd,"QUIT\r\n", strlen("QUIT\r\n"),0);
recv(sockfd,szBuf,sizeof(szBuf),0);
logn_info(5,"Data received QUIT: %s", szBuf);
close(sockfd);
return true;
}
原文:https://www.cnblogs.com/change5/p/14299377.html