XE2 Delphi发送电子邮件时出现错误

3

我正在使用这段简单的代码发送邮件,它可以在大多数SMTP服务器上工作,但对于那些使用RFC 2554中定义的SMTP AUTH扩展的服务器,它会显示以下错误:

错误:DATA之前必须先输入有效的RCPT命令

以下是代码:

    SMTP.Host := 'host.com';
  SMTP.Port := 25;
  SMTP.Username:= 'user@host.com';
  SMTP.Password:= 'pass';
  MailMessages.From.Address:='address@address.com';
  MailMessages.From.Name:= 'Ehsan';
  MailMessages.Subject :=  'Test';
  MailMessages.Body.Text := 'the body is going to test';
  MailMessages.ReceiptRecipient.Address := 'ehsan.hesam13@gmail.com';

  try
    try
     SMTP.Connect;
     SMTP.Authenticate;
     SMTP.Send(MailMessages);
    except on E:Exception do
      StatusMemo.Lines.Insert(0, 'ERROR: ' + E.Message);
    end;
  finally
    if SMTP.Connected then SMTP.Disconnect;
  end;
end;

我该如何在XE2中解决这个问题? 谢谢


2
这是真正的代码吗?我在你的try..except块中看到语法错误。而且SMTPMailMessages是什么样的对象? - GolezTrol
你在哪里添加收件人? - GolezTrol
1
我已经纠正了真实的代码。同时,SMTP是TIdSMTP,MailMessages是TIdMessage。这段代码适用于普通SMTP服务器,但对于使用SMTP AUTH的服务器,它会显示以下错误:ERROR: valid RCPT command must precede DATA。这意味着我们应该在发送电子邮件之前进行身份验证,但我不知道如何在XE2 Delphi中进行身份验证:D。 - Ehsan Hesam
1
让我再问一遍。你是否添加了收件人?RCPT不是关于认证的问题,它是关于谁是你电子邮件的收件人的问题。如果您不进行身份验证,我就不知道为什么会接受没有收件人的电子邮件,但无论如何,似乎你的电子邮件如果没有收件人就是不完整的。 ReceiptRecipient不是收件人。它是阅读通知(回执)的接收者,因此通常是发件人而不是收件人。 - GolezTrol
好的,上面的评论可能并不完全正确。我读了一些资料,可能是因为您的身份验证未被接受而导致此错误。这可能是由于凭据不正确,也可能是由于您的IP地址被列入黑名单(如果您一直在进行实验,那么可能会发生这种情况)。您可以在这里检查。当搜索您的错误消息时,我还发现了许多其他可能导致问题的原因,因此问题可能不在您的代码中。 - GolezTrol
2个回答

4
确保填写 TIdMessage.RecipientsTIdMessage.CCListTIdMessage.BCCList 属性。这些属性是 TIdSMTP 获取 SMTP RCPT TO 命令地址的地方。没有指定收件人,你将无法发送电子邮件。你只填写了 TIdMessage.ReceiptRecipient 属性,该属性仅用于指定收件人支持阅读回执时,收件人发送回执的返回地址。
此外,你不需要手动调用 Authenticate()。当需要时,Send() 会在内部自动调用它。

1
感谢大家,我已经填好了 Recipients.EMailAddresses 并且它起作用了 :D 这是正确的代码:
  SMTP.Host := 'host.com';
  SMTP.Port := 25;
  SMTP.Username:= 'user@host.com';
  SMTP.Password:= 'pass';
  MailMessages.From.Address:='address@address.com';
  MailMessages.From.Name:= 'Ehsan';
  MailMessages.Subject :=  'Test';
  MailMessages.Body.Text := 'the body is going to test';
  MailMessages.Recipients.EMailAddresses:='ehsan.hesam13@gmail.com';

  try
    try
     SMTP.Connect;
     SMTP.Authenticate;
     SMTP.Send(MailMessages);
    except on E:Exception do
      StatusMemo.Lines.Insert(0, 'ERROR: ' + E.Message);
    end;
  finally
    if SMTP.Connected then SMTP.Disconnect;
  end;
end;

再次感谢您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接