用 SMTP 发送带验证带附件的邮件

    技术2022-05-11  114

    /************************************************************* *  smtp.cpp - Use SMTP to send an eMail with an Attachment and verify  * *  Copyright (C) 2001-2002 by ShadowStar.                                          * *  Use and modify freely.                                                                      * *  http://shadowstar.126.com/                                                               * ************************************************************* *///---------------------------------------------------------------------------

    #include <winsock2.h>#include <string.h>#include <stdio.h>

    const int  BASE64_MAXLINE = 76;const char EOL[] = "/r/n";const char BASE64_TAB[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"      "abcdefghijklmnopqrstuvwxyz0123456789+/";const char HEADER[] =  "HELO support.com/r/n"  //"AUTH LOGIN/r/n" //+ BASE64 USER + BASE64 PASS  "MAIL FROM: chinansl@support.com/r/n"  "RCPT TO: shadowstar@support.com/r/n"  "DATA/r/n"  "FROM: chinansl@support.com/r/n"  "TO: shadowstar@support.com/r/n"  "SUBJECT: this is a test/r/n"  "Date: 2002-5-14/r/n"  "X-Mailer: shadowstar's mailer/r/n"  "MIME-Version: 1.0/r/n"  "Content-type: multipart/mixed; boundary=/"#BOUNDARY#/"/r/n"  //"Content-Type: text/plain; charset=gb2312/r/n"  "/r/n";const char CONTENT[] =  "/r/n--#BOUNDARY#/r/n"  "Content-Type: text/plain; charset=gb2312/r/n"  "Content-Transfer-Encoding: quoted-printable/r/n"  "/r/n"  "/*************************************************************"  " *  smtp.cpp - Use SMTP to send an eMail with an Attachment and verify  *"  " *  Copyright (C) 2001-2002 by ShadowStar.                                          *"  " *  Use and modify freely.                                                                      *"  " *  http://shadowstar.126.com/                                                               *"  " *************************************************************"  " *//r/n"  "/r/n";const char ATT_HEADER[] =  "/r/n--#BOUNDARY#/r/n"  "Content-Type: application/octet-stream; name=smtp.exe/r/n"  "Content-Disposition: attachment; filename=smtp.exe/r/n"  "Content-Transfer-Encoding: base64/r/n"  "/r/n";

    //---------------------------------------------------------------------------int ANSIToBase64(const char *szInANSI, int nInLen, char *szOutBase64, int nOutLen);

    int main(int argc, char* argv[]){ WSADATA wsaData; int  SockFD; struct sockaddr_in ServAddr; char  buf[0x100]; int     x; FILE    *fp; char    *aatt = new char[0x400000]; char *batt = new char[0x555556];

     WSAStartup(MAKEWORD(2,2), &wsaData);

     LPHOSTENT pHost = gethostbyname("172.16.234.111"); SockFD = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); ServAddr.sin_family = AF_INET; ServAddr.sin_addr.s_addr = *(ULONG *)pHost->h_addr_list[0]; ServAddr.sin_port = htons(25);

     connect(SockFD, (struct sockaddr *)&ServAddr, sizeof(ServAddr)); //send HEADER send(SockFD, HEADER, strlen(HEADER), 0); //send CONTENT send(SockFD, CONTENT, strlen(CONTENT), 0); //send ATT_HEADER send(SockFD, ATT_HEADER, strlen(ATT_HEADER), 0); //read attachment fp = fopen(argv[0], "rb"); fseek(fp, 0, 2); x = ftell(fp); if (x > 0x400000)  x = 0; rewind(fp); fread(aatt, x, 1, fp); fclose(fp); x = ANSIToBase64(aatt, x, batt, 0x555556); //send base64 attachment send(SockFD, batt, x, 0);

     send(SockFD, "./r/n", strlen("./r/n"), 0);   //end send(SockFD, "QUIT/r/n", strlen("QUIT/r/n"), 0); //quit

     closesocket(SockFD); WSACleanup();

     delete []aatt; delete []batt; return 0;}//---------------------------------------------------------------------------int ANSIToBase64(const char *szInANSI, int nInLen, char *szOutBase64, int nOutLen){ //Input Parameter validation if ((szInANSI == NULL) || (nInLen == 0) || (szOutBase64 == NULL) || (nOutLen == 0))  return 0; if (nOutLen < (nInLen*4/3 + 1 + nInLen*4/3/BASE64_MAXLINE*2 + 1 + 4))  return 0;

     //Set up the parameters prior to the main encoding loop int nInPos  = 0; int nOutPos = 0; int nLineLen = 0; int c1, c2, c3; int i;

     // Get three characters at a time from the input buffer and encode them for (i=0; i<nInLen/3; ++i) {  //Get the next 2 characters  c1 = szInANSI[nInPos++] & 0xFF;  c2 = szInANSI[nInPos++] & 0xFF;  c3 = szInANSI[nInPos++] & 0xFF;

      //Encode into the 4 6 bit characters  szOutBase64[nOutPos++] = BASE64_TAB[c1 >> 2];  szOutBase64[nOutPos++] = BASE64_TAB[((c1 << 4) | (c2 >> 4)) & 0x3F];  szOutBase64[nOutPos++] = BASE64_TAB[((c2 << 2) | (c3 >> 6)) & 0x3F];  szOutBase64[nOutPos++] = BASE64_TAB[c3 & 0x3F];  nLineLen += 4;

      //Handle the case where we have gone over the max line boundary  if (nLineLen > BASE64_MAXLINE - 4)  {   szOutBase64[nOutPos++] = EOL[0];   szOutBase64[nOutPos++] = EOL[1];   nLineLen = 0;  } }

     // Encode the remaining one or two characters in the input buffer switch (nInLen % 3) {  case 0:  {   szOutBase64[nOutPos++] = EOL[0];   szOutBase64[nOutPos++] = EOL[1];   break;  }  case 1:  {   c1 = szInANSI[nInPos] & 0xFF;   szOutBase64[nOutPos++] = BASE64_TAB[(c1 & 0xFC) >> 2];   szOutBase64[nOutPos++] = BASE64_TAB[((c1 & 0x03) << 4)];   szOutBase64[nOutPos++] = '=';   szOutBase64[nOutPos++] = '=';   szOutBase64[nOutPos++] = EOL[0];   szOutBase64[nOutPos++] = EOL[1];   break;  }  case 2:  {   c1 = szInANSI[nInPos++] & 0xFF;   c2 = szInANSI[nInPos] & 0xFF;   szOutBase64[nOutPos++] = BASE64_TAB[(c1 & 0xFC) >> 2];   szOutBase64[nOutPos++] = BASE64_TAB[((c1 & 0x03) << 4) | ((c2 & 0xF0) >> 4)];   szOutBase64[nOutPos++] = BASE64_TAB[((c2 & 0x0F) << 2)];   szOutBase64[nOutPos++] = '=';   szOutBase64[nOutPos++] = EOL[0];   szOutBase64[nOutPos++] = EOL[1];   break;  }  default:  {   return 0;  } }

     szOutBase64[nOutPos] = 0;

     return nOutPos;}


    最新回复(0)