Sync Changelog entries between branches
[qBittorrent.git] / src / base / net / smtp.h
blob6b74198cdc8bd05ebed61d62b393ecff1ac64683
1 /*
2 * Bittorrent Client using Qt and libtorrent.
3 * Copyright (C) 2011 Christophe Dumez <chris@qbittorrent.org>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 * In addition, as a special exception, the copyright holders give permission to
20 * link this program with the OpenSSL project's "OpenSSL" library (or with
21 * modified versions of it that use the same license as the "OpenSSL" library),
22 * and distribute the linked executables. You must obey the GNU General Public
23 * License in all respects for all of the code used other than "OpenSSL". If you
24 * modify file(s), you may extend this exception to your version of the file(s),
25 * but you are not obligated to do so. If you do not wish to do so, delete this
26 * exception statement from your version.
30 * This code is based on QxtSmtp from libqxt (http://libqxt.org)
33 #pragma once
35 #include <QAbstractSocket>
36 #include <QByteArray>
37 #include <QHash>
38 #include <QObject>
39 #include <QString>
41 #ifndef QT_NO_OPENSSL
42 class QSslSocket;
43 #else
44 class QTcpSocket;
45 #endif
46 class QTextCodec;
48 namespace Net
50 class Smtp : public QObject
52 Q_OBJECT
54 public:
55 Smtp(QObject *parent = nullptr);
56 ~Smtp();
58 void sendMail(const QString &from, const QString &to, const QString &subject, const QString &body);
60 private slots:
61 void readyRead();
62 void error(QAbstractSocket::SocketError socketError);
64 private:
65 enum States
67 Rcpt,
68 EhloSent,
69 HeloSent,
70 EhloDone,
71 EhloGreetReceived,
72 AuthRequestSent,
73 AuthSent,
74 AuthUsernameSent,
75 Authenticated,
76 StartTLSSent,
77 Data,
78 Init,
79 Body,
80 Quit,
81 Close
84 enum AuthType
86 AuthPlain,
87 AuthLogin,
88 AuthCramMD5
91 QByteArray encodeMimeHeader(const QString &key, const QString &value, const QByteArray &prefix = {});
92 void ehlo();
93 void helo();
94 void parseEhloResponse(const QByteArray &code, bool continued, const QString &line);
95 void authenticate();
96 void startTLS();
97 void authCramMD5(const QByteArray &challenge = {});
98 void authPlain();
99 void authLogin();
100 void logError(const QString &msg);
101 QString getCurrentDateTime() const;
103 QByteArray m_message;
104 #ifndef QT_NO_OPENSSL
105 QSslSocket *m_socket;
106 #else
107 QTcpSocket *m_socket;
108 #endif
109 QString m_from;
110 QString m_rcpt;
111 QString m_response;
112 int m_state;
113 QHash<QString, QString> m_extensions;
114 QByteArray m_buffer;
115 bool m_useSsl;
116 AuthType m_authType;
117 QString m_username;
118 QString m_password;