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