2009-02-25 5 views
1

Я использовал Mapi32 из приложения Winforms, чтобы отправить новое сообщение с прикрепленными файлами какое-то время, и он работает очень хорошо. (Да, я знаю, что вызов в MAPI32 с C# не поддерживается.)MAPISendMail не работает, когда Outlook работает

В течение последних нескольких дней он прекратил работать, когда Outlook работает. Однако, если Outlook не работает, он будет работать, как ожидалось. Это происходит как в Vista, так и в XP.

У какой-либо проблемы с SOer возникла эта проблема? Как вы это разрешили?

Вот код, я использую:

public class EmailController 
{ 
    [DllImport("MAPI32.DLL", CharSet = CharSet.Ansi)] 
    public static extern int MAPISendMail(IntPtr lhSession, IntPtr ulUIParam, 
     MapiMessage lpMessage, int flFlags, int ulReserved); 
    public const int MAPI_LOGON_UI = 0x00000001; 
    private const int MAPI_DIALOG = 0x00000008; 

    public static int SendMail(string strAttachmentFileName, string strSubject,string to) 
    { 

     IntPtr session = new IntPtr(0); 
     IntPtr winhandle = new IntPtr(0); 

     MapiMessage msg = new MapiMessage(); 
     msg.subject = strSubject; 

     int sizeofMapiDesc = Marshal.SizeOf(typeof(MapiFileDesc)); 
     IntPtr pMapiDesc = Marshal.AllocHGlobal(sizeofMapiDesc); 

     MapiFileDesc fileDesc = new MapiFileDesc(); 
     fileDesc.position = -1; 
     int ptr = (int)pMapiDesc; 

     string path = strAttachmentFileName; 
     fileDesc.name = Path.GetFileName(path); 
     fileDesc.path = path; 
     Marshal.StructureToPtr(fileDesc, (IntPtr)ptr, false); 

     msg.files = pMapiDesc; 
     msg.fileCount = 1; 


     List<MapiRecipDesc> recipsList = new List<MapiRecipDesc>(); 
     MapiRecipDesc recipient = new MapiRecipDesc(); 

     recipient.recipClass = 1; 
     recipient.name = to; 
     recipsList.Add(recipient); 

     int size = Marshal.SizeOf(typeof(MapiRecipDesc)); 
     IntPtr intPtr = Marshal.AllocHGlobal(recipsList.Count * size); 

     int recipPtr = (int)intPtr; 
     foreach (MapiRecipDesc mapiDesc in recipsList) 
     { 
      Marshal.StructureToPtr(mapiDesc, (IntPtr)recipPtr, false); 
      recipPtr += size; 
     } 

     msg.recips = intPtr; 
     msg.recipCount = 1; 
     int result = MAPISendMail(session, winhandle, msg, MAPI_LOGON_UI | MAPI_DIALOG, 0); 

     return result; 
    } 
} 

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
public class MapiMessage 
{ 
    public int reserved; 
    public string subject; 
    public string noteText; 
    public string messageType; 
    public string dateReceived; 
    public string conversationID; 
    public int flags; 
    public IntPtr originator; 
    public int recipCount; 
    public IntPtr recips; 
    public int fileCount; 
    public IntPtr files; 
} 

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
public class MapiFileDesc 
{ 
    public int reserved; 
    public int flags; 
    public int position; 
    public string path; 
    public string name; 
    public IntPtr type; 
} 

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
public class MapiRecipDesc 
{ 
    public int reserved; 
    public int recipClass; 
    public string name; 
    public string address; 
    public int eIDSize; 
    public IntPtr entryID; 
} 
+1

Возможно, уровень целостности процесса вызывающего абонента отличается от уровня целостности Outlook. Используйте Process Explorer, чтобы найти ILs запущенных процессов. – wqw

+0

может не иметь отношения к вашей проблеме, но у меня была MAPISendMail, зависающая с Outlook, потому что у почтовых адресов были пробелы! –

ответ

0

Ну, кроме очевидного «использования поддерживаемого C# почта отправка методы» комментарий, мне интересно, если что-то случилось с файлом MAPI32.dll - есть вы попробовали «Обнаружить и восстановить» в Outlook?

Я также читаю здесь (http://office.microsoft.com/en-us/outlook/HP011164781033.aspx), что есть некоторые шаги, которые вы можете сделать (сообщение и комментарии), чтобы получить Outlook для восстановления или замены dll.

1

int result = MAPISendMail (сеанс, winhandle, msg, MAPI_LOGON_UI | MAPI_DIALOG, 0);

return result; 

Что вернется?

+0

Я также проверил способ отправки электронной почты. Мои тесты не отправляют электронную почту, метод MAPISendMail возвращает 2. – constructor

+0

Это было давно, так как я был в MAPI. Однако убедитесь, что вы настроили почтовый клиент, который будет использоваться с MAPI, поскольку по умолчанию это значение не задано. См. Https://msdn.microsoft.com/en-us/library/windows/desktop/ee909492%28v=vs.85%29.aspx. –

2

Если вы используете приложение с повышенными привилегиями (т. Е. Как администратор), а Outlook - нет, отправка не удастся. Вам нужно будет сообщить пользователю закрыть все запущенные экземпляры Outlook и повторить попытку.

Смежные вопросы