Exemple #1
0
BOOL SendMail( HWND hWnd, char *pszTo, char *pszSubject )
{
	HINSTANCE hinstMapi32 = ::LoadLibraryA("MAPI32.DLL");
	if ( !hinstMapi32 ) return FALSE;

	ULONG (PASCAL *lpfnSendMail)(ULONG, ULONG, MapiMessage*, FLAGS, ULONG);
	(FARPROC&)lpfnSendMail = GetProcAddress(hinstMapi32, "MAPISendMail");
	if (lpfnSendMail == NULL)
	{
		FreeLibrary( hinstMapi32 );
		return FALSE;
	}

	MapiRecipDesc mapird = { 0, MAPI_TO, pszTo, 0, 0,0 };

	MapiMessage message;
	memset(&message, 0, sizeof(message));
	message.lpszSubject = pszSubject;
	message.nRecipCount = 1;
	message.lpRecips = &mapird;

	// Function lpfnSendMail is really MAPISendMail, but we can link
	//  MAPISendMail in MFC, so we must load it from MAPI32.DLL.
	int nError = lpfnSendMail(0, (ULONG)hWnd,//(ULONG)this->GetSafeHwnd(),
		&message, MAPI_LOGON_UI|MAPI_DIALOG, 0);

	FreeLibrary( hinstMapi32 );

	SetForegroundWindow( hWnd );

	return nError==SUCCESS_SUCCESS;
}
Exemple #2
0
BOOL CSSD::SendMail(CString email, CString attachmentfile)
{
	HMODULE hMod=LoadLibrary("MAPI32.DLL"); 
	if(hMod == NULL) 
		return FALSE;
	
	try
	{
		ULONG (PASCAL *lpfnSendMail) (ULONG, ULONG, MapiMessage*, FLAGS, ULONG); 
		(FARPROC &)lpfnSendMail= GetProcAddress(hMod, "MAPISendMail"); 
		if(lpfnSendMail == NULL) 
			throw -1;
		
		MapiFileDesc attachment= 	{ 
			0,				// ulReserved, must be 0 
			0,				// no flags; this is a data file 
			(ULONG) - 1,	// position not specified 
			attachmentfile.GetBuffer(0),		// pathname, if original filename is NULL, this is the filename 
			NULL,			// original filename 
			NULL 
		}; // MapiFileTagExt unused 
		
		CString szUser = email;
		szUser = szUser.Left(szUser.Find('@'));
		MapiRecipDesc recip={ 0, MAPI_TO, szUser.GetBuffer(0), email.GetBuffer(0), 0, NULL }; 
		
		MapiMessage message= { 
			0,		// reserved, must be 0 
			"forkey", // subject 
			"send this mail for key.", // note text 
			NULL,	// NULL = interpersonal message 
			NULL,	// no date; MAPISendMail ignores it 
			NULL,	// no conversation ID 
			0L,		// no flags, MAPISendMail ignores it 
			NULL,	// no originator, this is ignored too 
			1,		// recipients 
			&recip, // recipient array 
			1,		// one attachment 
			&attachment // the attachment structure 
		}; 
		
		int nError=lpfnSendMail(0, 0, &message, MAPI_LOGON_UI | MAPI_DIALOG, 0); 
		// done before the MAPI call. 
		if(nError != SUCCESS_SUCCESS && nError != MAPI_USER_ABORT && nError != MAPI_E_LOGIN_FAILURE)
			throw -2;
	}
	catch (int) {
	}

	FreeLibrary(hMod);
	return TRUE;
}
Exemple #3
0
void CDocument::OnFileSendMail()
{
    ASSERT_VALID(this);
    ASSERT(_afxIsMailAvail);   // update handler always gets called first

    CWaitCursor wait;

    _AFX_MAIL_STATE* pMailState = _afxMailState;
    if (pMailState->m_hInstMail == NULL)
        pMailState->m_hInstMail = ::LoadLibraryA("MAPI32.DLL");

    if (pMailState->m_hInstMail == NULL)
    {
        AfxMessageBox(AFX_IDP_FAILED_MAPI_LOAD);
        return;
    }
    ASSERT(pMailState->m_hInstMail != NULL);

    ULONG (PASCAL *lpfnSendMail)(ULONG, ULONG, MapiMessage*, FLAGS, ULONG);
    (FARPROC&)lpfnSendMail = GetProcAddress(pMailState->m_hInstMail, "MAPISendMail");
    if (lpfnSendMail == NULL)
    {
        AfxMessageBox(AFX_IDP_INVALID_MAPI_DLL);
        return;
    }
    ASSERT(lpfnSendMail != NULL);

    TCHAR szTempName[_MAX_PATH];
    TCHAR szPath[_MAX_PATH];
    BOOL bRemoveTemp = FALSE;
    if (m_strPathName.IsEmpty() || IsModified())
    {
        // save to temporary path
        VERIFY(GetTempPath(_countof(szPath), szPath) != 0);
        VERIFY(GetTempFileName(szPath, _T("afx"), 0, szTempName) != 0);

        // save it, but remember original modified flag
        BOOL bModified = IsModified();
        BOOL bResult = DoSave(szTempName, FALSE);
        SetModifiedFlag(bModified);
        if (!bResult)
        {
            TRACE0("Warning: file save failed during File.Send Mail.\n");
            return;
        }
        bRemoveTemp = TRUE;
    }
    else
    {
        // use actual file since it isn't modified
        lstrcpyn(szTempName, m_strPathName, _countof(szTempName));
    }
#ifdef _UNICODE
    char szTempNameA[_MAX_PATH];
    _wcstombsz(szTempNameA, szTempName, _countof(szTempNameA));
#endif

    // build an appropriate title for the attachment
    TCHAR szTitle[_MAX_PATH];
    if (!m_strPathName.IsEmpty())
        AfxGetFileName(m_strPathName, szTitle, _countof(szTitle));
    else
    {
        lstrcpyn(szTitle, m_strTitle, _countof(szTitle));
        if (m_strTitle.Find('.') == -1) // no extension
        {
            // append the default suffix if there is one
            CString strExt;
            CDocTemplate* pTemplate = GetDocTemplate();
            if (pTemplate != NULL &&
                    pTemplate->GetDocString(strExt, CDocTemplate::filterExt))
            {
                lstrcat(szTitle, strExt);
            }
        }
    }

#ifdef _UNICODE
    char szTitleA[_MAX_PATH];
    _wcstombsz(szTitleA, szTitle, _countof(szTitleA));
#endif

    // prepare the file description (for the attachment)
    MapiFileDesc fileDesc;
    memset(&fileDesc, 0, sizeof(fileDesc));
    fileDesc.nPosition = (ULONG)-1;
#ifdef _UNICODE
    fileDesc.lpszPathName = szTempNameA;
    fileDesc.lpszFileName = szTitleA;
#else
    fileDesc.lpszPathName = szTempName;
    fileDesc.lpszFileName = szTitle;
#endif

    // prepare the message (empty with 1 attachment)
    MapiMessage message;
    memset(&message, 0, sizeof(message));
    message.nFileCount = 1;
    message.lpFiles = &fileDesc;

    // prepare for modal dialog box
    AfxGetApp()->EnableModeless(FALSE);
    HWND hWndTop;
    CWnd* pParentWnd = CWnd::GetSafeOwner(NULL, &hWndTop);

    // some extra precautions are required to use MAPISendMail as it
    // tends to enable the parent window in between dialogs (after
    // the login dialog, but before the send note dialog).
    pParentWnd->SetCapture();
    ::SetFocus(NULL);
    pParentWnd->m_nFlags |= WF_STAYDISABLED;

    int nError = lpfnSendMail(0, (ULONG)pParentWnd->GetSafeHwnd(),
                              &message, MAPI_LOGON_UI|MAPI_DIALOG, 0);

    // after returning from the MAPISendMail call, the window must
    // be re-enabled and focus returned to the frame to undo the workaround
    // done before the MAPI call.
    ::ReleaseCapture();
    pParentWnd->m_nFlags &= ~WF_STAYDISABLED;

    pParentWnd->EnableWindow(TRUE);
    ::SetActiveWindow(NULL);
    pParentWnd->SetActiveWindow();
    pParentWnd->SetFocus();
    if (hWndTop != NULL)
        ::EnableWindow(hWndTop, TRUE);
    AfxGetApp()->EnableModeless(TRUE);

    if (nError != SUCCESS_SUCCESS &&
            nError != MAPI_USER_ABORT && nError != MAPI_E_LOGIN_FAILURE)
    {
        AfxMessageBox(AFX_IDP_FAILED_MAPI_SEND);
    }

    // remove temporary file, if temporary file was used
    if (bRemoveTemp)
        CFile::Remove(szTempName);
}