planetz Ответов: 1

Отправка почты 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

Поместите свой код в блок кода, чтобы сделать его более читаемым.

1 Ответов

Рейтинг:
0

ZurdoDev

Как уже упоминалось в комментариях, ваш код работает на сервере, и поэтому Outlook должен быть настроен на сервере с профилем и т. д. Но это ужасная идея, поэтому вы попросили другой способ. Отправка SMTP электронной почты очень проста в использовании ASP.Net. В интернете есть тонны и тонны примеров. Вот первый результат, когда я ищу google, Как отправить электронную почту в ASP.NET C# - переполнение стека[^].