ImagingTools Core SDK
CSmtpClientComp.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtNetwork/QSslSocket>
7
8// ACF includes
9#include <ilog/TLoggerCompWrap.h>
10#include <iprm/ITextParam.h>
11
12// ImtCore includes
13#include <imtmail/ISmtpClient.h>
14
15
16namespace imtmail
17{
18
19
20class CSmtpClientComp: public QObject, public ilog::CLoggerComponentBase, virtual public ISmtpClient
21{
22 Q_OBJECT
23public:
24 typedef ilog::CLoggerComponentBase BaseClass;
25
26 I_BEGIN_COMPONENT(CSmtpClientComp);
27 I_REGISTER_INTERFACE(ISmtpClient);
28 I_ASSIGN(m_hostNameAttrPtr, "Host", "The property holds connection's host name.", false, "smtp.gmail.com");
29 I_ASSIGN(m_hostParamCompPtr, "HostParam", "The property holds connection's host name parameter", false, "");
30 I_ASSIGN(m_portAttrPtr, "Port", "The property holds connection's port number", false, 465);
31 I_ASSIGN(m_portParamCompPtr, "PortParam", "The property holds connection's port number parameter", false, "");
32 I_ASSIGN(m_timeoutAttrPtr, "Timeout", "Timeout (in msecs)", false, 5000);
33 I_ASSIGN(m_userAttrPtr, "User", "User", false, "");
34 I_ASSIGN(m_userParamCompPtr, "UserParam", "User parameter", false, "");
35 I_ASSIGN(m_passwordAttrPtr, "Password", "Password", false, "");
36 I_ASSIGN(m_passwordParamCompPtr, "PasswordParam", "Password parameter", false, "");
37 I_END_COMPONENT;
38
39 CSmtpClientComp();
40
41protected:
42 enum ResponseCode
43 {
44 RC_UNKNOWN = -1,
45 RC_SERVICE_READY = 220,
46 RC_OK = 250,
47 RC_AUTHENTIFICATION_REQUEST = 334,
48 RC_AUTHENTIFICATION_SUCCESSFUL = 235,
49 RC_START_MAIL_INPUT = 354,
50 RC_SERVICE_CLOSING = 221
51 };
52
53 enum MailStatus
54 {
55 MS_TLS,
56 MS_HANDSHAKE,
57 MS_AUTH,
58 MS_USER,
59 MS_PASS,
60 MS_RCPT,
61 MS_MAIL,
62 MS_DATA,
63 MS_INIT,
64 MS_BODY,
65 MS_QUIT,
66 MS_CLOSE
67 };
68
69 ResponseCode ExtractResponseCode(const QByteArray& response);
70 void SendCommand(const QString& command);
71 void ClearData();
72
73 // reimplemented (imtmail::ISmtpClient)
74 virtual QString GetHost() const override;
75 virtual int GetPort() const override;
76 virtual bool SendEmail(const ISmtpMessage& message) const override;
77
78private slots:
79 void OnStateChanged(QAbstractSocket::SocketState socketState);
80 void OnErrorReceived(QAbstractSocket::SocketError socketError);
81 void OnSslErrors(const QList<QSslError>& sslErrors);
82 void OnDisconnected();
83 void OnConnected();
84 void OnReadyRead();
85 void OnEcrypted();
86
87private:
88 I_ATTR(QByteArray, m_userAttrPtr);
89 I_REF(iprm::ITextParam, m_userParamCompPtr);
90 I_ATTR(QByteArray, m_passwordAttrPtr);
91 I_REF(iprm::ITextParam, m_passwordParamCompPtr);
92 I_ATTR(QString, m_hostNameAttrPtr);
93 I_REF(iprm::ITextParam, m_hostParamCompPtr);
94 I_ATTR(int, m_portAttrPtr);
95 I_REF(iprm::ITextParam, m_portParamCompPtr);
96 I_ATTR(int, m_timeoutAttrPtr);
97
98private:
99 mutable std::unique_ptr<QSslSocket> m_socketPtr;
100 mutable istd::TUniqueInterfacePtr<ISmtpMessage> m_smtpMessagePtr;
101 std::unique_ptr<QTextStream> m_textStreamPtr;
102 mutable int m_currentMailSendState;
103 mutable QString m_message;
104};
105
106
107} // namespace imtmail
108
109
110