我正在为一个大学项目使用Java编写POP3和SMTP服务器。我可以通过客户端(例如:Thunderbird)使用我的SMTP服务器发送电子邮件,我的服务器发送邮件时没有任何问题。
当外部发件人代理(如gmail或hotmail)尝试使用我的SMTP服务器发送电子邮件时,它不会完成通信,因为它会在邮件命令之后发送QUIT命令。为什么外部代理会这么做?我没有遵守SMTP协议吗?
问题是,当我收到来自外部服务器的连接,想要给我发送邮件时,会发生以下情况(我:我的SMTP服务器,发件人:发件人代理)。下面是一个gmail代理的例子。
sender: establishes a connection
me: 220 Welcome
sender: HELO agent id
me: 250 Fine
sender: MAIL FROM:<address@gmail.com>
me (after address verification): 250
sender: QUIT
me: 221
相关代码片段(完整的类代码位于http://code.google.com/p/sd-mail-server-claudiani-ferrari/source/browse/src/controller/smtp/SMTPCommandHandler.java?repo=mailserver )
private void MAILCommand(CommunicationHandler communicationHandler,
BufferedOutputStream writer,
PersistanceManager persistanceManager,
String clientId,
String argument)
{
String address = getAddressFromArgument(argument);
if (!isValidAddress(address, persistanceManager)) {
communicationHandler.sendResponse(writer,
SMTPCode.SYNTAX_ERROR.toString(),
"Address is not valid.");
return;
}
// Initialize data
persistanceManager.create(StorageLocation.SMTP_TEMP_MESSAGE_STORE,
FieldName.getSMTPTempTableFromFieldOnly(),
clientId, address);
communicationHandler.sendResponse(writer, SMTPCode.OK.toString(), "");
}
private void RCPTCommand(CommunicationHandler communicationHandler,
BufferedOutputStream writer,
PersistanceManager persistanceManager,
String clientId,
String argument)
{
String address = getAddressFromArgument(argument);
// Check the address
if (!isValidAddress(address, persistanceManager)) {
communicationHandler.sendResponse(writer,
SMTPCode.SYNTAX_ERROR.toString(),
"Address is not valid.");
return;
}
persistanceManager.addToSet(StorageLocation.SMTP_TEMP_MESSAGE_STORE,
clientId,
FieldName.SMTP_TEMP_TO_ADDRESSES,
address);
communicationHandler.sendResponse(writer, SMTPCode.OK.toString(), "");
}
private void DATACommand(CommunicationHandler communicationHandler,
BufferedOutputStream writer,
PersistanceManager persistanceManager,
String clientId)
{
communicationHandler.sendResponse(writer,
SMTPCode.INTERMEDIATE_REPLY.toString(),
"Start mail input; end with [CRLF].[CRLF]");
}
你有没有试过用250 OK
而不是仅仅用250
来回复?RFC 2821说这应该是一个MAIL OF
行的回复:
如果接受,SMTP服务器将返回250 OK回复。如果邮箱规范因某种原因不可接受,服务器必须返回一个回复,指示
您的邮件客户端可能对看到250
感到满意,而Google/Hotmail可能期望250 OK
。
编辑
我认为文本字符串在这种情况下不是可选的,请参阅RFC 2821的第4.2节:
SMTP回复由三位数字(以三个数字字符传输)和一些文本组成,除非本文档中另有规定。
当前的RFC 5321建议客户不接受文本:
SMTP客户端必须仅通过回复代码来确定其操作,而不是通过文本(除了“地址变更”251和551以及必要时的220、221和421回复);在一般情况下,任何文本,包括根本没有文本(虽然发件人不应该发送裸码),必须是可以接受的。回复代码后面的空格(空白)被认为是文本的一部分。只要有可能,接收者-SMTP应该测试回复代码的第一个数字(严重性指示)。
SMTP是Simple Mail Transfer Protocol的首字母缩写。 它是跨Internet协议(IP)网络的电子邮件(电子邮件)传输的Internet标准。 SMTP使用TCP端口25.由SSL保护的SMTP连接以速记SMTPS为人所知,尽管SMTPS本身不是协议。 JavaMail API具有包com.sun.mail.smtp ,它作为SMTP协议提供程序来访问SMTP服务器。
我正在尝试从火币 USDT 掉期流式传输比特币价格,但我的乒乓机制不起作用,所以火币总是在 30 秒后关闭连接。 文档是这么说的https://huobiapi . github . io/docs/usdt _ swap/v1/en/# market-heart beat: WebSocket API支持双向心跳。服务器和客户端都可以发送ping消息,对方可以返回pong消息。 WebSocke
显示以下错误:: 线程“main”Java.lang.RuntimeException:javax.mail.MessagingException:无法连接到SMTP主机:localhost,端口:587,Sendmail.Main(Sendmail.Java:54)上的响应:421,原因是:javax.mail.MessagingException:无法连接到SMTP主机:localhost,端
问题内容: 我使用JDBC连接到MySQL。在时,一切正常。 但是,当我将应用程序移动到Intranet中的另一台计算机上并用于连接到MySQL数据库时,大约需要1分钟才能成功连接到MySQL。这是怎么回事? 问题答案: 好吧,这可能是DNS问题。您可以通过从配置文件中的选项开始禁用DNS主机名查找。 在这里阅读更多详细信息:http : //dev.mysql.com/doc/refman/5.
在之前的所有章节中,我们使用JangoSMPT服务器发送电子邮件。 在本章中,我们将了解Gmail提供的SMPT服务器。 Gmail(以及其他)免费提供其公共SMTP服务器。 Gmail SMTP服务器详细信息可在here找到。 正如您在详细信息中看到的,我们可以使用TLS或SSL连接通过Gmail SMTP服务器发送电子邮件。 使用Gmail SMTP服务器发送电子邮件的过程与发送电子邮件一章中
我有一个示例代码如下,套接字绑定到IP10.10.88.11和端口9876。我用下面的wireshark测试了2种情况。两台电脑都在同一个子网中。 从同一PC发送UDP数据包(10.10.88.11)-UDP服务器能够接收 从另一台电脑发送UDP数据包(10.10.88.10)-UDP服务器无法接收,但Wireshark(在10.10.88.11)能够捕获数据包 我在网上搜索过,但找不到解决办法。