Delphi XE i wysyłka maila na Gmail.com

0

Witam,
Mam w programie zrobioną wysyłkę wiadomości email i gdy wysyłam wiadomości na GMAIL'a to otrzymuję zwrotkę z błędem

64.233.165.26 failed after I sent the message.
Remote host said: 550-5.7.1 [46.41.157.43] Messages missing a valid messageId header are not
550 5.7.1 accepted. k4-20020a2e8884000000b0025e5781994bsi1482932lji.80 - gsmtp

Samą wysyłkę robię w ten sposób:

builder := TIdMessageBuilderHtml.Create;
builder.Html.Text := TrescWiadomosci;
builder.HtmlCharSet := 'utf-8';
builder.FillMessage(idmsg1); // idsmg1 -> komponent TIdMessage wrzucony na formę.
builder.Free;

with idmsg1 do
begin
  InReplyTo := barxcomOd.EditValue;
  from.Address := barxcomOd.EditValue;
  from.Domain := 'domena';
  from.Name := 'nazwa';
  from.User := 'user';
  ReceiptRecipient.Address := barxcomOd.EditValue;
  Subject := barxcomTemat.EditValue;
  Recipients.EMailAddresses := '[email protected]';
end;

// idsmtp -> komponent TIdSMTP wrzucony na formę.
idsmtp1.host := 'host';
idsmtp1.Username := barxcomOd.EditValue;
idsmtp1.Password := 'haslo';
idsmtp1.port := 587;
idsmtp1.Connect;
if idsmtp1.Connected then
idsmtp1.Send(idmsg1);
  

Wszystko ładnie niby przechodzi, wysyłka jest niby zakańczana powodzeniem ale wiadomość do adresata nie dochodzi a ja otrzymuję zwrotkę z błędem jak wyżej.
Dzieje się to tylko gdy wysyłam wiadomości na GMAIL'a. Gdy próbuje wysłać na inne domeny np o2.pl czy interia.pl to wszystko ładnie przechodzi.

Próbowałem też generować ręcznie Message-ID

MessageId := GenerateUniqueMessID;
idmsg1.msgid := MessageId;

idmsg1.AddHeader('Message-ID=' + MessageId);
// lub
idmsg1.ExtraHeaders.Values['Message-ID'] := MessageId;

Niestety nic to nie zmienia. Błędy nadal występują.

Czy ktoś ma jakiś pomysł o co chodzi?

2

Nie chce mi się zgłęboiać przyczyny u mnie działa i wygląda to tak jak poniżej.
Przypuszczalnie chodzi o:

      S1.SSLEnabled := StrToBool(TParam.GetParam('Klient SMTP', 'Parametry SMTP', 'Parametry SMTP', 'SSL'));
      S1.SSLTLS := TParam.GetParam('Klient SMTP', 'Parametry SMTP', 'Parametry SMTP', 'SSLTLS');
procedure TEmail.Send;
var
  S1: TSMTPClient;
  jsleep: integer;
  M: TEmailMessage;
begin
  inherited;

  S1 := TSMTPClient.Create;

  if GlobalConfig.uzytkownik.SaDaneEMAIL and
    (NOT(uppercase(Trim(TParam.GetParam('Klient SMTP', 'Parametry SMTP', 'Parametry SMTP', 'Mail tylko przez główne konto'))) = 'TAK')) then
  begin

    with GlobalConfig.uzytkownik do
    begin
      InfoPoWyslaniu := 'Wiadomość wysłana. Z adresu ' + MAIL_FROM;
      S1.Server := MAIL_SERWER;
      S1.AuthRequired := MAIL_WYMAGA_AUTO;
      S1.AuthLogin := MAIL_LOGIN;
      S1.AuthPassword := MAIL_HASLO;
      S1.MailFrom := MAIL_FROM;
      S1.MailReplyTo := MAIL_REPLY_TO;
      S1.Port := MAIL_PORT_SMTP;
      S1.SSLEnabled := MAIL_SSL = '1';
      if (KOPIA_DO.Text <> '') and (Pos(MAIL_FROM, KOPIA_DO.Text) = 0) then
        KOPIA_DO.Text := KOPIA_DO.Text + ';' + MAIL_FROM
      else
        KOPIA_DO.Text := MAIL_FROM;
    end;

  end else
  begin
    InfoPoWyslaniu := '';
    S1.Server := TParam.GetParam('Klient SMTP', 'Parametry SMTP', 'Parametry SMTP', 'Serwer');
    S1.AuthRequired := StrToBool(TParam.GetParam('Klient SMTP', 'Parametry SMTP', 'Parametry SMTP', 'Autoryzacja wymagana'));
    S1.AuthLogin := TParam.GetParam('Klient SMTP', 'Parametry SMTP', 'Parametry SMTP', 'Login');
    S1.AuthPassword := DeCodeStr(TParam.GetParam('Klient SMTP', 'Parametry SMTP', 'Parametry SMTP', 'Hasło'));
    S1.MailFrom := TParam.GetParam('Klient SMTP', 'Parametry SMTP', 'Parametry SMTP', 'Mail from');
    S1.MailReplyTo := TParam.GetParam('Klient SMTP', 'Parametry SMTP', 'Parametry SMTP', 'Mail Reply To');
    S1.Port := StrToInt(TParam.GetParam('Klient SMTP', 'Parametry SMTP', 'Parametry SMTP', 'Port SMTP'));
    S1.SSLEnabled := StrToBool(TParam.GetParam('Klient SMTP', 'Parametry SMTP', 'Parametry SMTP', 'SSL'));
    S1.SSLTLS := TParam.GetParam('Klient SMTP', 'Parametry SMTP', 'Parametry SMTP', 'SSLTLS');
  end;

  if S1.SSLTLS = typTLSv1 then // 2021.12
    if S1.IsConnection then // to sie tylko laczy i rozlacza - a w M.Send łączy się ponownie co powoduje błąd.
    begin
    end else
    begin
      errorMessage := S1.Errors.Text;
      XMessageBox(handle, 'NIE możesz wysyłać wiadomości email, źle skonfigurowany klient SMTP lub błąd połączenia !' + S1.Errors.Text, 'Uwaga', 0);
      status := -1;
      Screen.Cursor := crDefault;
      exit;
    end;

  Screen.Cursor := crHourGlass;
  M := TEmailMessage.Create;


  M.SMTPClient := S1;
  M.EmailType := 'html';
  M.EmailMessage := GetCmpntValue(TRESC);
  M.EmailTo := GetCmpntValue(ODBIORCA);
  M.EmailCC := GetCmpntValue(KOPIA_DO);
  M.EmailTitle := GetCmpntValue(TEMAT);
  M.Attachments.Text := ZALACZNIKI.Text;

  if M.status <> 'ready' then
    begin
      InfoPoWyslaniu := '';
      errorMessage := 'Nie udało się wysłać wiadomości.' + #13#10 + #13#10 + M.Errors.Text;
      XMessageBox(handle, errorMessage, 'Nie można wysłać wiadomości', 0);
      status := -1;
    end
  else
    begin
      status := 0;
      errorMessage := '';
    end;



end;

0

U mnie też działa (sprawdzone z WP), być może nadawca wylądował na "czarnej liście" i dlatego odrzuca.

0

@kAzek: Na czarnej liście na pewno nie ma nadawcy. Wysyłamy z naszego firmowego maila na również nasz służbowy na GMAIL'u. Co ciekawe gdy wysyłam z innego maila np z O2.PL to na GMAIL'u przychodzi ta wiadomość. Ale jak wysyłam z firmowego to już nie dochodzi i otrzymuję zwrotkę. Wcześniej takich problemów nie było, w kodzie nic nie zmieniałem a teraz są kłopoty z tym GMAIL'em.

0

to wyślij maila ze strony i zobacz czy dojdzie

0

https://mxtoolbox.com/deliverability
Wyślij wiadomość ze strony a później z aplikacji i porównaj wyniki.

0

Odkopie trochę temat. Wróciłem do problemu ale nadal nie mogę go rozwiązać. Wysyłanie email'a ze klienta pocztowego na stronie WWW przechodzi bez problemu. Gdy wysyłam przez Delphi to ciągle mam zwrotkę.

Zapytam natomiast o wysyłkę email'a zamiast "na" konto GMAIL to "z" konta Gmail.

Gdy próbuje wysłać ze swojego GMAILA w Delphi to mam błąd:
"Username and Password not accepted. Learn more at https://support.google.com/mail/?p=BadCredentialsq18029929a956512211200b00492cfecf1c0sm295020lfr.245 - gsmtp"

Na koncie GMAIL mam włączony POP oraz IMAP. Kiedyś była opcja, że można było używać mniej bezpiecznych urządzeń, ale teraz ją wyłączyli.
Próbowałem ustawiać port 587 i utUseExplicitTLS oraz port 465 i utUseImplicitTLS jednak efekt jest ten sam.

SmtpPort := StrToInt(rgPort.Items[rgPort.ItemIndex]); // 587 lub 465

 case rgTLS.ItemIndex of
   0:
     idsmtp1.UseTLS := utNoTLSSupport;
   1:
     idsmtp1.UseTLS := utUseExplicitTLS;
   2:
     idsmtp1.UseTLS := utUseImplicitTLS;
   3:
    idsmtp1.UseTLS := utUseRequireTLS;
 end;

  idsmtp1.host := MY_HOST;
  idsmtp1.Username := MY_USERNAME;
  idsmtp1.Password := MY_PASS;
  idsmtp1.port := SmtpPort;
  idsmtp1.Connect;

if idsmtp1.Connected then
    idsmtp1.Send(idmsg1)

Czy coś należy dodatkowo ustawić aby wysyłka z GMAIL'a przeszła?

0

Mam konto na Google Workspace i tam mam włączony dostęp dla mniej bezpiecznych urządzeń i wysyłanie maili działa (wg opisu Marco Cantu https://www.marcocantu.com/tips/oct06_gmail.html).
Ze zwykłego konta gmail takie wysyłanie już nie działa. Czyli jednoznacznie jest to problem blokady mniej bezpiecznych urządzeń.
Jednak wg pomocy w Google: https://support.google.com/accounts/answer/185833
jak włączysz weryfikacje dwuetapową a następnie wygenerujesz 16 znakowe hasło dla aplikacji to powinny zadziałać także aplikacje mniej bezpieczne.
Jest to według Google niezalecane i zapewne w przyszłości to wyłączą.

Acha - nie testowałem tego!

Chyba jednak najlepszym rozwiązaniem będzie albo zmiana serwera wysyłającego maile albo jednak logowanie przez Google ale nie jest to takie proste, tokeny itp.

3

Witam,
Udało mi się rozwiązać problem z wysyłką z GMAIL'a oraz na GMAIL.
Gdyby ktoś potrzebował informacji jak i co:

Żeby można było wysłać z GMAIL'a to należy na swoim koncie Google włączyć weryfikacje 2-etapową oraz ustawić 16 znakowe hasło do aplikacji. Następnie podczas wysyłki wpisujemy wygenerowane hasło zamiast swojego normalnego do GMAIL'a.

Natomiast jeśli chodzi o wysyłkę na GMAIL i otrzymywaniem zwrotki ": Messages missing a valid messageId header are not 550 5.7.1 accepted." to dobrze kombinowałem z dodaniem Message-ID: idmsg1.ExtraHeaders.Values['Message-ID'] := MyMessageId; tylko okazało się, że brakowało mi nawiasów :)

Postać jaką powinien mieć parametr Message-ID to np: <3847584598.38457.2857632487123@[moj_host].pl> // Losowy ciąg liczb oraz ostre nawiasy muszą być dodane w Message-ID

To tyle ode mnie. Temat zakończony.

1 użytkowników online, w tym zalogowanych: 0, gości: 1