程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 調用默認的電子郵件程序發送EMail

調用默認的電子郵件程序發送EMail

編輯:關於VC++

示例代碼運行效果圖如下:

功能介紹:很多時候大家需要在程序中發送郵件,自己編又太麻煩,怎麼辦,呵呵,有現成的!

1、我們可以用ShellExecute函數簡單的調用默認的電子郵件程序:

ShellExecute(NULL,NULL,"mailto:[email protected]",NULL,NULL,SW_SHOW);

2、如果想實現復雜一點兒的功能,如添加多個收件人、主題、附件等,就可以調用系統的MAPI函數。具體的用法可以去查MSDN,都是以MAPI開頭的,如MAPILogon、MAPISendMail等。下面演示如何調用默認的郵件程序發送郵件,可以添加多個附件

部分關鍵代碼:

//必須包括 mapi.h 頭文件
#include "mapi.h"
/*********************************************************************
* 函數名稱:CSendEMailDlg::OnSendMapi
* 說明: 調用MAPI函數發送郵件。
* 作者: Geng
* 時間 : 2003-04-22 20:08:30
*********************************************************************/
void CSendEMailDlg::OnSendMapi()
{
    UpdateData(true);
    //裝入MAPI32.DLL動態庫
    HMODULE hMod = LoadLibrary("MAPI32.DLL");
    if (hMod == NULL)
    {
        AfxMessageBox(AFX_IDP_FAILED_MAPI_LOAD);
        return;
    }
    //獲取發送郵件的函數地址
    ULONG (PASCAL *lpfnSendMail)(ULONG, ULONG, MapiMessage*, FLAGS, ULONG);
    (FARPROC&)lpfnSendMail = GetProcAddress(hMod, "MAPISendMail");
    if (lpfnSendMail == NULL)
    {
        AfxMessageBox(AFX_IDP_INVALID_MAPI_DLL);
        return;
    }
    int nFileCount = m_list.GetCount();  //有多少個附件需要發送
    //分配內存保存附件信息 不能使用靜態數組,因為不知道要發送附件的個數
    MapiFileDesc* pFileDesc = (MapiFileDesc*)malloc(sizeof(MapiFileDesc) * nFileCount);
    memset(pFileDesc,0,sizeof(MapiFileDesc) * nFileCount);
    //分配內存保存附件文件路徑
    TCHAR* pTchPath = (TCHAR*)malloc(MAX_PATH * nFileCount);
    CString szText;
    for(int i = 0;i < nFileCount;i++)
    {
        TCHAR* p = pTchPath + MAX_PATH * i;
        m_list.GetText(i,szText);
        strcpy(p,szText);
        (pFileDesc + i)->nPosition = (ULONG)-1;
        (pFileDesc + i)->lpszPathName = p;
        (pFileDesc + i)->lpszFileName = p;
    }
    //收件人結構信息
    MapiRecipDesc recip;
    memset(&recip,0,sizeof(MapiRecipDesc));
    recip.lpszAddress   = m_szEmailMAPI.GetBuffer(0);
    recip.ulRecipClass = MAPI_TO;
    //郵件結構信息
    MapiMessage message;
    memset(&message, 0, sizeof(message));
    message.nFileCount   = nFileCount;             //文件個數
    message.lpFiles    = pFileDesc;             //文件信息
    message.nRecipCount  = 1;                 //收件人個數
    message.lpRecips    = &recip;               //收件人
    message.lpszSubject  = m_szSubject.GetBuffer(0);      //主題
    message.lpszNoteText  = m_szText.GetBuffer(0);       //正文內容
    //保存本程序窗口指針,因為發完郵件後要返回本程序的窗口
    CWnd* pParentWnd = CWnd::GetSafeOwner(NULL, NULL);
    //發送郵件
    int nError = lpfnSendMail(0, 0,&message, MAPI_LOGON_UI|MAPI_DIALOG, 0);
    if (nError != SUCCESS_SUCCESS && nError != MAPI_USER_ABORT
            && nError != MAPI_E_LOGIN_FAILURE)
    {
        AfxMessageBox(AFX_IDP_FAILED_MAPI_SEND);
    }
    //返回程序
    pParentWnd->SetActiveWindow();
    //不要忘了釋放分配的內存
    free(pFileDesc);
    free(pTchPath);
    FreeLibrary(hMod);
}

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved