【问题标题】:error when sending email via XE2 delphi通过 XE2 delphi 发送电子邮件时出错
【发布时间】:2013-07-23 15:48:52
【问题描述】:

我正在使用这个简单的代码发送电子邮件,它适用于大多数 SMTP 服务器,但适用于使用 RFC 2554 中定义的 SMTP AUTH 扩展的服务器。它显示此错误:

错误:有效的 RCPT 命令必须在 DATA 之前

这里是代码:

    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 中解决这个问题? 谢谢

【问题讨论】:

  • 这是实际代码吗?我在您的 try..except 块中看到语法错误。 SMTPMailMessages 是什么类型的对象?
  • 您是否在某处添加了收件人?
  • 我更正了真实代码。 SMTP 也是 TIdSMTP,MailMessages 是 TIdMessage。此代码适用于普通的 SMTP 服务器,但对于使用 SMTP AUTH 的服务器,它显示以下错误:错误:有效的 RCPT 命令必须在 DATA 之前,这意味着我们应该在发送电子邮件之前进行身份验证,而我不知道如何在发送之前进行身份验证: XE2 delphi中的D
  • 让我再问一遍。您添加收件人吗? RCPT 不是关于身份验证,而是关于谁是您的电子邮件的收件人。当您不进行身份验证时,我不知道为什么在没有收件人的情况下接受电子邮件,但无论如何,如果没有收件人,您的电子邮件似乎是不完整的。 ReceiptRecipient 不是收件人。它是已读通知(收据)的接收者,因此通常是发送者而不是接收者。
  • 好吧,上面的评论可能并不完全正确。我读了一点,当您的身份验证不被接受时,可能会出现此错误。这可能是因为凭据不正确,也可能是因为您的 IP 被列入黑名单(如果您进行了很多试验,这可能会发生)。你可以检查here。在搜索您的错误消息时,我还发现了许多其他可能导致它的可能性,因此问题可能不在您的代码中。

标签: delphi email delphi-xe2


【解决方案1】:

确保您填写的是TIdMessage.RecipientsTIdMessage.CCListTIdMessage.BCCList 属性。这些是 TIdSMTP 获取其 SMTP RCPT TO 命令地址的属性。您不能在没有指定收件人的情况下发送电子邮件。您只填写了TIdMessage.ReceiptRecipient 属性,该属性仅用于指定收件人将已读回执发送到的返回地址(如果收件人支持已读收件人)。

另外,您不需要手动调用Authenticate()Send() 在需要时为您在内部调用它。

【讨论】:

    【解决方案2】:

    谢谢大家,我已经填写了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;
    

    再次感谢您。

    【讨论】:

      猜你喜欢
      • 2016-10-06
      • 2016-06-03
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多