/// <summary> /// Sends the mail message. /// </summary> private void _ShowMail(object deleteFilesOnExit) { MAPIHelperInterop.MapiMessage message = new MAPIHelperInterop.MapiMessage(); using (RecipientCollection.InteropRecipientCollection interopRecipients = _recipientCollection.GetInteropRepresentation()) { message.Subject = _subject; message.NoteText = _body; message.Recipients = interopRecipients.Handle; message.RecipientCount = _recipientCollection.Count; // Check if we need to add attachments if (_files.Count > 0) { // Add attachments message.Files = _AllocAttachments(out message.FileCount); } // Signal the creating thread (make the remaining code async) _manualResetEvent.Set(); const int MAPI_DIALOG = 0x8; //const int MAPI_LOGON_UI = 0x1; int error = MAPIHelperInterop.MAPISendMail(IntPtr.Zero, IntPtr.Zero, message, MAPI_DIALOG, 0); if (_files.Count > 0) { // Deallocate the files _DeallocFiles(message); if ((bool)deleteFilesOnExit) { foreach (string file in _files) { try { if (File.Exists(file)) { LOG.Debug("Deleting file " + file); File.Delete(file); } } catch (Exception e) { LOG.Error("Can't delete file " + file, e); } } } } MAPI_CODES errorCode = (MAPI_CODES)Enum.ToObject(typeof(MAPI_CODES), error); // Check for error if (errorCode != MAPI_CODES.SUCCESS && errorCode != MAPI_CODES.USER_ABORT) { _LogErrorMapi(errorCode); } } }
/// <summary> /// Sends the mail message. /// </summary> private void _ShowMail() { var message = new MapiHelperInterop.MapiMessage(); using (var interopRecipients = Recipients.GetInteropRepresentation()) { message.Subject = Subject; message.NoteText = Body; message.Recipients = interopRecipients.Handle; message.RecipientCount = Recipients.Count; // Check if we need to add attachments if (Files.Count > 0) { // Add attachments message.Files = _AllocAttachments(out message.FileCount); } // Signal the creating thread (make the remaining code async) _manualResetEvent.Set(); const int MAPI_DIALOG = 0x8; //const int MAPI_LOGON_UI = 0x1; int error = MapiHelperInterop.MAPISendMail(IntPtr.Zero, IntPtr.Zero, message, MAPI_DIALOG, 0); if (Files.Count > 0) { // Deallocate the files _DeallocFiles(message); } MAPI_CODES errorCode = (MAPI_CODES)Enum.ToObject(typeof(MAPI_CODES), error); // Check for error if (errorCode == MAPI_CODES.SUCCESS || errorCode == MAPI_CODES.USER_ABORT) { return; } string errorText = GetMapiError(errorCode); Log.Error("Error sending MAPI Email. Error: " + errorText + " (code = " + errorCode + ")."); MessageBox.Show(errorText, "Mail (MAPI) destination", MessageBoxButtons.OK, MessageBoxIcon.Error); // Recover from bad settings, show again if (errorCode != MAPI_CODES.INVALID_RECIPS) { return; } Recipients = new RecipientCollection(); _ShowMail(); } }
/// <summary> /// Logs any Mapi errors. /// </summary> private string GetMapiError(MAPI_CODES errorCode) { string error = string.Empty; switch (errorCode) { case MAPI_CODES.USER_ABORT: error = "User Aborted."; break; case MAPI_CODES.FAILURE: error = "MAPI Failure."; break; case MAPI_CODES.LOGIN_FAILURE: error = "Login Failure."; break; case MAPI_CODES.DISK_FULL: error = "MAPI Disk full."; break; case MAPI_CODES.INSUFFICIENT_MEMORY: error = "MAPI Insufficient memory."; break; case MAPI_CODES.BLK_TOO_SMALL: error = "MAPI Block too small."; break; case MAPI_CODES.TOO_MANY_SESSIONS: error = "MAPI Too many sessions."; break; case MAPI_CODES.TOO_MANY_FILES: error = "MAPI too many files."; break; case MAPI_CODES.TOO_MANY_RECIPIENTS: error = "MAPI too many recipients."; break; case MAPI_CODES.ATTACHMENT_NOT_FOUND: error = "MAPI Attachment not found."; break; case MAPI_CODES.ATTACHMENT_OPEN_FAILURE: error = "MAPI Attachment open failure."; break; case MAPI_CODES.ATTACHMENT_WRITE_FAILURE: error = "MAPI Attachment Write Failure."; break; case MAPI_CODES.UNKNOWN_RECIPIENT: error = "MAPI Unknown recipient."; break; case MAPI_CODES.BAD_RECIPTYPE: error = "MAPI Bad recipient type."; break; case MAPI_CODES.NO_MESSAGES: error = "MAPI No messages."; break; case MAPI_CODES.INVALID_MESSAGE: error = "MAPI Invalid message."; break; case MAPI_CODES.TEXT_TOO_LARGE: error = "MAPI Text too large."; break; case MAPI_CODES.INVALID_SESSION: error = "MAPI Invalid session."; break; case MAPI_CODES.TYPE_NOT_SUPPORTED: error = "MAPI Type not supported."; break; case MAPI_CODES.AMBIGUOUS_RECIPIENT: error = "MAPI Ambiguous recipient."; break; case MAPI_CODES.MESSAGE_IN_USE: error = "MAPI Message in use."; break; case MAPI_CODES.NETWORK_FAILURE: error = "MAPI Network failure."; break; case MAPI_CODES.INVALID_EDITFIELDS: error = "MAPI Invalid edit fields."; break; case MAPI_CODES.INVALID_RECIPS: error = "MAPI Invalid Recipients."; break; case MAPI_CODES.NOT_SUPPORTED: error = "MAPI Not supported."; break; case MAPI_CODES.NO_LIBRARY: error = "MAPI No Library."; break; case MAPI_CODES.INVALID_PARAMETER: error = "MAPI Invalid parameter."; break; } return(error); }
/// <summary> /// Logs any Mapi errors. /// </summary> private void _LogErrorMapi(MAPI_CODES errorCode) { string error = string.Empty; switch (errorCode) { case MAPI_CODES.USER_ABORT: error = "User Aborted."; break; case MAPI_CODES.FAILURE: error = "MAPI Failure."; break; case MAPI_CODES.LOGIN_FAILURE: error = "Login Failure."; break; case MAPI_CODES.DISK_FULL: error = "MAPI Disk full."; break; case MAPI_CODES.INSUFFICIENT_MEMORY: error = "MAPI Insufficient memory."; break; case MAPI_CODES.BLK_TOO_SMALL: error = "MAPI Block too small."; break; case MAPI_CODES.TOO_MANY_SESSIONS: error = "MAPI Too many sessions."; break; case MAPI_CODES.TOO_MANY_FILES: error = "MAPI too many files."; break; case MAPI_CODES.TOO_MANY_RECIPIENTS: error = "MAPI too many recipients."; break; case MAPI_CODES.ATTACHMENT_NOT_FOUND: error = "MAPI Attachment not found."; break; case MAPI_CODES.ATTACHMENT_OPEN_FAILURE: error = "MAPI Attachment open failure."; break; case MAPI_CODES.ATTACHMENT_WRITE_FAILURE: error = "MAPI Attachment Write Failure."; break; case MAPI_CODES.UNKNOWN_RECIPIENT: error = "MAPI Unknown recipient."; break; case MAPI_CODES.BAD_RECIPTYPE: error = "MAPI Bad recipient type."; break; case MAPI_CODES.NO_MESSAGES: error = "MAPI No messages."; break; case MAPI_CODES.INVALID_MESSAGE: error = "MAPI Invalid message."; break; case MAPI_CODES.TEXT_TOO_LARGE: error = "MAPI Text too large."; break; case MAPI_CODES.INVALID_SESSION: error = "MAPI Invalid session."; break; case MAPI_CODES.TYPE_NOT_SUPPORTED: error = "MAPI Type not supported."; break; case MAPI_CODES.AMBIGUOUS_RECIPIENT: error = "MAPI Ambiguous recipient."; break; case MAPI_CODES.MESSAGE_IN_USE: error = "MAPI Message in use."; break; case MAPI_CODES.NETWORK_FAILURE: error = "MAPI Network failure."; break; case MAPI_CODES.INVALID_EDITFIELDS: error = "MAPI Invalid edit fields."; break; case MAPI_CODES.INVALID_RECIPS: error = "MAPI Invalid Recipients."; break; case MAPI_CODES.NOT_SUPPORTED: error = "MAPI Not supported."; break; case MAPI_CODES.NO_LIBRARY: error = "MAPI No Library."; break; case MAPI_CODES.INVALID_PARAMETER: error = "MAPI Invalid parameter."; break; } LOG.Error("Error sending MAPI Email. Error: " + error + " (code = " + errorCode + ")."); }