Отправка электронной почты из 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, которые не могут отправлять электронную почту:
- Предоставьте разрешения на чтение / запись для группы IIS_IUSRS для папки Mailroot (разрешения будут наследоваться для папок Pickup/etc).
Теперь используйте модификатор 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: приложениям должны быть предоставлены явные привилегии для любой записи реестра, иерархии папок, файлов и т. Д., Которые он должен читать или записывать.