[Qt ingresó por primera vez a los ríos y lagos] Descripción detallada de la arquitectura subyacente y los principios de Qt SMTP

Yuxian: socio de contenido de CSDN, nuevo mentor estrella de CSDN, 51CTO (principal celebridad + blogger experto), entusiasta del código abierto de github (desarrollo secundario del código fuente de cero, arquitectura back-end del juego https://github.com/Peakchen)

 

Qt proporciona una clase llamada QSslSocket que se puede usar para implementar un cliente SMTP encriptado. La clase QSslSocket proporciona un conjunto de funciones convenientes para enviar comandos SMTP y procesar datos devueltos por el servidor SMTP.

El siguiente es el diagrama de arquitectura de implementación básica de QSslSocket:

+-------------------+
|      QSslSocket   |
+-------------------+
| - state           |
| - sslConfiguration|
| - socketError     |
| - readBuffer      |
| - writeBuffer     |
| - readNotifier    |
| - writeNotifier   |
| - exceptionNotifier|
+-------------------+
          /_\
           |
           | 继承
           |
+-------------------+
|      QAbstractSocket |
+-------------------+
| - socketState     |
| - socketError     |
| - readBuffer      |
| - writeBuffer     |
| - readNotifier    |
| - writeNotifier   |
| - exceptionNotifier|
+-------------------+
          /_\
           |
           | 继承
           |
+-------------------+
|       QObject     |
+-------------------+

Se puede ver que QSslSocket hereda de dos clases QAbstractSocket y QObject, entre las cuales QAbstractSocket proporciona operaciones básicas de socket (como conectar, desconectar, enviar datos, etc.), mientras que QObject proporciona funciones básicas de objetos (como señales y slot, object nombre, etc).

En la clase QSslSocket, la variable miembro state representa el estado actual de la conexión SSL, la variable miembro sslConfiguration representa la configuración SSL, la variable miembro socketError representa el mensaje de error del socket, las variables miembro readBuffer y writeBuffer representan el búfer de datos de lectura/escritura respectivamente, y las variables miembros readNotifier y writeNotifier indican banderas para el estado de lectura/escritura.

Las funciones de la clase QSslSocket se dividen principalmente en dos categorías: funciones de comando SMTP y funciones de procesamiento de respuesta. La función de comando SMTP se usa para enviar comandos SMTP y procesar la respuesta devuelta, y la función de procesamiento de respuesta se usa para analizar y procesar el mensaje de respuesta devuelto por el servidor SMTP.

Las funciones del comando SMTP incluyen:

  • connectToHostEncrypted(): Conéctese al servidor SMTP.
  • login (): inicie sesión en el servidor SMTP.
  • sendMail(): Enviar correo.
  • quit(): Desconecta la conexión SMTP.

Los controladores de respuesta incluyen:

  • stateChanged(): El estado de la conexión SSL ha cambiado.
  • encriptado (): se establece la conexión SSL.
  • readyRead(): el servidor SMTP devuelve datos.
  • error(): Ocurrió un error en la operación SMTP.

La arquitectura subyacente de Qt SMTP consta de las siguientes partes:

  1. QSSlSocket

QSslSocket es una clase que se usa en Qt para implementar una comunicación de socket segura, que puede usar el protocolo SSL o TLS para proteger la seguridad del contenido de la comunicación. En Qt SMTP, podemos usar QSslSocket para establecer una conexión segura con el servidor SMTP.

  1. QSmtpClient

QSmtpClient es la clase de cliente de Qt SMTP, que se encarga de implementar la lógica del cliente SMTP. QSmtpClient incluye varios comandos en el protocolo SMTP, como EHLO, AUTH, MAIL FROM, RCPT TO, DATA, etc., así como métodos y señales para procesar las respuestas SMTP.

  1. QSmtpMessage

QSmtpMessage es una clase utilizada para representar el correo en Qt SMTP, que contiene varios atributos de correo, como remitente, destinatario, asunto, cuerpo, etc. En Qt SMTP, podemos usar QSmtpMessage para crear y enviar correos electrónicos.

El siguiente es el diagrama de arquitectura subyacente de Qt SMTP:

En Qt SMTP, podemos utilizar los siguientes métodos para lograr el envío y la gestión de correo:

  1. conectar al host ()

Para conectarse al servidor SMTP se utiliza el método connectToHost(), que acepta un parámetro de tipo cadena, que indica el nombre de host o dirección IP del servidor SMTP, y un parámetro de tipo entero, que indica el número de puerto del servidor SMTP. Por ejemplo:

QSmtpClient smtp;
smtp.connectToHost("smtp.example.com", 465);
  1. acceso()

El método login() se utiliza para iniciar sesión en el servidor SMTP y acepta dos parámetros de tipo cadena, que representan el nombre de usuario y la contraseña del servidor SMTP, respectivamente. Por ejemplo:

QSmtpClient smtp;
smtp.connectToHost("smtp.example.com", 465);
smtp.login("username", "password");
  1. establecerDesde()

El método setFrom() se utiliza para establecer el remitente del correo electrónico, que acepta un parámetro de tipo QByteArray, que indica la dirección de correo electrónico del remitente. Por ejemplo:

QSmtpClient smtp;
smtp.connectToHost("smtp.example.com", 465);
smtp.login("username", "password");

QSmtpMessage message;
message.setFrom("[email protected]");
  1. añadir()

El método addTo() se usa para agregar el destinatario del correo, acepta un parámetro de tipo QByteArray, que representa la dirección de correo del destinatario. Este método se puede llamar varias veces si se van a agregar varios destinatarios. Por ejemplo:

QSmtpClient smtp;
smtp.connectToHost("smtp.example.com", 465);
smtp.login("username", "password");

QSmtpMessage message;
message.setFrom("[email protected]");
message.addTo("[email protected]");
message.addTo("[email protected]");
  1. establecerAsunto()

El método setSubject() se utiliza para establecer el asunto del correo, que acepta un parámetro de tipo QByteArray, que indica el asunto del correo. Por ejemplo:

QSmtpClient smtp;
smtp.connectToHost("smtp.example.com", 465);
smtp.login("username", "password");

QSmtpMessage message;
message.setFrom("[email protected]");
message.addTo("[email protected]");
message.setSubject("Test Email");
  1. establecerCuerpo()

Para configurar el cuerpo del correo se utiliza el método setBody(), que acepta un parámetro de tipo QByteArray, indicando el cuerpo del correo. Por ejemplo:

QSmtpClient smtp;
smtp.connectToHost("smtp.example.com", 465);
smtp.login("username", "password");

QSmtpMessage message;
message.setFrom("[email protected]");
message.addTo("[email protected]");
message.setSubject("Test Email");
message.setBody("This is a test email.");
  1. enviar()

El método send() se usa para enviar correo, no acepta ningún parámetro. Antes de llamar al método send(), debemos configurar el remitente, el destinatario, el asunto y el cuerpo del correo electrónico. Por ejemplo:

QSmtpClient smtp;
smtp.connectToHost("smtp.example.com", 465);
smtp.login("username", "password");

QSmtpMessage message;
message.setFrom("[email protected]");
message.addTo("[email protected]");
message.setSubject("Test Email");
message.setBody("This is a test email.");

smtp.send(message);

Los anteriores son algunos métodos comunes de Qt SMTP Además, Qt SMTP también proporciona métodos como setCc(), setBcc(), addAttachment(), etc. para lograr funciones de correo más ricas.

A continuación, se muestra un código de muestra Qt SMTP completo que demuestra cómo usar Qt SMTP para enviar un correo electrónico con un archivo adjunto:

#include <QCoreApplication>
#include <QDebug>
#include <QFile>
#include <QSmtpClient>
#include <QSmtpMessage>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 创建SMTP客户端并连接到SMTP服务器
    QSmtpClient smtp;
    smtp.setHost("smtp.gmail.com");
    smtp.setPort(465);
    smtp.setUsername("[email protected]");
    smtp.setPassword("password");
    smtp.setConnectionType(QSmtpClient::SslConnection);

    if (!smtp.connectToHost()) {
        qDebug() << "Failed to connect to SMTP server.";
        return 1;
    }

    // 创建邮件
    QSmtpMessage message;
    message.setFrom("[email protected]");
    message.addTo("[email protected]");
    message.setSubject("Test Email");
    message.setBody("This is a test email with attachment.");

    // 添加附件
    QFile file("attachment.txt");
    if (file.open(QIODevice::ReadOnly)) {
        QByteArray data = file.readAll();
        message.addAttachment("attachment.txt", data);
        file.close();
    }

    // 发送邮件
    if (!smtp.login() || !smtp.send(message)) {
        qDebug() << "Failed to send email.";
        return 1;
    }

    qDebug() << "Email sent successfully.";
    return 0;
}

En este ejemplo, primero creamos un objeto QSmtpClient y configuramos el nombre de host, el número de puerto, el nombre de usuario, la contraseña y el tipo de conexión del servidor SMTP. Luego, nos conectamos al servidor SMTP usando el método connectToHost() y creamos un correo electrónico. Luego, agregamos un archivo adjunto a través del método addAttachment(), y finalmente usamos el método login() para iniciar sesión en el servidor SMTP y llamamos al método send() para enviar el correo electrónico. Si el envío es exitoso, imprimiremos "Correo electrónico enviado con éxito" en la consola.

Supongo que te gusta

Origin blog.csdn.net/feng1790291543/article/details/131807173
Recomendado
Clasificación