Отправка электронной почты из IIS 7 с использованием локальной ретрансляции SMTP

Я использую Windows Server 2008 R2 и IIS 7.5.7600, поэтому я установил службу SMTP, и она работает. Я проверил, что он работает, используя следующий скрипт powershell:

$emailFrom = "user@yourdomain.com"
$emailTo = "user@yourdomain.com"
$subject = "your subject"
$body = "your body"
$smtpServer = "your smtp server"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($emailFrom, $emailTo, $subject, $body)

Письмо отправляется с использованием "localhost" в качестве сервера.

Однако после настройки web.config служб WCF:

<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network" from="user@yourdomain.com">
      <network
        host="localhost"
        port="25" 
      />
    </smtp>
  </mailSettings>
</system.net>

Я получаю общую бессмысленную ошибку, когда мой код вызывает:

var mail = new MailMessage();
mail.To.Add("user@yourdomain.com");
mail.Subject = "[Smtp Client] TEST";
mail.Body = "TEST";
mail.IsBodyHtml = false;
var smtpMail = new SmtpClient();
smtpMail.Send(mail);

Я получил:

Failure sending mail.

    at System.Net.Mail.SmtpClient.Send(MailMessage message)

Я в недоумении, что еще проверить? Да, я установил роль сервера приложений на сервере. Да, служба WCF работает правильно, весь мой другой код выполняется должным образом, только отправка электронной почты не удалась. Кажется, что есть какое-то разъединение между IIS и локальным SMTP-ретранслятором, но я не смог найти что-либо обсуждающее эту конкретную проблему (только люди, которые не могут запустить SMTP и не могут разобраться в своих настройках),

Спасибо за ваше время и внимание.

1 ответ

Решение

Таким образом, ответом оказались разрешения с метабазой. Я обнаружил, что это упоминалось ранее, но источники, с которыми я ранее сталкивался, говорили только о предоставлении разрешений на чтение пути LM\SMTPSVC и не упоминали о LM\SMTPSVC\1 (я думал, что разрешения будут каскадно переходить к подпапкам / путям), Для более подробного объяснения см. Ниже:

Взято ЗДЕСЬ.

В 2008/IIS7+ учетные записи ApplicationPoolIdentity являются скрытыми учетными записями, которым динамически назначаются идентификаторы безопасности (создаются и назначаются при запуске ApplicationPool). Но учетные записи живут как (скрытые) пользователи в группе IIS_IUSRS на локальном компьютере (это довольно просто дает им разрешение на доступ к AppPools, поскольку вы можете использовать обычный интерфейс с графическим интерфейсом для доступа или использовать сценарии при указании локальной группы пользователей). Чтобы устранить проблему с сайтами ASP, работающими под IIS7.5, которые не могут отправлять электронную почту:

  1. Предоставьте разрешения на чтение / запись для группы IIS_IUSRS для папки Mailroot (разрешения будут наследоваться для папок Pickup/etc).
  2. Теперь используйте модификатор Metabase Permissions (Metabase Explorer работает, как и METAACL.VBS с 2003 года), откройте LM\SMTPSVC и SMTPSVC \ 1 и добавьте IIS_IUSRS с разрешениями на чтение для этих ветвей метабазы.

    cscript metaacl.vbs IIS: // LOCALHOST / SMTPSVC% имя_компьютера%\IIS_IUSRS R cscript metaacl.vbs IIS://LOCALHOST/SMTPSVC/1 % имя_компьютера% \ IIS_IUSRS R

Эти разрешения позволят любому пользователю ApplicationPoolIdentity создавать и отправлять электронную почту с использованием локальной службы SMTP. Это можно проверить с остановленной службой SMTP на локальном компьютере, что заставит файлы.EML показываться в папке mailroot\pickup. Причина отправки электронной почты работает для NetworkService и LocalService, а не для ApplicationPoolIdentity, в том, что метабаза по умолчанию имеет разрешения на чтение для SYSTEM и NetworkService. Это еще один пример того, почему запуск AppPools в качестве ApplicationPoolIdentity обеспечивает большую безопасность, чем запуск в качестве NetworkService: приложениям должны быть предоставлены явные привилегии для любой записи реестра, иерархии папок, файлов и т. Д., Которые он должен читать или записывать.

Другие вопросы по тегам