C# - SMTP Gmail - problem

C# - SMTP Gmail - problem
AS
  • Rejestracja:około 8 lat
  • Ostatnio:około 4 lata
  • Postów:9
0

Cześć,

Przychodzę z problemem wysyłania wiadomości za pomocą metodyki SMTP - GMAIL. Opracowałem funkcjonalność, która nie działa w określonych przypadkach - sieci lokalne, firmy, serwer (opublikowanie API na serwerze). Dla danego konta GMAIL włączona opcja aplikacji nieznanych. Próbowałem wielu sposobów. System wypluwa wyjątek, że nie można rozpoznać nazwy zdalnej hosta 'smtp.gmail.com'

Na pewno spotkaliście się z podobnym problemem, mogę prosić o rady? Dziękuję.

cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Poznań
  • Postów:8802
1

Pytanie - czy mówimy o darmowym Gmailu, czy w ramach płatnego google Workspace?

O ile kojarzę, to w tym drugim przypadku administrator musi wyrazić zgodę. Na pewno trzeba odblokować IMAP, ale coś mi świta, że ogólnie dostęp inny niż przez WWW może być wyłączony/zablokowany (a nawet nie jestem pewien, czy nie jest to ustawienie domyślne).


AS
Mówimy o darmowym.
cerrato
No to nie pomogę ;)
AS
Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:dzień
1

System wypluwa wyjątek, że nie można rozpoznać nazwy zdalnej hosta 'smtp.gmail.com'

Twój komputer na którym masz aplikację ma poprawnie skonfigurowany DNS? To nie jest problem z twoim programem, to jest problem z siecią.

AS
Tak, ale chciałbym wdrożyć usługę, która zadziała - wysyłanie wiadomości - niezależnie gdzie zainstalujesz aplikację, prywatnie lub w firmach. Jest taka możliwość? Co polecasz poza SMTP?
AN
Skonfigurowanie DNS (w 99% przypadków dzieje się to automatycznie) jest podstawą działania internetu. Co do wysyłki e-mail, to moim zdaniem nie ma nic lepszego od SMTP, który jest uniwersalny. Możliwe, że GMail ma jakieś swoje API, ale nie warto sobie tym zawracać głowy.
AN
  • Rejestracja:około 19 lat
  • Ostatnio:około 7 godzin
0

Za pomocą jakiej biblioteki wysyłasz maile?

W .NET jest standardowa funkcja wysyłania maila, chyba System.Net.Mail. On nie radzi sobie we wszystkich przypadkach. Zdecydowanie lepszym rozwiązaniem jest https://www.nuget.org/packages/MimeKit/ i https://www.nuget.org/packages/MailKit/.

W Gmail darmowym działa bardzo dobrze, tylko pamiętam, że trzeba było zalogować się na Google w przeglądarce i coś włączyć w ustawieniach, nie pamiętam teraz co, ale jak poszukasz, jak skonfigurować standardowy program pocztowy do współpracy z GMail, to tam będzie napisane, co i jak ustawić.

Jak chodzi o samo wysyłanie maila, to Twój program niczym nie różni się od oprogramowania typu Outlook, Thunderbird itp.

Najlepiej to ustaw program pocztowy według info z internetu, jak on będzie wysyłać maile, to Twój program również, nie ma innej opcji.

edytowany 3x, ostatnio: andrzejlisek
AS
Tak, System.Net.Mail - poniżej w odpowiedzi dodałem kod źródłowy, na lokalnej maszynie działa bardzo okej, w ustawieniach gmail'a trzeba zaznaczyć akceptację aplikacji nieznanych. Ale po opublikowaniu na hostingu jest problem, problem też jest w firmach lub specyficznych połączenia lokalnych.
AN
Czy jesteś w stanie zainstalować jakiś typowy program do poczty i sprawdzić, czy da się go ustawić "w firmie lub przy specjalnym połączeniu"? A skrzynki mailowe inne niż GMail próbowałeś?
AS
  • Rejestracja:około 8 lat
  • Ostatnio:około 4 lata
  • Postów:9
0

Dodam do wypowiedzi:

Kopiuj
private async void sendEmail()
        {
            string emailTitle = "test1";
            string emailMessage = "test2";
            SmtpClient smtpRecipientUser = new SmtpClient();
            smtpRecipientUser.Port = 25;
            smtpRecipientUser.Host = "smtp.gmail.com";
            smtpRecipientUser.EnableSsl = true;
            smtpRecipientUser.Timeout = 10000;
            smtpRecipientUser.DeliveryMethod = SmtpDeliveryMethod.Network;
            smtpRecipientUser.UseDefaultCredentials = false;
            smtpRecipientUser.Credentials = new System.Net.NetworkCredential("username", "#######password");
            string emailRecipient = "emailRecipient";
            MailMessage messageActiveSendUser = new MailMessage(emailRecipient, emailRecipient, emailTitle, emailMessage);
            messageActiveSendUser.Priority = System.Net.Mail.MailPriority.High;
            messageActiveSendUser.BodyEncoding = UTF8Encoding.UTF8;
            messageActiveSendUser.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
            await smtpRecipientUser.SendMailAsync(messageActiveSendUser);
        }

Tak aktualnie wygląda przykładowy kod źródłowy - jeśli uruchomię na lokalnym hoście - wszystko jest w porządku, w momencie publikacji na serwerze (przykładem jest webio) zwracany jest błąd krytyczny w związku z nierozpoznanym zdalnym hostem smtp.gmail.com - muszę spróbować teraz z MimeKit'em.

AS
  • Rejestracja:około 8 lat
  • Ostatnio:około 4 lata
  • Postów:9
0

Wrzuciłem dodatkowo MimeKit - lokalnie działa, nie ma problemu, po opublikowaniu na serwerze klapa.

Kopiuj
            var email = new MimeMessage();
            email.From.Add(MailboxAddress.Parse("test@gmail.com"));
            email.To.Add(MailboxAddress.Parse(emailrecipient));
            email.Subject = "test";
            email.Body = new TextPart(TextFormat.Plain) { Text = "test" };
            using var smtp = new SmtpClient();
            smtp.Connect("smtp.gmail.com", 587, SecureSocketOptions.StartTls);
            smtp.Authenticate("test@gmail.com", "password");
            smtp.Send(email);
            smtp.Disconnect(true);
BO
  • Rejestracja:około 6 lat
  • Ostatnio:9 dni
  • Postów:214
0
Kopiuj
public async static void SendEmail()
        {
            MailAddress to = new MailAddress("adresto");
            MailAddress addressFrom = new MailAddress("mailFrom@gmail.com", "***");
            MailMessage message = new MailMessage(addressFrom, to)
            {
                Subject = "***",
                Body = $"*******",
                IsBodyHtml = true
            };

            SmtpClient client = new SmtpClient
            {
                Host = "smtp.gmail.com",
                Port = 587,
                UseDefaultCredentials = false,
                Credentials = new NetworkCredential("****", "******"),
                EnableSsl = true
            };
            
            try
            {
                await client.SendMailAsync(message);
            }

            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }

Coś takiego kiedyś napisałem

edytowany 1x, ostatnio: Botek
AN
  • Rejestracja:około 19 lat
  • Ostatnio:około 7 godzin
1

Czy wysłanie maila z innej skrzynki niż GMail na hostingu działa poprawnie?

Prawdopodobnie w aplikacji wszystko masz dobrze, tylko na hostingu jest jakiś problem.

Jaki jest system operacyjny i aplikacja serwera na hostingu? Jest to Windows i aplikacja IIS, czy Linux i serwer Apache lub NginX? W imieniu jakiego użytkownika pracuje serwer? Może da się choćby na próbę uruchomić serwer na użytkowniku z pełnymi uprawnieniami?

Czy pomiędzy serwerem hostującym a internetem jest jakikolwiek firewall? Może da się całkowicie go zlikwidować lub przynajmniej przepuścić cały ruch na portach 25, 587 i 465?

Nigdy nie miałem do czynienia z usługą hostingu ASP.NET, więc ja dalej nie pomogę, ale ktoś inny może pomoże lub warto dopytać się informatyków w firmie hostingowej.

AS
Nie próbowałem, muszę pierw przejść ścieżkę pełnej konfiguracji na hostingu, myślę, że informatycy z platformy powinni pomóc - to będzie najlepsze wyjście czyli implementacja procesu do wysyłania wiadomości z serwera i pełna konfiguracja po jego stronie oraz trzymanie kluczy i pass'ów w secrets'ach po stronie API. Bo wtedy user jeśli będzie mieć apkę niezależnie od miejsca i firewall w miejscu np: pracy (firma blokuje i nadaje ograniczenia) wysyła do api zapytanie i proces się wykonuje po stronie serwera, myślisz, że to najlepszy sposób na ten moment?
AN
Pomysł wydaje się być najlepszy, ale wszystko wygląda na to, że problem nie dotyczy implementacji w C#, tylko jest problem z obsługą skrzynki pocztowej w określonych przypadkach. Firewall na ogół nie ogranicza komunikacji używanej przez POP3, SMTP i IMAP, jedynie w niektórych przypadkach może być zamknięta komunikacja na porcie 25. Poza tym, każda firma hostingowa ma swoje skrzynki, które zmożesz mieć bez dodatkowych opłat. Proponuję na próbę wysłać maila z ichniej skrzynki. Z tego właśnie powodu proponowałem test z inną skrzynką oraz ustawienie programu Thunderbird/Outlook
AS
Tak zrobię, założę takową skrzynkę na używanym hostingu (webio), skonfiguruję i podzielę się rezultatem oraz rozwiązaniem jeśli wszystko będzie działać.
AN
  • Rejestracja:około 19 lat
  • Ostatnio:około 7 godzin
0

Co do portów to próbuj 587 bez SSL lub 465 z SSL.

W przypadku System.Net.Mail jest taki problem, ze nie potrafi nawiązać połączenia SSL, tylko nawiązuje połączenie na porcie bez szyfrowania, a potem na nim spróbować włączyć SSL, dlatego działa poprawnie 587 z EnableSSL=true, ale nie wiadomo, czy serwer Gmail zgodził się na to i czy komunikacja jest faktycznie szyfrowana.

edytowany 1x, ostatnio: andrzejlisek
JP
  • Rejestracja:ponad 7 lat
  • Ostatnio:5 miesięcy
  • Postów:1065
1

Firewall, hosta. Telnet z serwera do Google na typ porcie. Ping itp.

JP
Hosts W etc/hosts

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.