使用 smtp 发送电子邮件

Posted

技术标签:

【中文标题】使用 smtp 发送电子邮件【英文标题】:sending email with smtp 【发布时间】:2010-07-30 14:00:21 【问题描述】:

我尝试做一个发送电子邮件的程序。 一开始它工作正常 - 我得到 220(表示“嗨”),然后当我说“MAIL FROM:”时它返回 250(表示 OK)但是当我写“RCPT TO:”时,我得到 550 错误并且它写 “不允许中继”。 为什么google的smtp不喜欢?

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

*顺便说一句:当我从另一个帐户发送电子邮件时 - 它也不起作用。

【问题讨论】:

至少用您使用的语言标记您的问题。 【参考方案1】:

我认为真正的错误是您正在尝试实现邮件客户端。我不是 C# 或 .NET 方面的专家, 但对于 Java,有一个执行 SMTP 和所有其他邮件协议的“标准”库,如果没有,我会感到非常惊讶.NET 中的此类库。

与其浪费时间重新发明与 SMTP 服务器的套接字通信,不如自学了解用于此目的的适当库。

或者这是一个学术练习?

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

这里是a whole page full of links to SMTP libraries。选择一个,下载它,使用它。

说真的,如果您曾经管理过有关如何进行 ESMTP 身份验证的链接,那么您可能可以管理所需的基本“秘密”握手的更简单形式。但是,将一些代码拼凑在一起来处理“愉快的路径”,也许只是与一个特定的 SMTP 服务器实现对话,这与创建安全可靠、具有良好错误处理和报告功能的代码是不同的。

【讨论】:

糟糕!我的错误,我看了一眼代码,以为我看到了“C#”。我已经更新了我的答案。【参考方案2】:

包括您使用的语言将是一大优势。

不过,一般来说,在您通过服务器/服务进行身份验证之前,没有中途的电子邮件服务器/服务可以让您发送任何电子邮件。这就是为什么您会收到“不允许中继”。

【讨论】:

那么如何识别服务器呢? 我不是一个大套接字家伙,尤其是在 C++ 中,但这里有一个链接,它看起来给出了用于身份验证的命令和响应 - computer-programming-tutorials.suite101.com/article.cfm/… 谢谢。这正是我所做的,它吓坏了! "• 告诉服务器邮件来自谁; • 告诉服务器邮件是谁; • 给服务器消息; • 以 '\r\n.\r\n' 结束。"它并没有告诉我我没有发送正确的消息 - 它只是不转发消息而且我不知道为什么(!)。 嗯...检查一下,看看它是否有帮助 - ***.com/questions/58210/c-smtp-example 不,这无济于事:它本质上是 OP 正在做的事情,它不处理身份验证。【参考方案3】:

中继错误通常意味着您的客户试图向您所连接的系统之外的收件人发送电子邮件,但您的客户无权这样做。查看您的代码,您根本没有尝试向服务器验证自己的身份。

一方面,您正在使用 HELO 命令,而您当时使用不正确。 HELO 的输入参数是 YOUR MACHINE NAME,但您发送的是 SMTP SERVER HOSTNAME。你需要解决这个问题。

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

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

【讨论】:

以上是关于使用 smtp 发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

在Python中使用SMTP发送电子邮件

SMTP使用Gmail发送电子邮件问题

php使用SMTP发送电子邮件[重复]

如何在 php 中使用 SMTP 发送电子邮件

JavaMail使用SMTP协议发送电子邮件(详解)

使用 smtp mandrill 发送电子邮件的问题