【问题标题】:554 SMTP synchronization error with exim4 and my codeexim4 和我的代码出现 554 SMTP 同步错误
【发布时间】:2010-02-15 08:15:37
【问题描述】:

我从 exim4 遇到了这个拒绝错误:

2010-02-15 01:46:05 SMTP 协议同步错误(未等待问候就发送输入):拒绝来自 H=ender [192.168.20.49] 的连接 input="HELO 192.168.20.49\r\n"

我已修改我的 exim4 配置以不强制同步,如下所示:

 smtp_enforce_sync='false'
 acl_smtp_connect = nosync nosync:
         control = no_enforce_sync
         accept

但这似乎并不重要。对我来说不太有意义的是为什么我首先要获得 554。我发送一个 HELO,我等待响应,不知何故,我设法生成了“554 错误”

我在下面的代码中做错了什么,这使得 99% 的时间都失败了(是的,它已经工作了两次)。是的,套接字阻塞了,我在 recv 中挂起约 5 秒等待拒绝。在它工作的2次中,它根本没有暂停。

我尝试发送 EHLO 而不是 HELO,但运气不好。我什至很难过通过远程登录会话来连接并说 HELO。但是,我可以使用 python smtp(从另一台机器)向同一台服务器发送电子邮件!

        hSocket = _connectServerSocket(server, port);    
    if (hSocket != INVALID_SOCKET) {        
        BYTE        sReceiveBuffer[4096];
        int            iLength = 0;
        int            iEnd = 0;
        char        buf[4096];

        strcpy(buf, "HELO ");
        strcat(buf, "192.168.20.49");
        strcat(buf, "\r\n");
        printf("%s", buf);
        if (send(hSocket, (LPSTR)buf, strlen(buf), NO_FLAGS) == SOCKET_ERROR) {
            printf("Socket send error: %d\r\n", WSAGetLastError());    
            return (false);
        }
        iLength = recv(hSocket, 
                       (LPSTR)sReceiveBuffer+iEnd,sizeof(sReceiveBuffer)-iEnd, 
                        NO_FLAGS);
        iEnd += iLength;
        sReceiveBuffer[iEnd] = '\0';

【问题讨论】:

标签: smtp exim4


【解决方案1】:

在发送 HELO 消息之前,您的代码应该等待来自 smtp 服务器的220 行。请参阅RFC 2821 的第 3.1 节。这可能就是 Python 库的作用。

应该有几个免费的库可以帮助您解决这个问题,例如libsmtp。考虑花时间学习其中之一,而不是修补您自己的解决方案(除非您的项目是编写自己的邮件解决方案)。

【讨论】:

  • 我确实在上面的链接中找到了这段代码。大多数 smtp 库似乎很难在 Windows 下工作。感谢在我发送 HELO 之前对 220 的提醒,我在规范中错过了这一点。我已经对该代码进行了很好的清理,我可能会将其发布在该文章的 cmets 中。
猜你喜欢
  • 2014-10-26
  • 2015-03-29
  • 1970-01-01
  • 2010-09-18
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
相关资源
最近更新 更多