首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

如何实现发送邮件的功能

2012-12-29 
怎么实现发送邮件的功能啊如题。。我研究了很久、。什么mstp、、、send发送根本不行啊。。。书上的源代码拿出来也不

怎么实现发送邮件的功能啊
如题。。我研究了很久、。什么mstp、、、send发送根本不行啊。。。书上的源代码拿出来也不行。。。求大神指教
[解决办法]


#include<windows.h>
#include<WinSock.h>

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include"resource.h"
#pragma  comment(lib, "ws2_32.lib")

//Base64编码转换表
char* const   pBASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

void OpenSocket(struct sockaddr* address, HWND Hwnd, SOCKET* socket_t);

void ASCIItoBASE64(char* buffer);//Base64编码函数

BOOL CALLBACK DlgMain(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(
  HINSTANCE hInstance,  // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,      // pointer to command line
  int nCmdShow          // show state of window
)
{
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgMain);
return 0;
}


BOOL CALLBACK DlgMain(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{

char MailAccount[100];
char PassWord[100]; 
    WORD VersionRequested;
char host_by_name[50] = "smtp.";
char* pstr = NULL;
struct hostent* hptr = NULL;
char IPBuffer[50];
DWORD  socket_ret;
char read_buffer[1500];
char Buffer[1500];
char HELO_Buffer[50]="HELO"; 
char MailFrom[100]="MAIL FROM:";
    char ToAddress[50];
char RCPT_TO_ADDR[100]="RCPT TO:";
    char Subject[50];
char MainText[500];
char Body[3000];

SOCKET socket_t = 0;
//int send_ret = 0;
int error_t = 0;
WSADATA m_wsadata;
struct sockaddr_in their_address = {0};

switch(message)
    {
case WM_INITDIALOG:
  //不能在此初始化WinSock
          
  

  //文件重定向,用来输出信息
//  if(freopen("output.txt", "w+", stdout) == NULL)
  //{
//  fprintf(stderr, "error redirecting stdout\n");
  //}

          
          
          
return TRUE;

    case WM_CLOSE:
        
            EndDialog(hwnd,0);
            
return TRUE;

case WM_COMMAND:
switch(LOWORD(wParam))
{
   //case IDC_LOGIN://登录按钮
    
                
                  //收件人邮箱
  //memset(Buffer, 0, 1500);


                 // strcat(RCPT_TO_ADDR, " ");
  //strcat(RCPT_TO_ADDR, "<");
  //strcat(RCPT_TO_ADDR, ToAddress);
  //strcat(RCPT_TO_ADDR, ">");
  //sprintf(Buffer, "%s\r\n", RCPT_TO_ADDR);
                  //send(socket_ret, Buffer, strlen(Buffer), 0);
  //memset(read_buffer, 0, 1500);
  //recv(socket_ret, read_buffer, 1500, 0);
  //printf("Send to Rec:",read_buffer);



                  

  //sprintf(Buffer,)
                  
  // send(socket_ret,)

//  return TRUE;
                  
   case IDOK://发送按钮

    GetDlgItemText(hwnd,IDC_ACCOUNT,MailAccount,100);
                 GetDlgItemText(hwnd,IDC_PASSWORD,PassWord,100);
 //GetDlgItemText(hwnd,IDC_TOADDRESS,ToAddress, 50);
 VersionRequested = MAKEWORD(2,2);
         WSAStartup(VersionRequested, &m_wsadata);
         memset(&their_address, 0, sizeof(their_address));
                 their_address.sin_family = AF_INET;
         their_address.sin_port = htons(25);//25号端口
                 
 pstr = strchr(MailAccount,'@');
 
 if(pstr == NULL)
 {
                    MessageBox(hwnd, TEXT("不合法用户名!"), TEXT("错误!"), MB_OK);
return FALSE;
 }
 
 pstr++;
 
 strcat(host_by_name, pstr);
// printf(pstr);
                 hptr  = gethostbyname(host_by_name);
 
 /*struct sockaddr_in {
                                   short   sin_family;
                                    u_short sin_port;
                                  struct  in_addr sin_addr;
                                    char    sin_zero[8];


 };*/
 
 
 memcpy(&their_address.sin_addr.S_un.S_addr, hptr->h_addr_list[0], hptr->h_length); 
                
                  memset(IPBuffer, 0, 50);
                 //SendMessage(hwnd, )
 sprintf(IPBuffer, "%d.%d.%d.%d",
                         their_address.sin_addr.S_un.S_un_b.s_b1, 
                         their_address.sin_addr.S_un.S_un_b.s_b2, 
                         their_address.sin_addr.S_un.S_un_b.s_b3, 
                          their_address.sin_addr.S_un.S_un_b.s_b4);
 
 their_address.sin_addr.S_un.S_addr = inet_addr(IPBuffer);
 
 SetDlgItemText(hwnd,IDC_MESSAGE, IPBuffer);
                  
 // Sleep(3000);
  //Connect mail SERVER 
                  OpenSocket((struct sockaddr*)&their_address,hwnd,&socket_t);
  
  
  memset(read_buffer, 0, sizeof(read_buffer));
                  recv(socket_t, read_buffer, 1500, 0) ;
  // MessageBox(hwnd, read_buffer, "提示", MB_OK);
                  //if connect fail  Sleep 2000ms  and reconnect
 while(recv(socket_ret, read_buffer, 1500, 0) == 0)
  {
                     SetDlgItemText(hwnd, IDC_MESSAGE, TEXT("ReConnect..."));
 Sleep(2000);
  OpenSocket((struct sockaddr *)&their_address,hwnd,&socket_t);
 memset(read_buffer, 0, sizeof(read_buffer));

  }
                  
  SetDlgItemText(hwnd, IDC_MESSAGE, TEXT("Connect compelet!"));
                  
                  //EHLO认证,不知道自己去了解smtp协议,这协议一点也不难
  //登录smtp server首先就要进行认证  然后才是用户名密码之类的
  memset(Buffer, 0, 1500);
  strcat(HELO_Buffer, " ");
  strcat(HELO_Buffer, host_by_name);
  strcat(HELO_Buffer, "\r\n");
  sprintf(Buffer, HELO_Buffer);
   send(socket_t, (const char*)Buffer, strlen(Buffer), 0);


                 

  //printf("%d", error_t);
  memset(read_buffer, 0, 1500);
  recv(socket_t, read_buffer, 1500, 0);
  //printf("HELO Rec:%s\n", read_buffer);
                  //error_t = WSAGetLastError ();
                  
                  //自动登录
  memset(Buffer, 0, 1500);
  sprintf(Buffer, "AUTH LOGIN\r\n");
  send(socket_t, Buffer, strlen(Buffer), 0);
  memset(read_buffer, 0, 1500);
  recv(socket_t, read_buffer, 1500, 0);
//  printf("Auth Login Receive:%s\n", read_buffer);

                  //发送用户名账号进行认证
  memset(Buffer, 0, 1500);
 // memset(encode_buffer, 0, 200);
  ASCIItoBASE64(MailAccount);
  sprintf(Buffer,"%s\r\n", MailAccount);
                  send(socket_t, Buffer, strlen(Buffer), 0);
  memset(read_buffer, 0, 1500);
  recv(socket_t, read_buffer, 1500, 0);
//  printf("User Login Receive:%s\n", read_buffer);

                  //发送密码进行认证
  memset(Buffer, 0, 1500);
  //memset(encode_buffer,0,200);
  ASCIItoBASE64(PassWord);
  sprintf(Buffer, "%s\r\n", PassWord);
  send(socket_t, Buffer, strlen(Buffer), 0);
  memset(read_buffer, 0, 1500);
  recv(socket_t, read_buffer, 1500, 0);
             //     printf("PassWord Rec:%s\n", read_buffer);

  //邮件来自于
  memset(Buffer, 0, 1500);
  strcat(MailFrom, " ");
  strcat(MailFrom, "<");
  GetDlgItemText(hwnd,IDC_ACCOUNT,MailAccount,100);
  strcat(MailFrom, MailAccount);
  strcat(MailFrom, ">");
  sprintf(Buffer, "%s\r\n", MailFrom);
  send(socket_t, Buffer, strlen(Buffer), 0);
  memset(read_buffer, 0, 1500);
  recv(socket_t, read_buffer, 1500, 0);
//  printf("Mail From Rec:%s\n", read_buffer);
                  

                  


我电脑上没有,在网上找了个,试了下,是可以的。

热点排行