using System.Net;
using System.Net.Mail;
using BackupApp;
public class MailNotifier
{
private readonly Config _config;
private readonly int _maxRetries;
public MailNotifier(Config config, int maxRetries = 3)
{
_config = config;
_maxRetries = maxRetries;
}
public async Task Send(string subject, string body)
{
int attempt = 0;
bool sent = false;
while (attempt < _maxRetries && !sent)
{
attempt++;
try
{
Logger.Info($"Wysyłam mail (próba {attempt}/{_maxRetries})...");
using var client = new SmtpClient(_config.Mail.SmtpHost, _config.Mail.Port)
{
Credentials = new NetworkCredential(_config.Mail.User, _config.Mail.Password),
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
Timeout = 30000
};
if (_config.Mail.Port == 465)
client.TargetName = $"SMTPS/{_config.Mail.SmtpHost}";
var msg = new MailMessage(_config.Mail.User, _config.Mail.To, subject, body);
await client.SendMailAsync(msg);
Logger.Info("Mail wysłany pomyślnie.");
sent = true;
}
catch (SmtpException ex) when (ex.StatusCode == SmtpStatusCode.TransactionFailed || ex.InnerException is IOException)
{
Logger.Error("Błąd wysyłki maila, ponawiam...", ex);
await Task.Delay(5000);
}
catch (Exception ex)
{
Logger.Error("Błąd wysyłki maila – nieudana próba", ex);
break;
}
}
if (!sent)
Logger.Error($"Nie udało się wysłać maila po {_maxRetries} próbach.");
}
}
[2025-09-23 14:07:55] Wysyłam powiadomienie mailowe...
[2025-09-23 14:09:35] ERROR: Błąd wysyłania maila
System.Net.Mail.SmtpException: The operation has timed out.
Czemu?