第238章 受信メールのサブジェクトを表示する


今回は第234章の続きで、受信メールのサブジェクトと、Fromの 日本語を表示するように改良します。



メニューの「ファイル」「受信」を選択すると、リストビューに 届いているメールの一覧が表示されます。読みたいメールの件名を クリックすると下半分のエディットコントロールにメールの内容が 表示されます。また、「差出人」の日本語部分もきちんと表示されます。 「日付」「サイズ」はヘッダに記載されているものをそのまま表示しています。



まずは、骨組み?を修正しなくてはいけません。メインウィンドウの プロシージャでWM_CREATEメッセージが来たら、リストビュー、ステータスバー、 エディットコントロールを作ります。リストビューが追加になるので INITCOMMONCONTROLSEX構造体のdwICCメンバにもICC_LISTVIEW_CLASSESを 追加するのを忘れないでください。

メニューから「受信」が選択されたとき、MyRcv関数を呼ぶのは今までと 同じです。そして、今まではMyRcv関数でメールの内容表示まで行ってきました。 今回は、POP3に接続してから「TOP」コマンドを送りヘッダを取得します。 これをリストビューに表示してこの関数は戻ります。

TOP n i

nには何番のメールかを指定します。iにはヘッダの後何行まで取得するかを 指定します。これを0にするとヘッダのみが取得できます。TOPコマンドを 1度送ると最初に「+OK message follows」という返事が来て、その後ヘッダ部分が 送られてきます。これから必要なところを抜き出してリストビューに 表示します。これを到着しているメールの数だけ繰り返します。 リストビューにすべて表示したら、接続を切ります。

一方リストビューの「件名」がクリックされたら(当然通知メッセージを捕まえます)、 POP3に接続して、クリックされた アイテム番号を取得して、「RETR」コマンドを送ります。 内容をエディットコントロールに表示したら接続を切ります。

いちいち接続を切ったりするのは無駄なように思われるかもしれませんが この方が安全です。

では、プログラムを見てみましょう。

// mail05.rcの一部 ///////////////////////////////////////////////////////////////////////////// // // Menu // MYMENU MENU DISCARDABLE BEGIN POPUP "ファイル(&F)" BEGIN MENUITEM "送信(&S)...", IDM_SEND MENUITEM "受信(&R)...", IDM_RCV MENUITEM SEPARATOR MENUITEM "終了(&X)...", IDM_END END POPUP "オプション(&O)" BEGIN MENUITEM "SMTPの設定(&S)...", IDM_SETSMTP MENUITEM "POP3の設定(&P)...", IDM_SETPOP END END ///////////////////////////////////////////////////////////////////////////// // // Dialog // MYDLG DIALOG DISCARDABLE 0, 0, 187, 53 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "文字列入力" FONT 9, "MS Pゴシック" BEGIN EDITTEXT IDC_EDIT1,7,7,173,20,ES_AUTOHSCROLL DEFPUSHBUTTON "OK",IDOK,7,32,50,14 PUSHBUTTON "キャンセル",IDCANCEL,130,32,50,14 END MYSETDLG DIALOG DISCARDABLE 0, 0, 187, 89 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "設定" FONT 9, "MS Pゴシック" BEGIN EDITTEXT IDC_EDIT1,78,7,102,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT2,78,25,102,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT3,78,43,102,12,ES_AUTOHSCROLL DEFPUSHBUTTON "OK",IDOK,27,68,50,14 PUSHBUTTON "キャンセル",IDCANCEL,103,68,50,14 LTEXT "SMTPアドレス",IDC_STATIC,7,7,41,8 LTEXT "差出人メールアドレス",IDC_STATIC,7,29,63,8 LTEXT "返信",IDC_STATIC,7,47,15,8 END MYPOPDLG DIALOG DISCARDABLE 0, 0, 158, 77 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "POP3設定" FONT 9, "MS Pゴシック" BEGIN EDITTEXT IDC_EDIT1,53,7,98,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT2,53,22,98,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT3,53,37,98,12,ES_PASSWORD | ES_AUTOHSCROLL DEFPUSHBUTTON "OK",IDOK,7,56,50,14 PUSHBUTTON "キャンセル",IDCANCEL,101,56,50,14 LTEXT "POP3サーバー",IDC_STATIC,7,11,44,8 LTEXT "ユーザー名",IDC_STATIC,7,26,35,8 LTEXT "パスワード",IDC_STATIC,7,41,32,8 END MYNEWMAIL DIALOG DISCARDABLE 0, 0, 187, 187 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "新規メール" FONT 9, "MS Pゴシック" BEGIN EDITTEXT IDC_EDIT1,43,7,137,13,ES_AUTOHSCROLL EDITTEXT IDC_EDIT2,43,25,137,13,ES_AUTOHSCROLL EDITTEXT IDC_EDIT3,7,47,173,110,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN | WS_VSCROLL | WS_HSCROLL DEFPUSHBUTTON "送信",IDOK,7,166,50,14 PUSHBUTTON "取り消し",IDCANCEL,130,166,50,14 LTEXT "あて先",IDC_STATIC,7,7,20,8 LTEXT "件名",IDC_STATIC,7,25,15,8 END

第章のリソース・スクリプトとほとんど同じですが、メニューの 「送信」のシンボルをIDM_SENDに変更しました。(この方が内容と一致する)

// mail05.cpp #ifndef STRICT #define STRICT #endif #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #define ID_EDIT 100 #define ID_STATUS 101 #include <windows.h> #include <winsock2.h> #include <windowsx.h> #include <commctrl.h> #include <stdio.h> #include <stdlib.h> #include <mbstring.h> #include "resource.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyDlgProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MySettingProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyPopSetProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK MyNewMailProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); void MySnd(HWND, char *, char *, char *); void MyRcv(HWND, HWND, HWND, HWND); int GetMailSize(char *); void MyJisToSJis(char *, char *); void MySJisToJis(char *, char *); void GetSubject(char *, char *); void GetFrom(char *, char *); void GetDate(char *, char *); void GetString(char *, char *); void decode(char *, char *); char charconv(char); void InsertColumn(HWND); void InsertItem(HWND, int, int, char *); void ShowContents(HWND, HWND, HWND, int); void MyPopConnect(HWND, HWND); void MyPopDisconnect(HWND); char szClassName[] = "mail05"; //ウィンドウクラス char szStr[1024], szStrRcv[1024 * 50], szResult[1024 * 50]; char szServerName[256], szFrom[256], szReplyTo[256];//SMTP char szPopServer[256], szUserName[64], szPass[64];//POP3 HINSTANCE hInst; SOCKET s; //ソケット(POP3用) BOOL bPOP = NULL; //POP3接続中かどうか

MyRcv関数の引数が変更になりました。また、いくつかの 自作関数が増えました。グローバル変数も増えました。

WinMain, InitApp, InitInstanceの各関数に変更はありません。

//ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id, iClickNo; static HWND hEdit, hStatus, hList; INITCOMMONCONTROLSEX ic; static int iStatusWy; RECT rc; DWORD dwStyle; LPNMHDR lpnmhdr; LPNMLISTVIEW lpnmlv; switch (msg) { case WM_CREATE: ic.dwSize = sizeof(INITCOMMONCONTROLSEX); ic.dwICC = ICC_BAR_CLASSES | ICC_LISTVIEW_CLASSES; InitCommonControlsEx(&ic); hEdit = CreateWindowEx(0, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL, 0, 0, 0, 0, hWnd, (HMENU)ID_EDIT, hInst, NULL); hList = CreateWindowEx(0, WC_LISTVIEW, "", WS_CHILD | WS_VISIBLE | WS_BORDER | LVS_REPORT, 0, 0, 0, 0, hWnd, (HMENU)100, hInst, NULL); dwStyle = ListView_GetExtendedListViewStyle(hList); dwStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP; ListView_SetExtendedListViewStyle(hList, dwStyle); InsertColumn(hList); hStatus = CreateStatusWindow(WS_CHILD | WS_VISIBLE, "", hWnd, ID_STATUS); GetWindowRect(hStatus, &rc); iStatusWy = rc.bottom - rc.top; break; case WM_SIZE: MoveWindow(hList, 5, 5, LOWORD(lp)-10, (HIWORD(lp) - iStatusWy) / 2 - 10, TRUE); MoveWindow(hEdit, 0, (HIWORD(lp) - iStatusWy) / 2, LOWORD(lp), (HIWORD(lp) - iStatusWy) / 2, TRUE); SendMessage(hStatus, WM_SIZE, wp, lp); break; case WM_NOTIFY: lpnmhdr = (LPNMHDR)lp; if (lpnmhdr->code == NM_CLICK) { lpnmlv = (LPNMLISTVIEW)lp; iClickNo = lpnmlv->iItem + 1; if (iClickNo == 0) { MessageBox(hWnd, "アイテムのないところをクリックしても無効です", "Error", MB_OK); break; } MyPopConnect(hWnd, hStatus); ShowContents(hEdit, hStatus, hList, iClickNo); MyPopDisconnect(hStatus); } break; case WM_COMMAND: switch (LOWORD(wp)) { case IDM_END: SendMessage(hWnd, WM_CLOSE, 0, 0); break; case IDM_SETSMTP: DialogBox(hInst, "MYSETDLG", hWnd, (DLGPROC)MySettingProc); break; case IDM_SETPOP: DialogBox(hInst, "MYPOPDLG", hWnd, (DLGPROC)MyPopSetProc); break; case IDM_SEND: DialogBoxParam(hInst, "MYNEWMAIL", hWnd, (DLGPROC)MyNewMailProc, (LPARAM)hStatus); break; case IDM_RCV: MyRcv(hWnd, hEdit, hStatus, hList); break; } break; case WM_CLOSE: id = MessageBox(hWnd, "終了してもよいですか", "終了確認", MB_YESNO | MB_ICONQUESTION); if (id == IDYES) { DestroyWindow(hStatus); DestroyWindow(hEdit); DestroyWindow(hList); DestroyWindow(hWnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; }

WM_CREATEメッセージが来たら、リストビューも作るようにしました。 リストビューの拡張スタイルについては 第198章を参照してください。

WM_SIZEメッセージが来たら、リストビュー、エディットコントロール、 ステータスバーの大きさ、位置を調整します。

WM_NOTIFYメッセージでリストビューのクリックを知ります。 クリックされたらPOP3に接続して、何番目のメールかをShowContents関数 に知らせ、内容を表示後、接続を切ります。

メニューが選択された時の場合分けで、今まではIDM_CONNECTだったのを、IDM_SEND に変更しました。また、IDM_RCVが選択されたとき呼び出されるMyRcv関数の 引数が変更になっているので注意してください。

終了時に親ウィンドウの子供であるhStatus, hEdit, hListを破棄するようにしました。 (自分で破棄しなくても自動的に破棄してくれるので、今まで通りでも問題ありません)

MySnd, MyDlgProc, MySettingProc, MyPopSetProcの各関数に変更はありません。

void MyRcv(HWND hWnd, HWND hEdit, HWND hStatus, HWND hList) { int iNo, iNOofMail; char *token, szSubject[1024], szBuf[1024], szFrom[128], szSize[32], szDate[32], szCopy[1024 * 50]; Edit_SetText(hEdit, ""); MyPopConnect(hWnd, hStatus); strcpy(szStr, "STAT\r\n"); send(s, szStr, strlen(szStr), 0); memset(szStrRcv, '\0', sizeof(szStrRcv)); recv(s, szStrRcv, sizeof(szStrRcv), 0); token = strtok(szStrRcv, " "); token = strtok(NULL, " "); iNOofMail = atoi(token); ListView_DeleteAllItems(hList); for (iNo = 1; iNo <= iNOofMail; iNo++) { wsprintf(szBuf, "現在第%d番目のヘッダ情報取得中", iNo); SendMessage(hStatus, SB_SETTEXT,(WPARAM)(0 | 0), (LPARAM)szBuf); //TOPコマンドを送ってヘッダを取得する wsprintf(szStr, "TOP %d 0\r\n", iNo); send(s, szStr, strlen(szStr), 0); memset(szStrRcv, '\0', sizeof(szStrRcv)); recv(s, szStrRcv, sizeof(szStrRcv), 0);//1行読み飛ばし recv(s, szStrRcv, sizeof(szStrRcv), 0); memset(szSubject, '\0', sizeof(szSubject)); memset(szBuf, '\0', sizeof(szBuf)); memset(szFrom, '\0', sizeof(szFrom)); memset(szDate, '\0', sizeof(szDate)); strcpy(szCopy, szStrRcv); GetSubject(szCopy, szBuf); GetString(szBuf, szSubject); InsertItem(hList, iNo - 1, 0, szSubject); memset(szCopy, '\0', sizeof(szCopy)); strcpy(szCopy, szStrRcv); GetFrom(szCopy, szFrom); InsertItem(hList, iNo - 1, 1, szFrom); strcpy(szCopy, szStrRcv); GetDate(szCopy, szDate); InsertItem(hList, iNo - 1, 2, szDate); wsprintf(szBuf, "LIST %d\r\n", iNo); send(s, szBuf, strlen(szBuf), 0); memset(szStrRcv, '\0', sizeof(szStrRcv)); recv(s, szStrRcv, sizeof(szStrRcv), 0); wsprintf(szSize, "%d", GetMailSize(szStrRcv)); InsertItem(hList, iNo - 1, 3, szSize); } MyPopDisconnect(hStatus); return; }

POP3接続はMyPopConnect関数、切断はMyPopDisconnect関数に 任せることにしました。

STATコマンドで到着しているメールの数を調べて、その分だけ ヘッダを調べてリストビューに表示します。

GetMailSize, MyJisToSJis, MyNewMailProc, MySJisToJisの各関数に変更はありません。

void GetSubject(char *szStrRcv, char *szSubject) { BOOL bCopy = FALSE; char *token; token = strtok(szStrRcv, "\r\n"); while (token != NULL) { if (strstr(token, "Subject:") == token) { strcpy(szSubject, token + 9); token = strtok(NULL, "\r\n"); while (strstr(token, ":") == NULL) { strcat(szSubject, token); token = strtok(NULL, "\r\n"); } } token = strtok(NULL, "\r\n"); } return; }

szStrRcvからサブジェクトの内容を取り出す関数です。ヘッダでは サブジェクトが複数行にまたがることがよくあるので注意が必要です。 また、この関数が実行されるとszStrRcvは壊れているので注意してください。

void GetFrom(char *szStr, char *szFrom) { char *token; char szBuf[1024]; token = strtok(szStr, "\r\n"); while (token != NULL) { if (strstr(token, "From:") != NULL) { strcpy(szBuf, token + 5); GetString(szBuf, szFrom); } token = strtok(NULL, "\r\n"); } return; }

szStrから「From: ***」を含む行を抽出して、***部分をszFromに書き写す関数です。 この場合もszStrが壊れるので注意してください。

void GetDate(char *szStrRcv, char *szDate) { char *token; token = strtok(szStrRcv, "\r\n"); while (token != NULL) { if (strstr(token, "Date:") == token) { strcpy(szDate, token + 5); } token = strtok(NULL, "\r\n"); } return; }

szStrRcvから「Date: ***」を含む行を抽出して***部分を szDateに書き写す関数です。

void GetString(char *szOrg, char *szResult) { char *token; char szBuf[1024], szBuf2[1024]; int len, mod; BOOL bCopy = TRUE; //?をコピーしてよいか token = strtok(szOrg, "=\r\n\t"); while (token != NULL) { if (strstr(token, "?ISO-2022-JP?B?") != token && strstr(token, "?iso-2022-jp?B?") != token) { if (strcmp(token, "?") != 0 && bCopy == TRUE) { MyJisToSJis(token, szBuf); strcat(szResult, szBuf); } } else { strcpy(szBuf, token + 15); if (szBuf[strlen(szBuf) - 1] == '?') szBuf[strlen(szBuf) - 1] = '='; len = strlen(szBuf); mod = len % 4; switch (mod) { case 1: strcat(szBuf, "==="); bCopy = FALSE; break; case 2: strcat(szBuf, "=="); bCopy = FALSE; break; case 3: strcat(szBuf, "="); bCopy = FALSE; break; } decode(szBuf, szBuf2); MyJisToSJis(szBuf2, szBuf); strcat(szResult, szBuf); } bCopy = TRUE; token = strtok(NULL, "=\r\n\t"); } return; }

これは、第236章で作ったものを流用しています。

void decode(char *lpszStr, char *lpszResult) { int len, i, iR; char a1, a2, a3, a4; len = strlen(lpszStr); i = 0; iR = 0; while (1) { if (i >= len) break; a1 = charconv(lpszStr[i]); a2 = charconv(lpszStr[i+1]); a3 = charconv(lpszStr[i+2]); a4 = charconv(lpszStr[i+3]); lpszResult[iR] = (a1 << 2) + (a2 >>4); lpszResult[iR + 1] = (a2 << 4) + (a3 >>2); lpszResult[iR + 2] = (a3 << 6) + a4; i += 4; iR += 3; } return; } char charconv(char c) { char str[256]; if (c >= 'A' && c <= 'Z') return (c - 'A'); if (c >= 'a' && c <= 'z') return (c - 'a' + 0x1a); if (c >= '0' && c <= '9') return (c - '0' + 0x34); if (c == '+') return 0x3e; if (c == '/') return 0x3f; if (c == '=') return '\0'; wsprintf(str, "不正な文字[%c]を検出しました", c); MessageBox(NULL, str, "Error", MB_OK); return '\0'; }

この二つの関数も第236章からの流用です。

void InsertColumn(HWND hList) { LVCOLUMN lvcol; lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvcol.fmt = LVCFMT_LEFT; lvcol.cx = 200; lvcol.pszText = "件名"; lvcol.iSubItem = 0; ListView_InsertColumn(hList, 0, &lvcol); lvcol.cx = 50; lvcol.pszText = "差出人"; lvcol.iSubItem = 1; ListView_InsertColumn(hList, 1, &lvcol); lvcol.cx = 100; lvcol.pszText = "日付"; lvcol.iSubItem = 2; ListView_InsertColumn(hList, 2, &lvcol); lvcol.cx = 100; lvcol.pszText = "サイズ"; lvcol.iSubItem = 3; ListView_InsertColumn(hList, 3, &lvcol); return; }

リストビューに「件名」「差出人」などのカラムを作る関数です。

従来のLV_COLUMN構造体はLVCOLUMNに変更になっているので 注意してください。

void InsertItem(HWND hList, int iItemNo, int iSubNo, char *lpszText) { LVITEM item; memset(&item, 0, sizeof(LVITEM)); item.mask = LVIF_TEXT; item.pszText = lpszText; item.iItem = iItemNo; item.iSubItem = iSubNo; if (iSubNo == 0) ListView_InsertItem(hList, &item); else ListView_SetItem(hList, &item); return; }

リストビューにアイテムやサブアイテムを加える関数です。

従来のLV_ITEM構造体はLVITEM構造体に変更になったので注意してください。

void ShowContents(HWND hEdit, HWND hStatus, HWND hList, int iClickNo) { int iMailSize, iGetSize; char *lpszStr; HGLOBAL hMem; Edit_SetText(hEdit, ""); wsprintf(szStr, "LIST %d\r\n", iClickNo); send(s, szStr, strlen(szStr), 0); memset(szStrRcv, '\0', sizeof(szStr)); recv(s, szStrRcv, sizeof(szStrRcv), 0); SendMessage(hStatus, SB_SETTEXT, (WPARAM)(0 | 0), (LPARAM)szStrRcv); iMailSize = GetMailSize(szStrRcv); iGetSize = 0; hMem = GlobalAlloc(GHND, iMailSize + 1024); if (hMem == NULL) { MessageBox(NULL, "メモリを確保できません", "Error", MB_OK); MyPopDisconnect(hStatus); closesocket(s); WSACleanup(); return; } lpszStr = (char *)GlobalLock(hMem); wsprintf(szStr, "RETR %d\r\n", iClickNo); send(s, szStr, strlen(szStr), 0); memset(szStrRcv, '\0', sizeof(szStrRcv)); iGetSize += recv(s, szStrRcv, sizeof(szStrRcv), 0); while (iMailSize >= iGetSize) { memset(szStrRcv, '\0', sizeof(szStrRcv)); iGetSize += recv(s, szStrRcv, sizeof(szStrRcv), 0); MyJisToSJis(szStrRcv, szResult); Edit_GetText(hEdit, lpszStr, iMailSize + 1024); strcat(lpszStr, szResult); Edit_SetText(hEdit, lpszStr); } GlobalUnlock(hMem); if (GlobalFree(hMem)) { MessageBox(NULL, "メモリの開放に失敗しました", "Error", MB_OK); } return; }

iClickNo番のメールの内容をエディットコントロールに表示する関数です。 今までのMyRcv関数の一部です。

void MyPopConnect(HWND hWnd, HWND hStatus) { WSADATA wsaData; LPHOSTENT lpHost; SOCKADDR_IN sockadd; if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) { MessageBox(hWnd, "エラーです", "Error", MB_OK); return; } while (strcmp(szPopServer, "") == 0 || strcmp(szUserName, "") == 0 || strcmp(szPass, "") == 0) { MessageBox(hWnd, "POP3の設定を行ってください。", "注意", MB_OK); DialogBox(hInst, "MYPOPDLG", hWnd, (DLGPROC)MyPopSetProc); } lpHost = gethostbyname(szPopServer); if (lpHost == NULL) { wsprintf(szStr, "%sが見つかりません", szPopServer); MessageBox(hWnd, szStr, "Error", MB_OK); return; } s = socket(PF_INET, SOCK_STREAM, 0); if (s == INVALID_SOCKET) { MessageBox(hWnd, "ソケットをオープンできません", "Error", MB_OK); return; } sockadd.sin_family = AF_INET; sockadd.sin_port = htons(110);//POP3のポートは110番 sockadd.sin_addr = *((LPIN_ADDR)*lpHost->h_addr_list); if (connect(s, (PSOCKADDR)&sockadd, sizeof(sockadd))) { MessageBox(hWnd, "サーバーソケットに接続失敗", "Error", MB_OK); closesocket(s); WSACleanup(); return; } memset(szStrRcv, '\0', sizeof(szStrRcv)); recv(s, szStrRcv, sizeof(szStrRcv), 0); SendMessage(hStatus, SB_SETTEXT, (WPARAM)(0 | 0), (LPARAM)szStrRcv); wsprintf(szStr, "USER %s\r\n", szUserName); send(s, szStr, strlen(szStr), 0); memset(szStrRcv, '\0', sizeof(szStrRcv)); recv(s, szStrRcv, sizeof(szStrRcv), 0); SendMessage(hStatus, SB_SETTEXT, (WPARAM)(0 | 0), (LPARAM)szStrRcv); wsprintf(szStr, "PASS %s\r\n", szPass); send(s, szStr, strlen(szStr), 0); memset(szStrRcv, '\0', sizeof(szStrRcv)); recv(s, szStrRcv, sizeof(szStrRcv), 0); SendMessage(hStatus, SB_SETTEXT, (WPARAM)(0 | 0), (LPARAM)szStrRcv); if (strstr(szStrRcv, "0 message") != NULL) { MessageBox(hWnd, "メッセージはありません", "No Message", MB_OK); return; } bPOP = TRUE; return; }

POP3に接続する関数です。

void MyPopDisconnect(HWND hStatus) { strcpy(szStr, "QUIT\r\n"); send(s, szStr, strlen(szStr), 0); memset(szStrRcv, '\0', sizeof(szStrRcv)); recv(s, szStrRcv, sizeof(szStrRcv), 0); SendMessage(hStatus, SB_SETTEXT, (WPARAM)(0 | 0), (LPARAM)szStrRcv); closesocket(s); WSACleanup(); bPOP = FALSE; return; }

POP3から切断する関数です。

さて、今回の変更、追加ですこしメーラー風になってきましたが まだまだ不備な点が多々あります。いろいろ改良してみてください。


[SDK第3部 Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 03/Nov/1999 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。