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 для более подробного объяснения протокола.