5

我首先遇到了来自 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';
4

1 回答 1

6

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

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

于 2010-02-15T08:22:53.320 回答