📄 mysmtp.cpp
字号:
//MySmtp.cpp#include "MySmtp.h"#include <cstring>//using namespace std;MySmtp::MySmtp(){ m_port = 25; m_server = "smtp.126.com"; m_mailfrom = "EricCN@126.com"; m_addfile = FALSE; m_username = "RXJpY0NO"; m_password = "MjIxODA1OQ==";}//设置发信人地址int MySmtp::SetMailFrom(string mailfrom){ m_mailfrom = mailfrom; return 1;}//设置邮件正文int MySmtp::SetMailBody(string mailbody){ m_body = mailbody; return 1;}//设置邮件主题int MySmtp::SetSubject(string subject){ m_subject = subject; return 1;}//收件人地址,可以设置多个int MySmtp::SetMailTo(string mailto){ m_mailto.push_back(mailto); return 1;}//设置服务器地址int MySmtp::SetMailServer(string server){ m_server = server; return 1;}//设置附件路径int MySmtp::SetFilePath(string path){ m_filepath = path; m_addfile = TRUE; return 1;}//设置邮件端口int MySmtp::SetMailPort(string port){ m_port = atoi(port.c_str()); return 1;}string MySmtp::GetErr(){ return m_errmsg;}//get error message from responsestring MySmtp::GetError(string Response){ if(Response.find("220")) return "System status or system help reply"; if(Response.find("214")) return "Help Message"; if(Response.find("220")) return "Service is ready"; if(Response.find("221")) return "Service closing transmission channel"; if(Response.find("250")) return "Requested mail action okay, completed"; if(Response.find("251")) return "user not local: will forward to forward path"; if(Response.find("354")) return "Start mail input; end with .";}//bool MySmtp::CheckResponse(int type){ int code; char temp[3]; char buf[256]; for(int i = 0;i < 256;i++) buf[i] = '\0'; m_mysock.RecvData(buf); strncpy(temp,buf,3); code = atoi(temp); switch(type) { case CONNECTION_CHECK: if(code != 220) { m_errmsg = GetError(buf); return FALSE; } break; case HELLO_CHECK: if(code != 250) { m_errmsg = GetError(buf); return FALSE; } break; case LOGIN_CHECK: if(code != 334) { m_errmsg = GetError(buf); return FALSE; } break; case USERNAME_CHECK: if(code != 334) { m_errmsg = GetError(buf); return FALSE; } break; case PASSWORD_CHECK: if(code != 235) { m_errmsg = GetError(buf); return FALSE; } break; case MAIL_CHECK: if(code != 250) { m_errmsg = GetError(buf); return FALSE; } break; case RCPT_CHECK: if(code != 250) { m_errmsg = GetError(buf); return FALSE; } break; case DATA_START_CHECK: if(code != 354) { m_errmsg = GetError(buf); return FALSE; } break; case DATA_END_CHECK: if(code != 250) { m_errmsg = GetError(buf); return FALSE; } break; case QUIT_CHECK: if(code != 221) { m_errmsg = GetError(buf); return FALSE; } break; } return TRUE;}//根据上面已经设置的属性来发送邮件int MySmtp::SendMail(){ int i,len; char* temp; char* aatt = new char[0x400000]; char* batt = new char[0x555556]; Base64 base64; FILE* fp;//compute the data length len = m_mailto.size() + m_subject.size() + m_body.size() + 79;//init and connect,only try one time if(m_mysock.InitMySocket(m_server.c_str(),m_port) < 0) { //m_errmsg = m_mysock.GetErr(); CheckResponse(CONNECTION_CHECK); return -1; } CheckResponse(CONNECTION_CHECK);//send helo command for(i=0;i<3;i++) { m_mysock.SendData("helo localhost\r\n"); if(CheckResponse(HELLO_CHECK)) break; } if(i > 2) return -1;//send auth login command for(i=0;i<3;i++) { m_mysock.SendData("auth login\r\n"); if(CheckResponse(LOGIN_CHECK)) break; } if(i > 2) return -1;//send username m_username.append("\r\n"); for(i=0;i<3;i++) { m_mysock.SendData(m_username.c_str()); if(CheckResponse(USERNAME_CHECK)) break; } if(i > 2) return -1;//send password m_password.append("\r\n"); for(i=0;i<3;i++) { m_mysock.SendData(m_password.c_str()); if(CheckResponse(PASSWORD_CHECK)) break; } if(i > 2) return -1;//send mail from command for(i=0;i<3;i++) { m_mysock.SendData("mail from: <EricCN@126.com>\r\n"); if(CheckResponse(MAIL_CHECK)) break; } if(i > 2) return -1;//send rcpt to command temp = (char*)malloc(len); sprintf(temp,"rcpt to: <%s>\r\n",m_mailto[0].c_str()); for(i=0;i<3;i++) { m_mysock.SendData(temp); if(CheckResponse(RCPT_CHECK)) break; } if(i > 2) { delete temp; return -1; }//send data command for(i=0;i<3;i++) { m_mysock.SendData("data\r\n"); if(CheckResponse(DATA_START_CHECK)) break; } if(i > 2) return -1;//send data if(!m_addfile) { sprintf(temp,"To: %s\r\nFrom: EricCN@126.com\r\nSubject: %s\r\nDate: 2007-03-16\r\nX-Mailer: mymail\r\nMIME-Version: 1.0\r\nContent-Type: text/plain\r\n%s\r\n.\r\n", m_mailto[0].c_str(), m_subject.c_str(), m_body.c_str()); m_mysock.SendData(temp); }else { sprintf(temp,"From: EricCN@126.com\r\nTo: %s\r\nSubject: %s\r\nContent-Type: multipart/mixed; boundary=\"#BOUNDARY#\"\r\nMIME-Version: 1.0\r\nX-Mailer: mymail\r\n\r\n\r\n--#BOUNDARY#\r\nContent-Type: text/plain;\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\n%s \r\n\r\n\r\n--#BOUNDARY#\r\nContent-Disposition: attachment; filename=telnet\r\nContent-Type: application/x-executable-binary; name=telnet; \r\nContent-Transfer-Encoding: base64\r\n\r\n", m_mailto[0].c_str(), m_subject.c_str(), m_body.c_str()); m_mysock.SendData(temp);//对附件进行编码 fp = fopen(m_filepath.c_str(),"rb"); fseek(fp,0,2); len = ftell(fp); if(len > 0x400000) len = 0; rewind(fp); int rtn = fread(aatt,sizeof(char),len,fp); fclose(fp); len = base64.Encode(batt,aatt,len); m_mysock.SendData(batt,len); m_mysock.SendData("\r\n.\r\n"); delete aatt; delete batt; } delete temp; if(CheckResponse(DATA_END_CHECK)) return -1;//send quit command for(i=0;i<3;i++) { m_mysock.SendData("quit\r\n"); if(CheckResponse(QUIT_CHECK)); break; } if(i > 2) return -1; return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -