{"id":4155,"date":"2020-10-16T15:56:03","date_gmt":"2020-10-16T14:56:03","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=4155"},"modified":"2025-06-20T10:56:31","modified_gmt":"2025-06-20T09:56:31","slug":"4155-2","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/4155-2\/","title":{"rendered":"Delphi Builder example"},"content":{"rendered":"\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"lua\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Mail := MailBuilder\n\t.SetSender('no-reply@test.com')\n\t.AddRecipient('test@test.com')\n\t.AddRecipient('test@test.com')\n\t.AddCC('manager@test.com')\n\t.AddBCC('archive@test.com')\n\t.SetSubject('This is a subject')\n\t.SetContent('This is the content')\n\t.AddAttachment('Test.pdf', 'application\/pdf')\n\t.Build();\n\t\nMail.Send();<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">unit Helpers.Email;\n\ninterface\n\nuses\n  SysUtils,\n  Email.MailAttachment,\n  Email.MailBuilder,\n  Email.Mail,\n  Email.MailServerBuilder,\n  Email.MailPriority,\n  Helpers.logging;\n\ntype\n  TMailAttachment     = Email.MailAttachment.TMailAttachment;\n  TMailBuilder        = Email.MailBuilder.TMailBuilder;\n  TMailBuildResult    = Email.MailBuilder.TMailBuildResult;\n  TMailServerSettings = Email.MailServerBuilder.TMailServerSettings;\n  TSendMailResult     = Email.MailServerBuilder.TSendMailResult;\n  TMailServerBuilder  = Email.MailServerBuilder.TMailServerBuilder;\n  TMailPriority       = Email.MailPriority.TMailPriority;\n\nfunction MailBuilder(AUseDefaults: Boolean = true): TMailBuilder;\nvar MailServer: TMailServerBuilder;\nvar MailLogger: TLogger;\n\n\nimplementation\n\nfunction MailBuilder(AUseDefaults: Boolean = true): TMailBuilder;\nbegin\n  Result := TMailBuilder.Create;\n  if (AUseDefaults) then\n    MailServer.AddDefaults(Result);\nend;\n\nvar \n  DefaultMailLoggingConfig: TLoggerConfig;\n\ninitialization \n  MailServer:= TMailServerBuilder.Create;\n  MailServer.LoadFromIniFile('.\\SMTP.ini');\n\n  DefaultMailLoggingConfig.FileName := '.\\log\\SMTP.log';\n  DefaultMailLoggingConfig.LogLevel := ltTrace;  \n  MailLogger := TLogger.Create(TLogger.ReadConfig('.\\smtp-logging.ini', DefaultMailLoggingConfig));\n  MailLogger.Info('SMTP log started.');\n\nfinalization\n  FreeAndNil(MailServer);\n  FreeAndNil(MailLogger)\nend.\n\n\n\n\/\/\/\/\/\/\/\n\n\nunit Email.MailBuilder;\n\ninterface\n\nuses\n  variants, SysUtils, System.Classes, System.Generics.Collections, Email.Mail, Email.MailPriority;\n\ntype\n  TMailBuildResult = record\n    Valid: Boolean;\n    ExecptionMessage: string;\n    Mail: TMail;\n  end;\n\n  TMailBuilder = class\n  private\n    FMail: TMail;\n    function _AddTo(AEmail: string): TMailBuilder;\n    function _AddCC(AEmail: string): TMailBuilder;\n    function _AddBCC(AEmail: string): TMailBuilder;\n  public\n    constructor Create;\n    destructor Destroy; override;\n    function SetFrom(AEmail: string): TMailBuilder;\n    function AddTo(AEmail: string): TMailBuilder; overload;\n    function AddTo(AEmails: TArray&lt;string>): TMailBuilder; overload;\n    function AddCC(AEmail: string): TMailBuilder; overload;\n    function AddCC(AEmails: TArray&lt;string>): TMailBuilder; overload;\n    function AddBCC(AEmail: string): TMailBuilder; overload;\n    function AddBCC(AEmails: TArray&lt;string>): TMailBuilder; overload;\n    function SetPriority(APriority: TMailPriority): TMailBuilder;\n\n    function ClearTo(): TMailBuilder;\n    function ClearCC(): TMailBuilder;\n    function ClearBCC(): TMailBuilder;\n\n    function SetSubject(AText: string): TMailBuilder;\n    function ClearContent: TMailBuilder;    \n    function AddContent(AText: string): TMailBuilder;\n\n    function ClearHtmlContent: TMailBuilder;\n    function AddHtmlContent(AText: string): TMailBuilder;\n    function AddAttachment(AAttachmentName: string; AContentType: string; AContent: TStream; AFreeAfterSend: Boolean = false; AContentId: string = ''): TMailBuilder;\n\n    function AddFileAttachment(AFileNames: TArray&lt;string>): TMailBuilder; overload;\n    function AddFileAttachment(AFileName: string): TMailBuilder; overload;\n    function GetDebugContent: string;\n    function Build: TMailBuildResult;\n    class function IsEmailaddressValid(AEmail: String): Boolean;    \n  end;\n\nimplementation\n\nuses Email.MailAttachment, Email.MailServerBuilder;\n\n\n\nconstructor TMailBuilder.Create;\nbegin\n  FMail := TMail.Create;\nend;\n\ndestructor TMailBuilder.Destroy;\nbegin\n  FreeAndNil(FMail);\n  inherited;\nend;\n\nfunction TMailBuilder.GetDebugContent: string;\nvar\n  stringList: TStringList;\nbegin\n  stringList := TStringList.Create;\n  try\n\n    stringList.Add('From: ');\n    stringList.Add(Self.FMail.From);        \n    stringList.Add('-------------------------------------------------------------');        \n    stringList.Add('To: ');\n    stringList.Add(string.Join('; ' ,Self.FMail.ToList.ToArray));    \n    stringList.Add('-------------------------------------------------------------');        \n    stringList.Add('Cc: ');\n    stringList.Add(string.Join('; ' ,Self.FMail.CCList.ToArray));    \n    stringList.Add('-------------------------------------------------------------');     \n    stringList.Add('Bcc: ');\n    stringList.Add(string.Join('; ' ,Self.FMail.BCCList.ToArray));    \n    stringList.Add('-------------------------------------------------------------');     \n    stringList.Add('Subject: ');\n    stringList.Add(Self.FMail.Subject);    \n    stringList.Add('-------------------------------------------------------------');         \n    stringList.Add('Content: ');\n    stringList.Add(Self.FMail.Content);    \n    stringList.Add('-------------------------------------------------------------');        \n    Result := stringList.Text;\n  finally\n    stringList.Free;\n  end;\nend;\n\nclass function TMailBuilder.IsEmailaddressValid(AEmail: string): Boolean;\nbegin\n  Result := AEmail.Trim() &lt;> '';\nend;\n\nfunction TMailBuilder.Build: TMailBuildResult;\nbegin\n  Result.Valid := false;\n  if not IsEmailaddressValid(FMail.From) then\n  begin\n    Result.ExecptionMessage := 'Invalid mail \"From\" address';\n  end\n  else if FMail.ToList.Count = 0 then\n  begin\n    Result.ExecptionMessage := 'No valid mail \"To\" address';\n  end\n  else\n  begin\n    Result.Valid := true;\n    Result.Mail := FMail;\n  end;\nend;\n\nfunction TMailBuilder.SetFrom(AEmail: string): TMailBuilder;\nbegin\n  if IsEmailaddressValid(AEmail) then\n    FMail.From := Trim(AEmail);\n  Result := self;\nend;\n\nfunction TMailBuilder.SetPriority(APriority: TMailPriority): TMailBuilder;\nbegin\n  FMail.Priority := APriority;\n  result := self;\nend;\n\nfunction TMailBuilder.AddTo(AEmails: TArray&lt;string>): TMailBuilder;\nvar\n  str: string;\nbegin\n  for str in AEmails do\n    _AddTo(str);\n  Result := self;\nend;\n\nfunction TMailBuilder.AddTo(AEmail: string): TMailBuilder;\nbegin\n  result := AddTo(AEmail.Split([';']));\nend;\n\nfunction TMailBuilder._AddTo(AEmail: string): TMailBuilder;\nbegin\n  if IsEmailaddressValid(AEmail) then\n    FMail.ToList.Add(Trim(AEmail));\n  Result := self;\nend;\n\nfunction TMailBuilder.AddCC(AEmails: TArray&lt;string>): TMailBuilder;\nvar\n  str: string;\nbegin\n  for str in AEmails do\n    _AddCC(str);\n  Result := self;\nend;\n\nfunction TMailBuilder.AddCC(AEmail: string): TMailBuilder;\nbegin\n  result := AddCC(AEmail.Split([';']));\nend;\n\nfunction TMailBuilder._AddCC(AEmail: string): TMailBuilder;\nbegin\n  if IsEmailaddressValid(AEmail) then\n    FMail.CCList.Add(Trim(AEmail));\n  Result := self;\nend;\n\n\nfunction TMailBuilder.ClearContent(): TMailBuilder;\nbegin\n  FMail.Content := '';\n  Result := self;\nend;\n\n\nfunction TMailBuilder.ClearHtmlContent(): TMailBuilder;\nbegin\n  FMail.HtmlContent := '';\n  Result := self;\nend;\n\n\nfunction TMailBuilder.AddContent(AText: string): TMailBuilder;\nbegin\n  FMail.Content := FMail.Content + AText;\n  Result := self;\nend;\n\nfunction TMailBuilder.AddBCC(AEmails: TArray&lt;string>): TMailBuilder;\nvar\n  str: string;\nbegin\n  for str in AEmails do\n    _AddBCC(str);\n  Result := self;\nend;\n\nfunction TMailBuilder.AddBCC(AEmail: string): TMailBuilder;\nbegin\n  Result := AddBCC(AEmail.Split([';']));\nend;\n\nfunction TMailBuilder._AddBCC(AEmail: string): TMailBuilder;\nbegin\n  if IsEmailaddressValid(AEmail) then\n    FMail.BCCList.Add(Trim(AEmail));\n  Result := self;\nend;\n\nfunction TMailBuilder.SetSubject(AText: string): TMailBuilder;\nbegin\n  FMail.Subject := AText;\n  Result := self;\nend;\n\nfunction TMailBuilder.AddAttachment(AAttachmentName, AContentType: string; AContent: TStream; AFreeAfterSend: Boolean = false; AContentId: string = '')\n  : TMailBuilder;\nvar\n  attachment: TMailAttachment;\nbegin\n  if not Assigned(AContent) then\n    Exit(self);\n\n  attachment.Name := AAttachmentName;\n  attachment.ContentType := AContentType;\n  attachment.Data := AContent;\n  attachment.ContentId := AContentId;\n  attachment.FreeAfterSend := AFreeAfterSend;\n  FMail.Attachments.Add(attachment);\n  Result := self;\nend;\n\nfunction TMailBuilder.AddFileAttachment(AFileNames: TArray&lt;string>): TMailBuilder;\nvar\n  str: string;\nbegin\n  for str in AFileNames do\n    AddFileAttachment(str);\n  Result := self;\nend;\n\nfunction TMailBuilder.AddFileAttachment(AFileName: string): TMailBuilder;\nvar\n  fileStream : TFileStream;\n  mimetable  : TIdThreadSafeMimeTable;\n  ContentType: string;\nbegin\n  if not TFile.Exists(AFileName) then\n    Exit(self);\n\n  fileStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyNone); \/\/ TFile.OpenRead(AFileName);\n  mimetable := TIdThreadSafeMimeTable.Create(true);\n  try\n    ContentType := mimetable.GetFileMIMEType(AFileName);\n  finally\n    mimetable.Free;\n  end;\n  Result := AddAttachment(TPath.GetFileName(fileStream.FileName), ContentType, fileStream, true);\nend;\n\nfunction TMailBuilder.AddHtmlContent(AText: string): TMailBuilder;\nbegin\n  FMail.HtmlContent := FMail.HtmlContent + AText;\n  Result := self;\nend;\n\nfunction TMailBuilder.ClearTo: TMailBuilder;\nbegin\n  FMail.ToList.Clear;\n  Result := self;\nend;\n\nfunction TMailBuilder.ClearCC: TMailBuilder;\nbegin\n  FMail.CCList.Clear;\n  Result := self;\nend;\n\nfunction TMailBuilder.ClearBCC: TMailBuilder;\nbegin\n  FMail.BCCList.Clear;\n  Result := self;\nend;\n\n\nend.\n\n\/\/\/\/\/\/\/\/\/\n\nunit Email.MailServerBuilder;\n\ninterface\n\nuses\n variants, SysUtils, System.Classes, System.Generics.Collections, Email.Mail, Email.MailBuilder, Email.MailAttachment;\n\ntype\n\n  TMailServerSettings = class\n  public\n    Host: string;\n    Port: Integer;\n    UserName: string;\n    Password: string;\n    UseTLS: Boolean;\n    DefaultFrom: string;\n    DefaultTo: string;\n    DefaultCC: string;\n    DefaultBCC: string;\n    DebugOverride: string;\n    OverrideEmail: string;\n    ReferencePrefix: string;\n  end;\n\n  TMailServerBuilder = class;\n\n  TSendMailResult = record\n  public\n    Success: Boolean;\n    ExceptionMessage: string;\n  end;\n\n  TMailServerBuilder = class\n    FServerSettings: TMailServerSettings;\n    function LoadFromIniFile(ACompleteFilename: string): TMailServerBuilder;\n    function SetHost(AHost: string; APort: integer; AUseTLS: boolean = false): TMailServerBuilder;\n    function SetCredentials(AUserName: string; APassword: string): TMailServerBuilder;\n    function SendMail(AMailBuilder: TMailBuilder) : TSendMailResult;\n    function GetReferenceText(AText: string): string;\n    procedure AddDefaults(AMailBuilder: TMailBuilder);\n    constructor Create;\n    destructor Destroy; override;\n  end;\n\n\n  const EmailConfigSalt: word = 5326;\n\n\n\nimplementation\n\nuses Helpers.Email;\n\n\nconstructor TMailServerBuilder.Create;\nbegin\n  FServerSettings := TMailServerSettings.Create;\nend;\n\ndestructor TMailServerBuilder.Destroy;\nbegin\n  FreeAndNil(FServerSettings);\n  inherited;\nend;\n\nfunction TMailServerBuilder.GetReferenceText(AText: string): string;\nbegin\n  Result := #13#10+FServerSettings.ReferencePrefix+' '+AText;\nend;\n\n{\n  [SMTP]\n  host=\n  port=\n  useTLS=0\n  Username=\n  Password=\n  Override=Email@email.com (keep mail the same, but clean To,Cc, Bcc)\n  DebugOverride=test@test.com (Set everything in body of mail)\n  ReferencePrefix= referentienummer:\n\n  [DEFAULTS]\n  From=test@test.com\n  To=\n  CC=\n  BCC=test@test.com\n}\n\nfunction TMailServerBuilder.LoadFromIniFile(ACompleteFilename: string): TMailServerBuilder;\nvar\n  iniFile: TMemIniFile;\n  path: string;\n  Section: string;\n  password: string;\n  EncriptedPassword: string;\nbegin\n\n  path := ACompleteFilename;\n  iniFile := TMemIniFile.Create(path, TEncoding.ANSI, false);\n  try\n    Section:= 'SMTP';\n    FServerSettings.Host := iniFile.ReadString(Section, 'host', '');\n    FServerSettings.Port := iniFile.ReadInteger(Section, 'port', 0);\n    FServerSettings.UserName := iniFile.ReadString(Section, 'Username', '');\n    password := iniFile.ReadString(Section, 'Password', '');\n    EncriptedPassword := iniFile.ReadString(Section, 'PasswordEncrypted', '');\n    if (password.Trim() &lt;> '') then\n    begin\n      EncriptedPassword := TEncryptionHelper.Encrypt(password, EmailConfigSalt);\n      iniFile.WriteString(Section, 'PasswordEncrypted', EncriptedPassword);\n      iniFile.WriteString(Section, 'Password', '');\n      iniFile.UpdateFile;\n    end;\n    FServerSettings.Password := TEncryptionHelper.Decrypt(EncriptedPassword, EmailConfigSalt);\n    FServerSettings.UseTLS := iniFile.ReadBool(Section, 'UseTLS', false);\n    FServerSettings.DebugOverride := iniFile.ReadString(Section, 'DebugOverride', '');\n    FServerSettings.OverrideEmail := iniFile.ReadString(Section, 'Override', '');\n    FServerSettings.ReferencePrefix := iniFile.ReadString(Section, 'ReferencePrefix', '');\n\n    Section:= 'DEFAULTS';\n    FServerSettings.DefaultFrom := iniFile.ReadString(Section, 'From', '');\n    FServerSettings.DefaultTo := iniFile.ReadString(Section, 'To', '');\n    FServerSettings.DefaultCC := iniFile.ReadString(Section, 'CC', '');\n    FServerSettings.DefaultBCC := iniFile.ReadString(Section, 'BCC', '');\n  finally\n    iniFile.Free;\n  end;\n  Result := Self;\nend;\n\nfunction TMailServerBuilder.SendMail(AMailBuilder: TMailBuilder): TSendMailResult;\nvar\n  smtpClient : TidSmtp;\n  mailMessage : TIdMessage;\n  email: string;\n  attachment: TMailAttachment;\n  idAttachment : TIdAttachmentMemory;\n  SendMailResult : TSendMailResult;\n  textPart : TIdText;\n  SSL: TIdSSLIOHandlerSocketOpenSSL;\n  mail : TMail;\n  mailBuildResult : TMailBuildResult;\n  debugContent: string;\nbegin\n  try\n    debugContent := AMailBuilder.GetDebugContent;\n    if TMailBuilder.IsEmailaddressValid(FServerSettings.DebugOverride) then\n    begin\n\n      AMailBuilder\n      .ClearTo()\n      .ClearCC()\n      .ClearBCC()\n      .AddTo(FServerSettings.DebugOverride)\n      .ClearContent()\n      .AddContent(debugContent);\n    end else if TMailBuilder.IsEmailaddressValid(FServerSettings.OverrideEmail) then\n    begin\n      AMailBuilder\n      .ClearTo()\n      .ClearCC()\n      .ClearBCC()\n      .AddTo(FServerSettings.OverrideEmail);\n    end;\n\n    mailBuildResult := AMailBuilder.Build;\n\n    if (mailBuildResult.Valid) then\n    begin\n      mail := mailBuildResult.Mail;\n    end else\n    begin\n      MailLogger.Warning('Failed to build valid Email, Err:' + mailBuildResult.ExecptionMessage);\n      Result.Success := false;\n      Result.ExceptionMessage := mailBuildResult.ExecptionMessage;\n      Exit;\n    end;\n\n    smtpClient := TIdSMTP.Create;\n    if FServerSettings.UseTLS then\n    begin\n      SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);\n      SSL.SSLOptions.Method := sslvTLSv1;\n\/\/      SSL.SSLOptions.SSLVersions := [sslvSSLv2, sslvSSLv23, sslvSSLv3, sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];\n      SSL.SSLOptions.Mode := sslmClient;     \/\/ or sslmUnassigned ?\n      SSL.SSLOptions.VerifyMode := [];\n      SSL.SSLOptions.VerifyDepth := 0;\n      smtpClient.IOHandler := SSL;\n      smtpClient.UseTLS := utUseExplicitTLS;\n    end;\n\n    mailMessage:= TIdMessage.Create(nil);\n    try\n      smtpClient.Host := FServerSettings.Host;\n      smtpClient.Port := FServerSettings.Port;\n      smtpClient.UserName := FServerSettings.UserName;\n      smtpClient.Password := FServerSettings.Password;\n\n      mailMessage.Body.Clear;\n      mailMessage.ContentType := 'multipart\/related';\n      mailMessage.Priority := TIdMessagePriority(mail.Priority);\n\n      mailMessage.From.Text := mail.From;\n      mailMessage.Subject := mail.Subject;\n\n      for email in mail.ToList do\n        mailMessage.Recipients.Add().Text := email;\n\n      for email in mail.CCList do\n        mailMessage.CCList.Add().Text := email;\n\n      for email in mail.BCCList do\n        mailMessage.BCCList.Add().Text := email;\n\n      mailMessage.ContentType := 'multipart\/related';\n      if (mail.HtmlContent.Length > 0) then\n      begin\n        textPart := TIdText.Create(mailMessage.MessageParts);\n        textPart.Body.Text := mail.HtmlContent;\n        textPart.ContentType := 'text\/html';\n        textPart.ContentDisposition := 'inline';\n      end;\n\n      textPart := TIdText.Create(mailMessage.MessageParts);\n      textPart.Body.Text := mail.Content;\n      textPart.ContentType := 'text\/plain';\n      textPart.ContentDisposition := 'inline';\n\n      for attachment in mail.Attachments do\n      begin\n        attachment.Data.Position := 0;\n        idAttachment := TIdAttachmentMemory.Create(mailMessage.MessageParts, attachment.Data);\n        idAttachment.ContentType := attachment.ContentType;\n        idAttachment.ContentID := attachment.ContentId;\n        idAttachment.FileName := attachment.Name;\n      end;\n\n      MailLogger.Trace(FServerSettings.Host +':'+ IntToStr(FServerSettings.Port) + '; Username:' + FServerSettings.UserName);\n      smtpClient.Connect;\n      smtpClient.Send(mailMessage);\n      smtpClient.Disconnect(true);\n\n\n\n     finally\n      for attachment in mail.Attachments do\n      begin\n        if (attachment.FreeAfterSend) then\n        begin\n          attachment.Data.Free;\n        end;\n      end;\n\n\n      FreeAndNil(mailMessage);\n      FreeAndNil(smtpClient);\n      FreeAndNil(AMailBuilder);\n    end;\n    SendMailResult.Success := true;\n    MailLogger.Info('Mail successfully sent.');\n  Except\n    on E: Exception do\n    begin\n      SendMailResult.Success := false;\n      SendMailResult.ExceptionMessage := E.Message;\n      MailLogger.Error('Failed to send mail.', E);\n      MailLogger.Trace('FAILED EMAIL CONTENT: ' + #13#10 + debugContent);\n    end;\n  end;\n  Result := SendMailResult;\nend;\n\nfunction TMailServerBuilder.SetCredentials(AUserName: string; APassword: string): TMailServerBuilder;\nbegin\n  FServerSettings.UserName := AUserName;\n  FServerSettings.Password := APassword;\n  result := Self;\nend;\n\nprocedure TMailServerBuilder.AddDefaults(AMailBuilder: TMailBuilder);\nbegin\n  AMailBuilder.SetFrom(FServerSettings.DefaultFrom);\n  AMailBuilder.AddTo(FServerSettings.DefaultTo.Split([';', ',']) );\n  AMailBuilder.AddCC(FServerSettings.DefaultCC.Split([';', ',']));\n  AMailBuilder.AddBCC(FServerSettings.DefaultBCC.Split([';', ',']));\nend;\n\nfunction TMailServerBuilder.SetHost(AHost: string; APort: integer; AUseTLS: boolean): TMailServerBuilder;\nbegin\n  FServerSettings.Host := AHost;\n  FServerSettings.Port := APort;\n  FServerSettings.UseTLS := AUseTLS;\n  result := Self;\nend;\n\n\n\nend.\n\n<\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-4155","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4155","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=4155"}],"version-history":[{"count":3,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4155\/revisions"}],"predecessor-version":[{"id":9579,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/4155\/revisions\/9579"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=4155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=4155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=4155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}