Отправка почты outlook из развернутого веб-приложения C#
Привет,
Я пытаюсь отправить почту outlook из веб-приложения c#. Когда я отлаживаю код, он работает нормально. Я даже использовал то же самое для консольного приложения, и оно тоже отлично работает.
Но когда я развертываю приложение на IIS, я получаю эту ошибку:
Retrieving the COM class factory for component with CLSID {0006F03A-0000-0000-C000-000000000046} failed due to the following error: 80070005 Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)). Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.UnauthorizedAccessException: Retrieving the COM class factory for component with CLSID {0006F03A-0000-0000-C000-000000000046} failed due to the following error: 80070005 Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)). ASP.NET is not authorized to access the requested resource. Consider granting access rights to the resource to the ASP.NET request identity. ASP.NET has a base process identity (typically {MACHINE}\ASPNET on IIS 5 or Network Service on IIS 6 and IIS 7, and the configured application pool identity on IIS 7.5) that is used if the application is not impersonating. If the application is impersonating via <identity impersonate="true"/>, the identity will be the anonymous user (typically IUSR_MACHINENAME) or the authenticated request user. To grant ASP.NET access to a file, right-click the file in File Explorer, choose "Properties" and select the Security tab. Click "Add" to add the appropriate user or group. Highlight the ASP.NET account, and check the boxes for the desired access. Source Error: Line 26: protected void Button1_Click(object sender, EventArgs e) Line 27: { Line 28: Microsoft.Office.Interop.Outlook.Application olapp = new Microsoft.Office.Interop.Outlook.Application(); Line 29: Microsoft.Office.Interop.Outlook.MailItem msg = (Microsoft.Office.Interop.Outlook.MailItem)olapp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem); Line 30: string body = ""; Source File: D:\SOFTWARE APPLICATIONS\SCORE\SCORE\WebForm1.aspx.cs Line: 28 Stack Trace: [UnauthorizedAccessException: Retrieving the COM class factory for component with CLSID {0006F03A-0000-0000-C000-000000000046} failed due to the following error: 80070005 Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)).] System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(RuntimeType objectType) +0 System.Runtime.Remoting.Activation.ActivationServices.CreateInstance(RuntimeType serverType) +79 System.Runtime.Remoting.Activation.ActivationServices.IsCurrentContextOK(RuntimeType serverType, Object[] props, Boolean bNewObj) +76 System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +113 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232 System.Activator.CreateInstance(Type type, Boolean nonPublic) +83 System.Activator.CreateInstance(Type type) +66 SCORE.WebForm1.Button1_Click(Object sender, EventArgs e) in D:\SOFTWARE APPLICATIONS\SCORE\SCORE\WebForm1.aspx.cs:28 System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9628442 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +103 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724 Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.34280
Все, что я понимаю, это то, что происходит сбой загрузки COM-объекта, который не происходит при отладке. Так в чем же может быть возможная причина этого? Подойдет любое решение или обходной путь.
Спасибо!..!
Что я уже пробовал:
Каким-то образом ниже код не работает после запуска из IIS.
Microsoft.Office.Interop.Outlook.Application olapp = new Microsoft.Office.Interop.Outlook.Application(); Microsoft.Office.Interop.Outlook.MailItem msg = (Microsoft.Office.Interop.Outlook.MailItem)olapp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem); string body = ""; msg.Subject = "new message"; msg.To = "xxxx@yyy.com"; body = "test msg"; msg.BodyFormat = Microsoft.Office.Interop.Outlook.OlBodyFormat.olFormatHTML; msg.HTMLBody = body; msg.Display(); msg.Send();
Richard MacCutchan
Сообщение об ошибке говорит вам, что нужно сделать. Но вам действительно нужно понять ограничения на веб-сайтах и серверах.
planetz
Я дал полное разрешение пользователям iis из свойств управления командной кнопкой outlook в конфигурации DCOM, как я видел в другом решении. Но все равно это не работает. Я не знаю об ограничениях на отправку почты через интернет. Он отлично работает в режиме отладки.
F-ES Sitecore
Ваш код работает на сервере, поэтому он пытается отправить электронную почту из профиля Outlook сервера, а не от человека, использующего сайт. Скорее всего, вы не настроили профиль Outlook с сервера, и, скорее всего, это тоже не то, что вам нужно, вы, вероятно, хотите, чтобы электронное письмо было отправлено из Outlook клиента. Вы не можете этого сделать, и вы не можете автоматизировать Outlook с помощью кода asp.net, вам нужно другое решение, например, отправка электронной почты через ваш код .net и SmtpClient или использование служб Exchange, если ваш клиент использует Exchange. Вы должны помнить, что Outlook - это клиентское приложение, и ваш серверный код может управлять им не больше, чем Word или блокнот.
planetz
Я хочу отправить письмо пользователю, когда пользователь нажимает кнопку. Это все. Если есть какой-то другой способ, кроме outlook, я буду рад попробовать его.
planetz
После предоставления разрешений старая ошибка исчезла. Теперь эта ошибка приближается:
Получение фабрики COM-класса для компонента с CLSID {0006F03A-0000-0000-C000-000000000046} сбой произошел из-за следующей ошибки: вызов 80010001 был отклонен вызываемым абонентом. (Исключение из HRESULT: 0x80010001 (RPC_E_CALL_REJECTED)).
F-ES Sitecore
Автоматизация Outlook из asp.net не поддерживается,вы не получите эту работу надежно.
planetz
Есть ли другой вариант?? Я постараюсь, если есть. Сейчас я пытаюсь отправлять почту с помощью gmail. Но это дает тайм-аут ошибки.
F-ES Sitecore
Не отправляйте электронную почту через gmail, если это внутренняя сеть, ваш сетевой администратор сообщит вам, какой smtp-сервер вы можете использовать.
Philippe Mori
В .NET у вас есть все, что вам нужно для отправки электронной почты ASP.NET. Вам не нужно использовать Outlook. Все, что вам нужно для этого, это набрать что-то вроде отправить по электронной почте asp.net в вашей предпочтительной поисковой системе.
Как уже упоминалось ранее, хорошо известно, что автоматизация офиса не должна использоваться на сервере. Он не был предназначен для этой цели.
planetz
Я пробовал различные примеры в соответствии с вашим предложением с gmail. Каждый раз, когда он говорит: "удаленное имя не может быть решено". Когда я пытаюсь пинговать gmail.com там написано, что время ожидания запроса истекло. Сервер находится в интрасети. Может ли это быть проблемой?
planetz
Попытка подключения не удалась из-за того, что подключенная сторона не ответила должным образом через определенный промежуток времени, или установившееся соединение не удалось из-за того, что подключенный хост не ответил 74.125.136.109:587
Это ошибка, которая приходит сейчас.
Philippe Mori
Ну, вы должны убедиться, что все параметры действительны, например EnableSsl
и номер порта. Один из способов подтвердить параметры - попробовать использовать существующее приложение, чтобы убедиться, что вы все сделали правильно. Кроме того, вы должны убедиться, что никакой брандмауэр или что-либо еще не блокирует доступ. Ваш сетевой администратор должен быть в состоянии помочь вам.
planetz
Также я хотел бы сообщить, что сервер находится в интранет-сети.
Philippe Mori
Поместите свой код в блок кода, чтобы сделать его более читаемым.