我尝试做一个发送电子邮件的程序。 一开始它工作正常 - 我得到220(意思是“嗨”),然后当我说“MAIL FROM:”时它返回250(表示OK)但是当我写“RCPT TO:”时我得到550错误它写 “不允许继续”。 为什么google的smtp不喜欢它?
我的代码:http://pastebin.com/wNA1Zp26
*顺便说一句:当我从另一个帐户发送电子邮件时 - 它也不起作用。
答案 0 :(得分:3)
我认为真正的错误是您正在尝试实施邮件客户端。我不是C#或.NET的专家,但是对于Java,有一个“标准”库可以执行SMTP和所有其他邮件协议,如果没有,我会非常惊讶这样的.NET库。
您不应该浪费时间重新发明与SMTP服务器的套接字通信,而应该让自己了解用于此目的的正确库。
或者这是学术活动吗?
编辑:哎呀,它是C ++,而不是C#。责备我的视力。
这是a whole page full of links to SMTP libraries。选择一个,下载,使用它。
说真的,如果您管理过如何进行ESMTP身份验证的链接,那么您可以管理所需的基本“秘密”握手的简单形式。但是,将一些代码拼凑起来处理“快乐路径”并且可能只是与一个特定的SMTP服务器实现进行对话与创建安全可靠的代码并不相同,并且具有良好的错误处理和报告功能。
答案 1 :(得分:2)
包括您正在使用的语言将是一个很大的优势。
一般来说,在您使用服务器/服务进行身份验证之前,没有一半体面的电子邮件服务器/服务可以让您发送任何电子邮件。这就是为什么你得到'不允许转发'。
答案 2 :(得分:0)
中继错误通常意味着您的客户端正在尝试向您所连接的系统外部的收件人发送电子邮件,但您的客户端无权这样做。查看您的代码,您根本不会尝试对服务器进行身份验证。
首先,您正在使用HELO命令,并且您正在使用它。 HELO的输入参数是您的机器名称,但您要发送 SMTP SERVER HOSTNAME 。你需要解决这个问题。
之后,您应该使用EHLO命令而不是HELO命令。 EHLO将允许您的客户端确定服务器实际支持的身份验证方案(以及其他功能)(例如LOGIN,NTLM,SHA1,MD5等)。然后,您可以选择一个支持并使用它登录具有中继权限的实际用户帐户。
您的代码的另一个问题是它根本没有进行任何SMTP级别的错误处理。您正在查看套接字错误代码,但您根本不在寻找SMTP错误代码。例如,如果服务器拒绝MAIL FROM或RCPT TO命令(在这种情况下),您的代码仍将浪费带宽和处理时间,发送将失败的DATA命令(另一个SMTP错误,您不看对)。