Aifos Lavigne Ответов: 2

Ошибка автоматической повторной отправки электронной почты: ответ сервера был: 4.3.2


Привет, у меня есть служба windows, которая отправляет 234 письма администратору в качестве уведомления каждые 03: 00 по восточному времени. Это прекрасно работает в течение многих лет. Но вдруг я получил сообщение об ошибке 102 электронных писем от EmailAutoResendServicesaying:

Email Auto Resending service encountered an error in Actual resending of email from 'SystemName'.
Email ID: 1777

System.InvalidCastException: Conversion from string "" to type 'Integer' is not valid. ---> System.FormatException: Input string was not in a correct format. at Microsoft.VisualBasic.CompilerServices.Conversions.ParseDouble(String Value, NumberFormatInfo NumberFormat) at Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value) --- End of inner exception stack trace --- at Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(String Value) at WS_EmailAutoResend_V2.EmailResendingLib.getEmailLogRecords()
This is a system generated email, please do not reply.


И после проверки в журнале электронной почты системы он получил 102 неудачно отправленных сообщения электронной почты, содержащих сообщение об ошибке:

System.Net.Mail.SmtpException: Service not available, closing transmission channel. The server response was: 4.3.2 The maximum number of concurrent connections has exceeded a limit, closing transmission channel
   at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at SystemName_Notification.BLL.FnSendEmail(String strTo, String strToName, String strCC, String strBCC, String strSubject, String strMsg)



Я хотел бы спросить, Что же вызывает это сообщение об ошибке. Как это может произойти, если он работает нормально? До сегодняшнего дня он работает нормально. Это просто происходит в тот конкретный день и время.

Что я уже пробовал:

***Для этого пока нет решения ***

F-ES Sitecore

Ваш код пытается разобрать число (int или double) из строки, а строка, которую он получает, не может быть разобрана как число. Что касается вашей второй ошибки, то ваш код должен быть достаточно надежен, чтобы справиться с этими исключениями и повторить попытку позже.

Aifos Lavigne

Я вижу. Как вы думаете, это ошибка кода? или exchange server и внутренние настройки? Я не могу понять, в чем проблема, потому что в письме говорится, что есть ошибка между параметрами, но после проверки журнала ошибок это выглядит как настройки сервера.

Afzaal Ahmad Zeeshan

Во-первых, это ошибка кода. Вы должны написать соответствующую проверку, чтобы увидеть, в порядке ли строка или нет. Я показал пример кода, который делает это.

Во-вторых, вторая ошибка гораздо больше похожа на ИТ-ошибку, когда ваши серверы (или их серверы, поскольку вы ничего об этом не упомянули) не работают по максимуму или пользователи очень заинтересованы в услуге в этот час.

В любом случае вам нужно изменить серверы, чтобы включить больше соединений (есть несколько способов сделать это).

Afzaal Ahmad Zeeshan

Не берите в голову

2 Ответов

Рейтинг:
14

Jochen Arndt

F-ES Sitecore прибил его гвоздями, но я постараюсь объяснить более подробно.

Исключение произошло в коде вашей службы Windows в функции ToInteger() позвонил в WS_EmailAutoResend_V2.EmailResendingLib.getEmailLogRecords(). Исключение возникает из-за того, что анализируемая строка пуста (преобразование из строки "" В тип "Integer" недопустимо.).

Из-за исключения поток, выполняющий код для отправки почты, завершается, пока сама служба все еще работает. Но поток открыл SMTP-соединение, которое осталось в устаревшем состоянии. Поскольку вы пытаетесь отправить несколько писем, а некоторые из них терпят неудачу с этим исключением, у вас будет несколько мертвых SMTP-соединений до тех пор, пока не будет достигнут предел одновременных подключений. После отправки следующего письма не удается, при попытке открытия SMTP-соединения.

Таким образом, вторая ошибка возникает из-за нескольких повторений первой ошибки. И вы больше не увидите первую ошибку, потому что вторая возникает перед разбором целочисленной строки.

Чтобы узнать, что произошло, вы должны проверить код и как он называется. Поскольку он работал в прошлом, не должно быть слишком сложно выяснить, какая строка, содержащая целое число, теперь пуста. Если бы это происходило только в определенный день, вы могли бы начать проверять, что было особенным в этот день.

Чтобы избежать второй ошибки в будущем, код должен перехватывать исключения, а затем закрывать SMTP-соединение (и все другие открытые дескрипторы, такие как файлы).

Чтобы избежать первой ошибки, ловите также исключения или лучше проверяйте параметры на валидность и генерируйте дополнительную почту с ошибкой или добавляйте информацию о недопустимом параметре в саму почту.


Рейтинг:
0

Afzaal Ahmad Zeeshan

Обе ошибки довольно ясны и аккуратны в своем смысле,

Цитата:
Преобразование из строки "" В тип "Integer" недопустимо
Как можно преобразовать пустую строку в целое число? Это должно быть, по крайней мере, "0" или что-то подобное. Существует безопасный способ разбора строки на целые числа,
int number;
if(int.TryParse(your_value, out number) {
    // Continue with the rest of the code
} else {
    // Break; integer is not valid string; or other way around :D
}

Как уже упоминалось, проблема заключается в том, что сервер не может принимать больше подключений, так как уже подключено достаточно клиентов. Есть два способа решить эту проблему:
1. Повторная попытка подключения, которая опять же (что более вероятно) в результате та же проблема.
2. сообщите пользователю, что сервер не отвечает. Что не будет хорошим подходом для UX.

Так или иначе, поскольку вы говорите, что это работает, то вам нужно подождать или повторить попытку позже, их сервер может ожидать загрузки пользователей.

Кроме того, вы должны проверить информацию об их подписках, чтобы узнать, почему они показывают эту ошибку, служба электронной почты не должна быть отключена, если вы платите им за эту услугу. Если в случае судебного разбирательства, то все должно быть хорошо, и вы должны это понимать. :-)