Как ограничить количество отправляемых писем (связь по электронной почте Azure), С#? ⇐ C#
-
Гость
Как ограничить количество отправляемых писем (связь по электронной почте Azure), С#?
Я работаю над консольным приложением, которое считывает запись из базы данных и отправляет электронное письмо с помощью службы электронной почты Azure.
SEID ShouldEmailBeSent HasEmailBeenSent Время отправки электронной почты NextActionBy NextActionByUser 1 1 0 Ноль S22 Пользователь-менеджер 2 1 0 Ноль CloudTeam ТехПользователь 3 1 0 Ноль AITeam ТехПользователь 4 1 0 Ноль CloudTeam ТехПользователь
это запись в моей таблице базы данных «WorkExtended».
Что я сделал:
У меня есть 2 категории в столбце NextActionByUser: «ManagerUser» и «TechUser». Если MustEmailBeSent = 1, он проверяет NextActionByUser = «ManagerUser», затем проверяет NextActionBy на наличие идентификатора пользователя менеджера, и с помощью этого идентификатора пользователя он получает идентификатор электронной почты менеджер из другой таблицы (UserDetails), тогда будет отправлено электронное письмо. Если NextActionByUser ="TechUser" (у TechUser много команд), NextActionBy ="check the TeamName" и каждая команда имеет от 3 до 4 участников, я не хочу отправлять от 3 до 4 электронных писем для каждого SEID, поэтому я сгруппировал SEID, который является общим тот же NextActionBy(Team), таким образом он отправит только 3 электронных письма для SEID, который использует одну и ту же команду.
int maxEmailsToSend = 4; используя (соединение SqlConnection = новый SqlConnection(dbConnectionString)) { соединение.Открыть(); строковый запрос = "ВЫБЕРИТЕ SEID, ДолжноEmailBeSent,NextActionBy,NextActionByUser FROM WorkExtended " + "ГДЕ ДолжноEmailBeSent = 'True' И HasEmailBeenSent = 'False' И EmailSentTime IS NULL "; используя (команда SqlCommand = новая SqlCommand (запрос, соединение)) { используя (SqlDataReader Reader = команда.ExecuteReader()) { Dictionary seidsByTeam = new Dictionary(); интервал электронной почтыSentCount = 0; while (reader.Read() && emailsSentCount < maxEmailsToSend) { int seid = Convert.ToInt32(читатель["SEID"]); bool mustemailbesent = Convert.ToBoolean(reader["ShouldEmailBeSent"]); строка nextActionByUser = Reader["NextActionByUser"].ToString(); если (должно быть отправлено письмо) { если (nextActionByUser == "TechUser") { строка TeamName = GetTeamNameFromNextActionBy (соединение, nextActionByUser, seid); if (!seidsByTeam.ContainsKey(teamName)) { seidsByTeam[teamName] = новый список(); } seidsByTeam[имякоманды].Add(seid); } еще { строка ManagerId = GetManagerUserIdFromNextActionBy (соединение, nextActionByUser, seid); строка ManagerEmail = GetEmailForManagerUser (соединение, ManagerId); если (emailsSentCount < maxEmailsToSend) { ждут SendEmailToRecipient (seid, ManagerEmail); электронная почтаSentCount++; string updateQuery = «UPDATE WorkExtended SET HasEmailBeenSent = 'True', EmailSentTime = CURRENT_TIMESTAMP WHERE SEID = @SEID»; используя (SqlCommand updateCommand = новый SqlCommand (updateQuery, соединение)) { updateCommand.Parameters.AddWithValue("@SEID", seid); updateCommand.ExecuteNonQuery(); Console.WriteLine("Обновленный SEID: " + seid); } } } } } foreach (var teamEntry в seidsByTeam) { строка имя_команды = teamEntry.Key; List seidsForTeam = teamEntry.Value; List techUserEmails = GetEmailsForTechUsers(соединение, имя_команды); если (emailsSentCount < maxEmailsToSend) { int restEmails = maxEmailsToSend - emailsSentCount; int emailsToSendForTeam = Math.Min(remainingEmails, seidsForTeam.Count); если (emailsToSendForTeam > 0) { ждут SendGroupEmail(seidsForTeam.GetRange(0, emailsToSendForTeam), techUserEmails); emailsSentCount += emailsToSendForTeam; } string updateQuery = «UPDATE WorkExtended SET HasEmailBeenSent = 'True', EmailSentTime = CURRENT_TIMESTAMP WHERE SEID = @SEIDs»; используя (SqlCommand updateCommand = новый SqlCommand (updateQuery, соединение)) { updateCommand.Parameters.AddWithValue("@SEIDs", string.Join(",", seidsForTeam.GetRange(0, emailsToSendForTeam))); updateCommand.ExecuteNonQuery(); Console.WriteLine($"Обновленные SEID: {string.Join(", ", seidsForTeam.GetRange(0, emailsToSendForTeam))}"); } } } } } соединение.Закрыть(); Что я хочу:
Я хочу ограничить количество отправляемых электронных писем. Если я установлю maxEmailsToSend = 4, это означает, что ему нужно отправить только 4, не более того. например: согласно моей базе данных, он отправляет электронное письмо для SEID 1 и обновляет базу данных HasEmailBeenSent = 1,EmailSentTime = «дата отправки электронного письма». Теперь остается только 3 электронных письма, затем он проверяет оставшуюся запись, группирует мои SEID 2 и 4, отправляет электронное письмо 3 членам CloudTeam и обновляет мою базу данных. Теперь лимит электронной почты достигнут, и он не должен отправлять электронные письма. Но проблема в том, что он также отправлял электронные письма для SEID 3. Я хочу что-то вроде того, что если лимит достигнут, он не должен отправлять электронные письма. Даже если у него есть еще 1 электронное письмо, оно остается в пределах его лимита, но следующая запись (seid) имеет команду, в которой она должна отправлять почту 3 участникам, она не должна отправляться. Я попробовал что-то в своем коде, но не смог понять, как именно этого добиться.
Спасибо.
Я работаю над консольным приложением, которое считывает запись из базы данных и отправляет электронное письмо с помощью службы электронной почты Azure.
SEID ShouldEmailBeSent HasEmailBeenSent Время отправки электронной почты NextActionBy NextActionByUser 1 1 0 Ноль S22 Пользователь-менеджер 2 1 0 Ноль CloudTeam ТехПользователь 3 1 0 Ноль AITeam ТехПользователь 4 1 0 Ноль CloudTeam ТехПользователь
это запись в моей таблице базы данных «WorkExtended».
Что я сделал:
У меня есть 2 категории в столбце NextActionByUser: «ManagerUser» и «TechUser». Если MustEmailBeSent = 1, он проверяет NextActionByUser = «ManagerUser», затем проверяет NextActionBy на наличие идентификатора пользователя менеджера, и с помощью этого идентификатора пользователя он получает идентификатор электронной почты менеджер из другой таблицы (UserDetails), тогда будет отправлено электронное письмо. Если NextActionByUser ="TechUser" (у TechUser много команд), NextActionBy ="check the TeamName" и каждая команда имеет от 3 до 4 участников, я не хочу отправлять от 3 до 4 электронных писем для каждого SEID, поэтому я сгруппировал SEID, который является общим тот же NextActionBy(Team), таким образом он отправит только 3 электронных письма для SEID, который использует одну и ту же команду.
int maxEmailsToSend = 4; используя (соединение SqlConnection = новый SqlConnection(dbConnectionString)) { соединение.Открыть(); строковый запрос = "ВЫБЕРИТЕ SEID, ДолжноEmailBeSent,NextActionBy,NextActionByUser FROM WorkExtended " + "ГДЕ ДолжноEmailBeSent = 'True' И HasEmailBeenSent = 'False' И EmailSentTime IS NULL "; используя (команда SqlCommand = новая SqlCommand (запрос, соединение)) { используя (SqlDataReader Reader = команда.ExecuteReader()) { Dictionary seidsByTeam = new Dictionary(); интервал электронной почтыSentCount = 0; while (reader.Read() && emailsSentCount < maxEmailsToSend) { int seid = Convert.ToInt32(читатель["SEID"]); bool mustemailbesent = Convert.ToBoolean(reader["ShouldEmailBeSent"]); строка nextActionByUser = Reader["NextActionByUser"].ToString(); если (должно быть отправлено письмо) { если (nextActionByUser == "TechUser") { строка TeamName = GetTeamNameFromNextActionBy (соединение, nextActionByUser, seid); if (!seidsByTeam.ContainsKey(teamName)) { seidsByTeam[teamName] = новый список(); } seidsByTeam[имякоманды].Add(seid); } еще { строка ManagerId = GetManagerUserIdFromNextActionBy (соединение, nextActionByUser, seid); строка ManagerEmail = GetEmailForManagerUser (соединение, ManagerId); если (emailsSentCount < maxEmailsToSend) { ждут SendEmailToRecipient (seid, ManagerEmail); электронная почтаSentCount++; string updateQuery = «UPDATE WorkExtended SET HasEmailBeenSent = 'True', EmailSentTime = CURRENT_TIMESTAMP WHERE SEID = @SEID»; используя (SqlCommand updateCommand = новый SqlCommand (updateQuery, соединение)) { updateCommand.Parameters.AddWithValue("@SEID", seid); updateCommand.ExecuteNonQuery(); Console.WriteLine("Обновленный SEID: " + seid); } } } } } foreach (var teamEntry в seidsByTeam) { строка имя_команды = teamEntry.Key; List seidsForTeam = teamEntry.Value; List techUserEmails = GetEmailsForTechUsers(соединение, имя_команды); если (emailsSentCount < maxEmailsToSend) { int restEmails = maxEmailsToSend - emailsSentCount; int emailsToSendForTeam = Math.Min(remainingEmails, seidsForTeam.Count); если (emailsToSendForTeam > 0) { ждут SendGroupEmail(seidsForTeam.GetRange(0, emailsToSendForTeam), techUserEmails); emailsSentCount += emailsToSendForTeam; } string updateQuery = «UPDATE WorkExtended SET HasEmailBeenSent = 'True', EmailSentTime = CURRENT_TIMESTAMP WHERE SEID = @SEIDs»; используя (SqlCommand updateCommand = новый SqlCommand (updateQuery, соединение)) { updateCommand.Parameters.AddWithValue("@SEIDs", string.Join(",", seidsForTeam.GetRange(0, emailsToSendForTeam))); updateCommand.ExecuteNonQuery(); Console.WriteLine($"Обновленные SEID: {string.Join(", ", seidsForTeam.GetRange(0, emailsToSendForTeam))}"); } } } } } соединение.Закрыть(); Что я хочу:
Я хочу ограничить количество отправляемых электронных писем. Если я установлю maxEmailsToSend = 4, это означает, что ему нужно отправить только 4, не более того. например: согласно моей базе данных, он отправляет электронное письмо для SEID 1 и обновляет базу данных HasEmailBeenSent = 1,EmailSentTime = «дата отправки электронного письма». Теперь остается только 3 электронных письма, затем он проверяет оставшуюся запись, группирует мои SEID 2 и 4, отправляет электронное письмо 3 членам CloudTeam и обновляет мою базу данных. Теперь лимит электронной почты достигнут, и он не должен отправлять электронные письма. Но проблема в том, что он также отправлял электронные письма для SEID 3. Я хочу что-то вроде того, что если лимит достигнут, он не должен отправлять электронные письма. Даже если у него есть еще 1 электронное письмо, оно остается в пределах его лимита, но следующая запись (seid) имеет команду, в которой она должна отправлять почту 3 участникам, она не должна отправляться. Я попробовал что-то в своем коде, но не смог понять, как именно этого добиться.
Спасибо.
Мобильная версия