Wysyłanie maila - timeout

Wysyłanie maila - timeout
NZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
0
Kopiuj
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? 🙁

RJ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 480
0

Attempt na spod bo obecnie mając max retries 3 uderzysz tylko 2 razy bo inkrementujesz od razu.
To co z konfiga wpada to ok? Serwer SMTP żywy? Na pewno pod dobry port się dobijasz ?

NZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
0

z hostingu do skrzynki SMPT mam dane:

Ustawienia zabezpieczeń SSL/TLS (Zalecane)
Nazwa użytkownika: backup@domena.com.pl
Hasło: Użyj hasła konta poczty e-mail.
Serwer komunikacji przychodzącej: mail.domena.com.pl
IMAP Port: 993 POP3 Port: 995
Serwer komunikacji wychodzącej: mail.domena.com.pl
SMTP Port: 465
IMAP; POP3 i SMTP wymaga uwierzytelniania.

konfiguracja:

Kopiuj
"Mail": {
    "SmtpHost": "mail.domena.com.pl",
    "Port": 465,
    "User": "backup@domena.com.pl",
    "Password": "password",
    "To": "moj@prywatnymail.pl"
  }

RJ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 480
0

Spróbuj może złożyć requesta curlem i zobaczyć na response. W innerExceptionie nie masz nic, co mogłoby wskazać na więcej przy tym timeoucie?

NZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
0

Nie rozumiem tego co napisałeś? Możesz jaśniej.

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Toruń
1

Przetestuj czy poczta wychodzi tym narzędziem:
https://github.com/nekno/SMTP-Tester

Damian Korczowski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 111
1

Hej,

użyj MailKit, z C# biblioteką miałem podobne problemy jak Twoje:

https://mimekit.net/

Pozdrawiam.

NZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
1

Przepisany na mimekit działa od razu 😀
Problem wynikał prawdopodobnie z tego, że bibliotek net mail nie wysyła SMPT... i trzeba byłoby robić ręczne obejścia, a z tego co widzę biblioteka sama to załatwia..

Kopiuj
using System;
using System.Threading.Tasks;
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;

namespace BackupApp
{
    public class MailNotifier
    {
        private readonly Config _config;
        private readonly int _maxRetries = 3;
        private readonly int _retryDelay = 5000; // ms

        public MailNotifier(Config config) => _config = config;

        public async Task SendAsync(string subject, string body)
        {
            int attempt = 0;

            while (attempt < _maxRetries)
            {
                try
                {
                    var message = new MimeMessage();
                    message.From.Add(new MailboxAddress("Backup", _config.Mail.User));
                    message.To.Add(new MailboxAddress("Admin", _config.Mail.To));
                    message.Subject = subject;
                    message.Body = new TextPart("plain") { Text = body };

                    using var client = new MailKit.Net.Smtp.SmtpClient();
                    Logger.Info($"Wysyłam maila: {subject}");

                    await client.ConnectAsync(_config.Mail.SmtpHost, _config.Mail.Port, SecureSocketOptions.SslOnConnect);
                    await client.AuthenticateAsync(_config.Mail.User, _config.Mail.Password);

                    await client.SendAsync(message);
                    await client.DisconnectAsync(true);

                    Logger.Info("Mail wysłany pomyślnie.");
                    break;
                }
                catch (Exception ex)
                {
                    attempt++;
                    Logger.Error($"Błąd wysyłania maila, próba {attempt}/{_maxRetries}", ex);

                    if (attempt < _maxRetries)
                    {
                        Logger.Info($"Ponawiam po {_retryDelay / 1000} sekundach...");
                        await Task.Delay(_retryDelay);
                    }
                    else
                    {
                        Logger.Error("Nie udało się wysłać maila po kilku próbach.");
                    }
                }
            }
        }
    }
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.