// WoodSMTP.h: interface for the CWoodSMTP class.
//
//////////////////////////////////////////////////////////////////////
                                  #if !defined(AFX_WOODSMTP_H__D9FEEB39_5D27_4FA4_8C55_1C5BABA9E47C__INCLUDED_)
#define AFX_WOODSMTP_H__D9FEEB39_5D27_4FA4_8C55_1C5BABA9E47C__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#ifndef RESPONSE_LEN
#define RESPONSE_LEN 1024
#endif#ifndef HEARD_LEN
#define HEARD_LEN 200
#endif#ifndef MAIL_LEN
#define MAIL_LEN 2000
#endif#ifndef TIME_OUT
#define TIME_OUT 2000
#endiftypedef struct MAILSERVER
{
char HOST[50];
char USER[50];
char PSW[50];
int socket;
}STRUCT_HOST;const int BASE64_MAXLINE = 76;
const char EOL[] = "\r\n";
const char BASE64_TAB[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz0123456789+/";class CWoodSMTP 
{public:
CWoodSMTP();
virtual ~CWoodSMTP();BOOL ConnectHost(char *szHost,char *szUser,char *szPsw);
BOOL SendTXT(char *szFrom,char *szRcpt,char *szContent);
BOOL SendMail(char *szFrom,char **szRcpt,char *szSubject,char *szContent);static int ANSIToBase64(const char *szInANSI, int nInLen, char *szOutBase64, int nOutLen);public:
STRUCT_HOST *mail_host;
};#endif // !defined(AFX_WOODSMTP_H__D9FEEB39_5D27_4FA4_8C55_1C5BABA9E47C__INCLUDED_)
// WoodSMTP.cpp: implementation of the CWoodSMTP class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "WoodSMTP.h"
#include <iostream.h>#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
 CWoodSMTP::CWoodSMTP()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
mail_host = new STRUCT_HOST;
}CWoodSMTP::~CWoodSMTP()
{
delete mail_host;
}BOOL CWoodSMTP::ConnectHost(char *szHost,char *szUser,char *szPsw)
{
int SockFD;
struct sockaddr_in ServAddr;
char HEADER[HEARD_LEN]="";LPHOSTENT pHost = gethostbyname(szHost);
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);//smtp 25
if(connect(SockFD, (struct sockaddr *)&ServAddr, sizeof(ServAddr))==SOCKET_ERROR)
{
return false;
}strcat(HEADER,"HELO LOCALHOST");
strcat(HEADER,EOL);strcat(HEADER,"AUTH LOGIN");
strcat(HEADER,EOL);
char Base64USER[100];
ANSIToBase64(szUser,strlen(szUser),Base64USER,0x555556);
strcat(HEADER,Base64USER);char Base64PSW[100];
ANSIToBase64(szPsw,strlen(szPsw),Base64PSW,0x555556);
strcat(HEADER,Base64PSW);if(send(SockFD,HEADER,strlen(HEADER),0)==SOCKET_ERROR)
{
return false;
}Sleep(TIME_OUT);char response_buf[RESPONSE_LEN];
int buf_len = recv(SockFD,response_buf,RESPONSE_LEN,0);
response_buf[buf_len] = '\0';if(strstr(response_buf,"235")==NULL)
{
return false;
}strcpy(mail_host->HOST,szHost);
strcpy(mail_host->USER,szUser);
strcpy(mail_host->PSW,szPsw);
mail_host->socket=SockFD;
return true;
}BOOL CWoodSMTP::SendMail(char *szFrom,char **szRcpt,char *szSubject,char *szContent)
{
return 0;
}
BOOL CWoodSMTP::SendTXT(char *szFrom,char *szRcpt,char *szContent)
{
char TXT_MAIL[MAIL_LEN]="";strcat(TXT_MAIL,"MAIL FROM: <");
strcat(TXT_MAIL,szFrom);
strcat(TXT_MAIL,">");
strcat(TXT_MAIL,EOL);
strcat(TXT_MAIL,"RCPT TO: <");
strcat(TXT_MAIL,szRcpt);
strcat(TXT_MAIL,">");
strcat(TXT_MAIL,EOL);strcat(TXT_MAIL,"DATA");
strcat(TXT_MAIL,EOL);strcat(TXT_MAIL,"X-WOODINF:");
strcat(TXT_MAIL,szContent);
strcat(TXT_MAIL,"X-WOODINF-END");strcat(TXT_MAIL,EOL);
strcat(TXT_MAIL,".");
strcat(TXT_MAIL,EOL);if(send(mail_host->socket,TXT_MAIL,strlen(TXT_MAIL),0)==SOCKET_ERROR)
{
return false;
}Sleep(100);
char response_buf[RESPONSE_LEN];
int buf_len = recv(mail_host->socket,response_buf,RESPONSE_LEN,0);
response_buf[buf_len] = '\0';
//AfxMessageBox(response_buf);
if(strstr(response_buf,"250")==NULL)
{
return false;
}
return true;
}int CWoodSMTP::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;
}
}

解决方案 »

  1.   

    报错为: Compiling...
    WoodSMTP.cpp
    Linking...
    WoodSMTP.obj : error LNK2001: unresolved external symbol "void * __cdecl operator new(unsigned int,char const *,int)" (??2@YAPAXIPBDH@Z)
    WoodSMTP.obj : error LNK2001: unresolved external symbol _WSAStartup@8
    WoodSMTP.obj : error LNK2001: unresolved external symbol _recv@16
    WoodSMTP.obj : error LNK2001: unresolved external symbol _send@16
    WoodSMTP.obj : error LNK2001: unresolved external symbol _connect@12
    WoodSMTP.obj : error LNK2001: unresolved external symbol _htons@4
    WoodSMTP.obj : error LNK2001: unresolved external symbol _socket@12
    WoodSMTP.obj : error LNK2001: unresolved external symbol _gethostbyname@4
    Debug/Smtp_dll.dll : fatal error LNK1120: 8 unresolved externals
    Error executing link.exe.
    Creating browse info file...Smtp_dll.dll - 9 error(s), 0 warning(s)
    这个编译可以通过, 但是就是不能生存DLL. 
    我还是个VC菜鸟, 请大家帮帮忙
      

  2.   

    在 stdafx.h 中
    #include <afxsock.h>
      

  3.   

    如果还不行,再加上
    #pragma comment(lib, "ws2_32.lib")
    从你的错误信息来看,是因为找不到WinSock相关的函数定义
      

  4.   

    加上#pragma comment(lib, "你的lib名字.lib")
      

  5.   

    我把 #include <afxsock.h> 这个加了.
    这个#pragma comment(lib, "ws2_32.lib") 加在了WoodSMTP.cpp里面 现在还有2个错:
    --------------------Configuration: Smtp_dll - Win32 Debug--------------------
    Compiling...
    WoodSMTP.cpp
    Linking...
    WoodSMTP.obj : error LNK2001: unresolved external symbol "void * __cdecl operator new(unsigned int,char const *,int)" (??2@YAPAXIPBDH@Z)
    Debug/Smtp_dll.dll : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.
    Creating browse info file...Smtp_dll.dll - 2 error(s), 0 warning(s)
      

  6.   

    我把 mail_host = new STRUCT_HOST; 这句话注释掉就没有错误了. 
    能告诉我为什么吗?
      

  7.   

    Debug版本重载了new操作符,你试试用Release版本进行编译