【问题标题】:Delphi 5 Send Email With IndyDelphi 5 使用 Indy 发送电子邮件
【发布时间】:2015-09-22 18:54:42
【问题描述】:

我正在尝试在 Delphi 5 上使用 Indy 10 发送电子邮件,发生的情况是它不想进行身份验证,因为它向我显示了“Nooo”消息。到目前为止,我在这里有这段代码(我从另一个 Stack Overflow 问题中得到)。我不知道为什么它对我不起作用,因为它显然对另一个人起作用......也许我错过了一些东西,我用我的 2 封实际邮件和密码替换了 senderemail 和 receiveremail。

编辑

这就是我现在所处的位置,它会弹出“必须先发出 STARTTLS 命令”。但是现在出错了……我真的很困惑……

编辑 2

所以我设法让它工作,这是最终的结果。如果某些事情没有正确完成,请随时告诉我......在添加“IdSMTP.Authenticate;”之前,我遇到了访问冲突。发送消息前的一行!

procedure TForm1.Button3Click(Sender: TObject);
var
    IdSMTP: TIdSMTP;
    Email: TIdMessage;
    SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
    IdSMTP := TIdSMTP.Create(nil);
    SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    Email := TIdMessage.Create(nil);
    try
        SSLHandler.MaxLineAction := maException;
        SSLHandler.SSLOptions.Method := sslvSSLv23;
        SSLHandler.SSLOptions.Mode := sslmUnassigned;
        SSLHandler.SSLOptions.VerifyMode := [];
        SSLHandler.SSLOptions.VerifyDepth := 0;

        IdSMTP.IOHandler := SSLHandler;
        IdSMTP.Host := 'smtp.gmail.com';
        IdSMTP.Port := 587;
        IdSMTP.Username := 'email@gmail.com';
        IdSMTP.Password := 'password';
        IdSMTP.UseTLS := utUseExplicitTLS;

        Email.From.Address := 'email@gmail.com';
        Email.Recipients.EmailAddresses := 'secondemail@gmail.com';
        Email.Subject := 'Test subject';
        Email.Body.Text := 'Test body';

        IdSMTP.Connect;
        if IdSMTP.Connected then
        begin
            IdSMTP.Authenticate;
            IdSMTP.Send(Email);
            IdSMTP.Disconnect;
        end;
    finally
        Email.Free;
        SSLHandler.Free;
        IdSMTP.Free;
    end;
end;

【问题讨论】:

  • 请注意,AuthType=satDefault 不适用于所有服务器。它使用不安全的AUTH LOGIN 命令,并且一些服务器已经放弃了对它的支持。您应该考虑将AuthType=satSASLTIdSMTP.SASLMechanisms 集合一起使用。您不需要手动调用 Authenticate()
  • Gmail 对 SMTP 使用 25、465 和 587,但由于几乎所有 isps 都阻止 25,因此 465 是 gmail 首选的带有 SSL 的 SMTP,而 587 是带有 TLS 端口的首选 SMTP。
  • GMail 可以使用不允许访问您的程序的设置 - 尝试在您的设置中找到“访问安全性较低的应用程序”。
  • 如果您启用了 2 因素身份验证并创建了应用专用密码,则无需启用“访问安全性较低的应用”。

标签: email delphi indy


【解决方案1】:

尝试使用此代码:

  IdSMTP := TIdSMTP.Create(nil);
  try
    IdSMTP.UseTLS := utNoTLSSupport;
    IdSMTP.Host := 'smtp.gmail.com';
    IdSMTP.Port := 25;
    IdSMTP.AuthType := satDefault;
    IdSMTP.Username := 'SenderEmail@gmail.com';
    IdSMTP.Password := 'Password';        

    IdMessage := TIdMessage.Create(nil);
    try
        IdMessage.From.Name := 'My Name';
        IdMessage.From.Address := 'SenderEmail@gmail.com';
        IdMessage.Subject := 'E-mail subject';
        IdMessage.Body.Add('E-mail body.');
        IdMessage.Recipients.EMailAddresses := 'ReceiverEmail@gmail.com';           
        IdMessage.ReceiptRecipient.Name := 'Name';

        if not IdSMTP.Connected then
          IdSMTP.Connect;

        IdSMTP.Send(IdMessage);

     finally
          IdMessage.Free;
          IdSMTP.Disconnect;
     end;

  finally
    IdSMTP.Free;
    IdSSLIOHandlerSocketOpenSSL1.Free;

【讨论】:

  • 它告诉我“此设置需要 SSL IOHandler”,即使我添加了“IdSMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1;”线...奇怪
  • “SSLHandler”应该是“IdSSLIOHandlerSocketOpenSSL1”吗?
  • 好的,尝试将IdSMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1; 移到顶部(请参阅更新)或尝试仅删除 SSL IOHandler
  • 我在这段代码中看不到任何会导致 AccessVioation 异常的内容。但是,请注意utUseExplicitTLS 不能在 Gmail 的 25 端口上工作,只能在端口 587 上工作。在端口 465 上,请使用 utUseImplicitTLS。在端口 25 上,请改用 utNoTLSSupport,并且不要分配 SSL IOHandler。
  • 没关系,它现在正在工作!谢谢你们的帮助!
猜你喜欢
  • 1970-01-01
  • 2012-04-08
  • 2015-10-24
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
相关资源
最近更新 更多