2010-07-30 229 views
0

我尝试做一个发送邮件的程序。 在开始时它工作正常 - 我得到220(意思是“你好”),然后当我说“MAIL FROM:”时,它返回250(表示OK),但是当我写入“RCPT TO:”时,它写入 “中继不允许”。 为什么不谷歌的smtp喜欢它?用smtp发送邮件

我的代码:http://pastebin.com/wNA1Zp26

*顺便说一下:当我发送从其他帐户的电子邮件 - 它不工作的。

+0

至少用您正在使用的语言标记您的问题。 – Oded 2010-07-30 14:02:03

回答

2

包括你使用的语言将是一个很大的优点。

一般来说虽然没有半路出家电子邮件服务器/服务将让您发送任何电子邮件,直到你与服务器/服务认证。这就是为什么你得到'不允许中继'。

+0

那么如何识别服务器呢? – Ohad 2010-07-30 14:17:49

+0

我不是一个大插座的家伙,特别是在C++中,但这里是一个链接,看起来给予命令和响应进行身份验证 - http://computer-programming-tutorials.suite101.com/article.cfm/sending_email_with_smtp_auth – 2010-07-30 14:23:11

+0

谢谢。 这正是我所做的,它吓坏了! “•告知服务器邮件来自哪里; •告诉服务器邮件的来源; •给服务器发送消息; •以'\ r \ n。\ r \ n'结尾。 它不告诉我我不发送正确的消息 - 它只是不传递消息,我不知道为什么(!)。 – Ohad 2010-07-30 14:45:49

3

我认为真正的错误是你试图实现邮件客户端。我不是 C#或.NET,的专家,但对于Java而言,有一个“标准”库,可以执行SMTP和所有其他邮件协议,如果没有这样的库,我会非常惊讶。净。

您不应该浪费时间重新发明与SMTP服务器之间的套接字通信,而应该教育自己使用适当的库来实现此目的。

或者这是一个学术活动?

编辑:糟糕,它是C++,而不是C#。责怪我的视力。

Here's a whole page full of links to SMTP libraries。选择一个,下载它,使用它。

说真的,如果您曾经管理过关于如何进行ESMTP身份验证的链接,那么您可以管理所需的基本“秘密”握手的更简单形式。但是将一些代码捆绑在一起来处理“快乐的路径”,也许只是谈谈某个特定的SMTP服务器实现与创建可安全可靠地运行的代码以及体面的错误处理和报告并不相同。

+0

但我不使用.NET,我使用C++。 – Ohad 2010-07-30 14:47:00

+0

哎呀!我的错误是,我简单看了一下代码,并认为我看到了“C#”。我已经更新了我的答案。 – 2010-07-30 15:21:51

0

中继错误通常意味着您的客户正尝试向您所连接系统外的收件人发送电子邮件,但您的客户无权这样做。看着你的代码,你并不是试图向服务器验证自己。

首先,您使用的是HELO命令,并且您在此处使用不正确。 HELO的输入参数是您的机器名称,但您要发送SMTP服务器主机名。你需要解决这个问题。

之后,您应该使用EHLO命令而不是HELO命令。 EHLO将允许您的客户端确定服务器实际支持哪些认证方案(如其他功能)(例如LOGIN,NTLM,SHA1,MD5等)。然后,您可以选择一个您支持的并使用它登录到具有中继权限的实际用户帐户。

您的代码的另一个问题是它根本没有执行任何SMTP级别的错误处理。您正在查看套接字错误代码,但您根本没有在寻找SMTP错误代码。例如,如果服务器拒绝MAIL FROM或RCPT TO命令(在这种情况下),那么您的代码仍然会浪费带宽和处理时间,发送DATA命令将失败(带有另一个您未查找的SMTP错误对于)。