怎么实现发送邮件的功能啊
如题。。我研究了很久、。什么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);