Einzelnen Beitrag anzeigen

Rolf Frei

Registriert seit: 19. Jun 2006
650 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: In Delphi Alexandria Indy aktualisieren wegen Gmail messageID Fehlermeldung

  Alt 27. Okt 2022, 15:41
Ich nutze die mitgelieferte Version aus D11.

Hatte gerade erst das selbe Problem bei einem Kunden von uns. Irgendwas hat gmail mitte 2022 geändert, so dass nun diese komische Fehlermelung kommt. Ich glaube eigentlich, dass es ein falscher Fehler ist und eigentlich ein ganz anderer Fehler kommen müsste. Wenn du danach googlest wirst du feststellen, dass ab ca. Juni 22 sehr viel zu diesem Thema gefunden wird. Das Problem ist nicht die Indy Komponente, sondern wie du den Absender verwendest.

Das Problem konnte ich hier so lösen, dass ich als Envelopesender nicht die gmail Adresse verwenden, sondern einen auf dem SMTP Server gültige Email, der auf die selbe IP wie der SMTP Server zurück verweist (SPF Check muss funktionieren). Im eigentlichen Mailheader konnte ich die gmail Adresse drin lassen. Im gleichen Zug habe ich auch eine MsgId erstellt, aber diese allein hat das Problem nicht gelöst. Erst durch Verwendung einer lokalen EMailadresse als Sender, hat es funktioniert.

Das Problem ist nun aber noch, dass der Envelopsender nicht so einfach vom Mailheader (TIdMessage.From) unterschiedlich nutzen kann und man dafür die Kommunikation mit dem SMTP Server selber machen muss. Ich habe die folgende Funktion seit vielen Jahren im Einsatz und kann für dich als Info dienen, wie das gemacht werden könnte:

Delphi-Quellcode:
procedure RFIdSMTPSendMail(ASMTP: TIdSMTP; AMsg: TIdMessage; const AMailFrom: String = '');
var
  DoConnect: Boolean;
  MsgID, s: String;
  p: Integer;

  procedure WriteRecipient(const AEmailAddress: TIdEmailAddressItem);
  begin
    ASMTP.SendCmd('RCPT to:<' + AEMailAddress.Address + '>', [250, 251]);
  end;

  procedure WriteRecipients(AList: TIdEmailAddressList);
  var
    i: integer;
  begin
    for i := 0 to AList.Count - 1 do begin
      WriteRecipient(AList[i]);
    end;
  end;

begin
  DoConnect := not ASMTP.Connected;
  if DoConnect then
    ASMTP.Connect();
  try
    p := Pos('@', AMailFrom);
    if p = 0 then
      s := '@deinedomaene.com'  // <- Anpassen für deine Umgebung. Das muss Bestandteil der MsgId sein.
    else
      s := Copy(AMailFrom, p, 255);
    MsgID := RFDeleteChars(RFGetNewGUID, ['{', '}', '-']) + s;
{$IFDEF INDY10_6}
    AMsg.MsgId := MsgID;
{$ELSE}
    AMsg.Headers.Values['Message-ID'] := '<' + MsgID + '>';
{$ENDIF}

    ASMTP.SendCmd('RSET');
    if AMailFrom <> 'then // Envelopesender abweichend vom MailHeader FROM
      ASMTP.SendCmd('MAIL FROM:<' + AMailFrom + '>', 250)
    else if AMsg.Sender.Address <> 'then
      ASMTP.SendCmd('MAIL FROM:<' + AMsg.Sender.Address + '>', 250)
    else
      ASMTP.SendCmd('MAIL FROM:<' + AMsg.From.Address + '>', 250);
    WriteRecipients(AMsg.Recipients);
    WriteRecipients(AMsg.CCList);
    WriteRecipients(AMsg.BccList);
    ASMTP.SendCmd('DATA', 354);
    AMsg.ExtraHeaders.Values['X-Mailer'] := ASMTP.MailAgent;

    ASMTP.SendMsg(AMsg);
    ASMTP.SendCmd('.', 250);
  finally
    if DoConnect then
      ASMTP.Disconnect;
  end;
end;

Geändert von Rolf Frei (27. Okt 2022 um 15:45 Uhr)
  Mit Zitat antworten Zitat