File indexing completed on 2024-05-05 16:20:04

0001 /*
0002     SPDX-FileCopyrightText: 2000 Bernd Johannes Wuebben <wuebben@math.cornell.edu>
0003     SPDX-FileCopyrightText: 2000 Stephan Kulow <coolo@kde.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #ifndef SMTP_H
0009 #define SMTP_H
0010 
0011 #include <QObject>
0012 #include <QTcpSocket>
0013 #include <QTimer>
0014 
0015 /*int SMTPServerStatus[] = {
0016     220,  // greeting from server
0017     221,  // server acknolages goodbye
0018     250,  // command successful
0019     354,  // ready to receive data
0020     501,  // error
0021     550,  // user unknown
0022     0     // null
0023 };
0024 
0025 int SMTPClientStatus[] = {
0026     50,   // not logged in yet.
0027     100,  // logged in, got 220
0028     150,  // sent helo, got 250
0029     200,  // sent mail from, got 250
0030     250,  // sent rctp to, got 250
0031     300,  // data sent, got 354
0032     350,  // sent data/., got 250
0033     400,  // send quit, got 221
0034     450,  // finished, logged out
0035     0     // null
0036 };
0037 */
0038 
0039 #define DEFAULT_SMTP_PORT 25
0040 #define DEFAULT_SMTP_SERVER localhost
0041 #define DEFAULT_SMTP_TIMEOUT 60
0042 
0043 #define SMTP_READ_BUFFER_SIZE 256
0044 
0045 class SMTP : public QObject
0046 {
0047     Q_OBJECT
0048 public:
0049     explicit SMTP(char *serverhost = nullptr, unsigned short int port = 0, int timeout = DEFAULT_SMTP_TIMEOUT);
0050     ~SMTP() override;
0051 
0052     void setServerHost(const QString &serverhost);
0053     void setPort(unsigned short int port);
0054     void setTimeOut(int timeout);
0055 
0056     bool isConnected() const
0057     {
0058         return connected;
0059     }
0060     bool isFinished() const
0061     {
0062         return finished;
0063     }
0064     QByteArray getLastLine() const
0065     {
0066         return lastLine;
0067     }
0068 
0069     void setSenderAddress(const QString &sender);
0070     void setRecipientAddress(const QString &recipient);
0071     void setMessageSubject(const QString &subject);
0072     void setMessageBody(const QString &message);
0073     void setMessageHeader(const QString &header);
0074 
0075     typedef enum {
0076         None = 0, // null
0077         Greet = 220, // greeting from server
0078         Goodbye = 221, // server acknolages quit
0079         Successful = 250, // command successful
0080         ReadyData = 354, // server ready to receive data
0081         Error = 501, // error
0082         Unknown = 550, // user unknown
0083     } SMTPServerStatus;
0084 
0085     typedef enum {
0086         Init = 50, // not logged in yet
0087         In = 100, // logged in, got 220
0088         Ready = 150, // sent HELO, got 250
0089         SentFrom = 200, // sent MAIL FROM:, got 250
0090         SentTo = 250, // sent RCTP TO:, got 250
0091         Data = 300, // Data sent, got 354
0092         Finished = 350, // finished sending data, got 250
0093         Quit = 400, // sent Quit, got 221
0094         Out = 450, // finished, logged out
0095         CError = 500, // didn't finish, had error or connection drop
0096     } SMTPClientStatus;
0097 
0098     typedef enum {
0099         NoError = 0,
0100         ConnectError = 10,
0101         NotConnected = 11,
0102         ConnectTimeout = 15,
0103         InteractTimeout = 16,
0104         UnknownResponse = 20,
0105         UnknownUser = 30,
0106         Command = 40,
0107     } SMTPError;
0108 
0109 protected:
0110     void processLine(QByteArray *line);
0111 
0112 public Q_SLOTS:
0113     void openConnection();
0114     void sendMessage();
0115     void closeConnection();
0116 
0117     void connectTimerTick();
0118     void connectTimedOut();
0119     void interactTimedOut();
0120 
0121     void socketReadyToRead();
0122     void socketClosed();
0123     void socketError(QAbstractSocket::SocketError);
0124 
0125 Q_SIGNALS:
0126     void connectionClosed();
0127     void messageSent();
0128     void error(int);
0129 
0130 private:
0131     QString serverHost;
0132     unsigned short int hostPort;
0133     int timeOut;
0134 
0135     bool connected;
0136     bool finished;
0137 
0138     QString senderAddress;
0139     QString recipientAddress;
0140     QString messageSubject;
0141     QString messageBody, messageHeader;
0142 
0143     SMTPClientStatus state;
0144     SMTPClientStatus lastState;
0145     SMTPServerStatus serverState;
0146 
0147     QString domainName;
0148 
0149     QTcpSocket *sock;
0150     QTimer connectTimer;
0151     QTimer timeOutTimer;
0152     QTimer interactTimer;
0153 
0154     char readBuffer[SMTP_READ_BUFFER_SIZE];
0155     QByteArray lineBuffer;
0156     QByteArray lastLine;
0157     QString writeString;
0158 };
0159 #endif