SMTP отправлять почту с QTcpSocket

Я создал графический интерфейс почтовой службы с использованием qt QsslSocket и я буду отправлять почту, используя учетную запись gmail "smtp.gmail.com", 465, и я хотел, чтобы она портировалась на QTCPsocket и отправил письмо с вложением. TCP-сокет подключается.. но не излучает readyRead() сигнал.

проблема с моим кодом или сервером Gmail не поддерживает TCP-соединение..? потому что для QSSLSocket это работает нормально для меня.

Мой код

socket = new QTcpSocket( this );

connect( socket, SIGNAL( readyRead() ), this, SLOT( readyRead() ) );
connect( socket, SIGNAL( connected() ), this, SLOT( connected() ) );
connect(socket, SIGNAL(error(QTcpSocket::SocketError)), this,SLOT(errorReceived(QTcpSocket::SocketError)));
connect(socket, SIGNAL(stateChanged(QTcpSocket::SocketState)), this, SLOT(stateChanged(QTcpSocket::SocketState)));
connect(socket, SIGNAL(disconnectedFromHost()), this,
        SLOT(disconnected()));;

message = "To: " + to + "\n";
message.append("From: " + from + "\n");
message.append("Subject: " + subject + "\n");
message.append(body);
message.replace( QString::fromLatin1( "\n" ), QString::fromLatin1( "\r\n" ) );
message.replace( QString::fromLatin1( "\r\n.\r\n" ),
                 QString::fromLatin1( "\r\n..\r\n" ) );
this->from = from;
rcpt = to;
state = Init;
socket->connectToHost( "smtp.gmail.com", 465);
if(socket->waitForConnected ( 30000 )) {qDebug("connected"); }

t = new QTextStream( socket );

1 ответ

Вам нужно будет изучить протокол ESMTP более внимательно. Недостаточно просто выбрать QTcpSocket или QSslSocket и затем подключиться к серверу.

Для безопасного соединения вам нужно использовать QSslSocket для небезопасного подключения к порту выполните стандартное приветствие SMTP, а затем проверьте, какие VERBS поддерживаются. Если поддерживается STARTTLS, вы можете инициировать безопасное соединение, в противном случае вы должны использовать незащищенное соединение в соответствии с обычным SMTP.

Если разрешены безопасные соединения, вы отправляете команду "STARTTLS" на SMTP-сервер, а затем, когда получаете ответ 220, вы звоните QSslSocket::setProtocol() со значением QSsl::TlsV1_0, с последующим QSslSocket::startClientEncryption(),

После того как вы получили QSslSocket::encrypted() сигнал, вы должны повторить процесс приветствия, а затем продолжить нормальный SMTP-разговор.

См. RFC 3207 для более подробного объяснения протокола.

Другие вопросы по тегам