Наши пользователи могут отправлять электронные письма из нашего веб-приложения ASP.NET одним нажатием кнопки. В нашей тестовой среде происходит странная вещь.
В первый раз, когда приложение пытается отправить электронное письмо, мы получаем исключение:
Почтовый ящик не доступен. Ответ сервера был: 5.7.1 У клиента нет разрешений на отправку в качестве этого отправителя.
Забавно то, что когда пользователь снова нажимает кнопку (приложение пытается снова отправить электронное письмо), оно работает, и электронное письмо отправляется.
Если вы немного подождете, вы снова получите сообщение об ошибке, но при повторном нажатии письмо будет отправлено без проблем. Если вы достаточно быстро отправите новое электронное письмо, это сработает.
Это (упрощенный) код, который мы используем:
Dim smtpClient As New SmtpClient(<smtp mail server goes here>)
smtpClient.UseDefaultCredentials = True
mailMessage.From = New MailAddress(<from address>)
smtpClient.Send(mailMessage)
Однако это работает в производственной среде. Мы используем Microsoft Exchange, как и наши клиенты (производственные среды).
У кого-нибудь было что-нибудь подобное (ошибка первый раз, второй раз работает как прелесть)?
Я видел это несколько раз раньше, и вот причины, которые я видел. Имейте в виду, что они были замечены только в большой среде. Если вы находитесь в среде с одним постоянным током, с одним сервером обмена, это не применимо.
Прежде всего, вот статья MS об этом: http://support.microsoft.com/kb/895853. Под возможными причинами вы можете увидеть, что в игре много разных вещей.
Разрешения на ретрансляцию одного из ваших серверов обмена настроены неправильно.
Это, скорее всего, причина. Почта может использовать другой маршрут при первой и второй попытках, в то время как это может показаться глупым - запускать отслеживание сообщений для обоих сообщений, чтобы проверить, проходят ли они через один и тот же сервер. Если вы видите разные пути, проверьте настройки на плохом, возможно, простое реле разрешения для аутентифицированных пользователей не проверено.
Разрешения AD неверны
У вас должны быть разрешения «Отправить как» для учетной записи, для которой указан адрес отправителя из вашей электронной почты. Если он иногда работает, но не другие, то это могут быть разные пути маршрутизации почты с разными разрешениями между ними.
Аутентификация работает некорректно.
В первом экземпляре сценария может случиться так, что аутентификация не удалась, и в этом случае почта отклоняется, поскольку у вас нет разрешения. Во втором запуске скрипта аутентификация прошла успешно. К сожалению, я недостаточно хорошо знаю ASP, чтобы понять приведенный выше код или посоветовать, как его исправить. smtpClient.UseDefaultCredentials может быть неправильным кодом для вашей среды. Это будет аутентифицироваться только по запросу сервера и будет использовать учетные данные локально вошедшего в систему пользователя. Если сервер не запрашивает аутентификацию в первый раз, вы не будете авторизованы и у вас может не быть разрешения на отправку. Попробуйте изменить его на код, который всегда аутентифицируется.
Один из ваших DC или глобальных каталогов устарел или содержит неверную информацию.
Это редко, но возможно, что у ваших контроллеров домена нет синхронизации. Дважды проверьте информацию о сервере для учетных записей from и to через ldap или adsi edit и убедитесь, что они идентичны для всех DC.
Во всех случаях проверьте журналы на сервере обмена и убедитесь, что ведение журнала SMTP включено во всех полях. Используйте отслеживание сообщений, чтобы точно узнать, на какие серверы это сообщение попадает.
Для меня проблема заключалась в том, что в моем конфигурационном файле уже была указана учетная запись «От». Когда я пытался сделать mailMessage.From = New MailAddress(<from address>)
в моем коде его вырвало, потому что электронное письмо «от» в моем коде не совпадало с электронным письмом «от» в моем файле конфигурации.
Мне кажется, у вас может быть включена аутентификация SMTP на почтовом сервере, но вы не включили ее в код. В таком случае при первой попытке отправить сообщение он эффективно выполняет аутентификацию, но не может отправить сообщение. В следующий раз, когда пользователь будет аутентифицирован и сообщение пройдет.
Попробуй это :
Dim client = New SmtpClient(<smtp mail server goes here>)
MailerManager.ServerSMTP = client.Host.ToString()
Try
client.Send(Mail)
Catch ex As Exception
'Error Message
End Try