SOCKET メール送信




#include 
#include 
#include 


class CDrView : public CFormView
{

// アトリビュート
public:

// SOCKET
WSADATA wsaData;
LPHOSTENT lpHost;
SOCKET s;
SOCKADDR_IN sockadd;
...
..
.






// 1通目が届かない現象の対策
void CDrView::OnInitialUpdate(){
.
.
.
	InitSocket();
	closesocket(s);
	Sleep(400);
	WSACleanup();

..
.
.


}


// INIT.
void CDrView::InitSocket(){

	if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) {
		AfxMessageBox("WSAStartup err",MB_ICONSTOP);
		return;
	}

	theApp.ip="000.000.000.000"; // SMTP SERVER ADDRESS (theApp.ip=CString APP CLASS)

	lpHost = gethostbyname(theApp.ip);
	if (lpHost == NULL) {
		memset ( szStr,NULL,sizeof(szStr));
		wsprintf(szStr, "SMTP SERVER %sが見つかりません", theApp.ip);
		AfxMessageBox(szStr,MB_ICONSTOP);
		return;
	}

	s = socket(AF_INET, SOCK_STREAM, 0);
	if (s == INVALID_SOCKET) {
		AfxMessageBox("void CDrView::InitSocket() ソケットをオープンできません",MB_ICONSTOP);
		return;
	}

	sockadd.sin_family = AF_INET;
	sockadd.sin_port = htons(25); // SMTP PORT No
	sockadd.sin_addr = *((LPIN_ADDR)*lpHost->h_addr_list);

	if (connect(s, (PSOCKADDR)&sockadd, sizeof(sockadd))) {
		AfxMessageBox("void CDrView::InitSocket() connect error",MB_ICONSTOP);
		return;
	}

}


// メール送信
void CDrView::RiMailSend(int flg){
	// flg == 1(PCMAIL) flg==2 (携帯)
//AfxMessageBox("ST");

//	InitSocket();

	char sub[128];
	memset ( sub,NULL,sizeof(sub));
	sprintf(sub,"勤怠管理システム(%sのリマインド)",YeDay);

	CString ss1=Main.name + "様\r\n\r\n";
	ss1+= YeDay + "のシフトをお知らせさせて頂きます。\r\n";
	ss1+= Main.aria + " " + Main.tenpo + " " + Main.stm +"です。\r\n\r\n";
	ss1+= "上記シフトが入っております。\r\nよろしくお願いします。\r\n.\r\n";
						
	// HELO COMMAND SEND
	memset ( szStr,NULL,sizeof (szStr));
	sprintf (szStr,"HELO %s\r\n",theApp.ip);
	send(s, szStr, strlen(szStr), 0);

	// FROM COMMAND SEND  , FROM MAIL ADDRESS
	memset ( szStr,NULL,sizeof(szStr));
	sprintf (szStr,"MAIL FROM:<%s>\r\n",theApp.mailadd); // theApp.mailadd = APP CLASS CString
	send(s, szStr, strlen(szStr), 0);

	// TO COMMAND SEND , TO MAIL ADDRESS
	memset ( szStr,NULL,sizeof(szStr));
	sprintf (szStr,"RCPT TO:<%s>\r\n","testmail@testtest1111.ne.jp"); // SEND ADDRESS
	send(s, szStr, strlen(szStr), 0);

	// DATA COMMAND SEND
	memset ( szStr,NULL,sizeof(szStr));
	strcpy(szStr, "DATA\r\n");
	send(s, szStr, strlen(szStr), 0);

	// Mailer Name SEND
	memset ( szStr,NULL,sizeof(szStr));
	strcpy(szStr, "X-Mailer: KINTAI ReminderR1.00\r\n");
	send(s, szStr, strlen(szStr), 0);

	// Subject SEND
	memset ( szStr,NULL,sizeof(szStr));
	wsprintf(szStr, "Subject: %s \r\n", sub);
	send(s, szStr, strlen(szStr), 0);
	strcpy(szStr, "\r\n");
	send(s, szStr, strlen(szStr), 0);

	// 本文SEND
	memset ( szStr,NULL,sizeof(szStr));
	strcpy (szStr,ss1);
	send(s,szStr, strlen(szStr), 0);
	Sleep(1000); // SMTP SERVER WAIT. wait 入れないと送信出来ないことがある

	// メール送信 あと処理
	memset ( szStr,NULL,sizeof(szStr));
	strcpy (szStr,"quit\r\n");
	send(s,szStr, strlen(szStr), 0);

	closesocket(s);
	WSACleanup();
//	AfxMessageBox("ok");

// 改行は \r\n 本文終了は \r\n.\r\n で . だけの行を送信

}

受信メーラーによってはそのまま送っても漢字は化けないが
基本は文字コードをiso-2022-jpに変換して送る。
戻る