NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
smtp_socket.hpp
浏览该文件的文档.
1#ifndef NEFORCE_NEWORK_SMTP_SOCKET_HPP__
2#define NEFORCE_NEWORK_SMTP_SOCKET_HPP__
3
11
17NEFORCE_BEGIN_NAMESPACE__
18
23
30struct NEFORCE_API smtp_exception final : network_exception {
31 explicit smtp_exception(const char* info = "SMTP Operation Failed.", const char* type = static_type,
32 const int code = 0) noexcept :
33 network_exception(info, type, code) {}
34
35 explicit smtp_exception(const exception& e) :
36 network_exception(e) {}
37
38 ~smtp_exception() override = default;
39
40 static constexpr auto static_type = "smtp_exception";
41};
42 // Exceptions
44
49
66
114class NEFORCE_API smtp_socket final : public ip_socket {
115public:
120 enum class auth_method {
122 plain,
123 login
124 };
125
130 enum class tls_mode {
132 implicit,
134 };
135
140 struct response {
141 int code;
142 string message;
143
148 NEFORCE_NODISCARD bool is_success() const noexcept { return code >= 200 && code < 400; }
149 };
150
156 bool upgraded = false;
157 string cipher_name;
158 string tls_version;
159 bool peer_verified = false;
160 };
161
162private:
163 string server_domain_;
164 bool connected_ = false;
165
166 tls_mode tls_mode_ = tls_mode::none;
167 bool tls_active_ = false;
168
169 ssl_stream ssl_;
170
171 ssize_t raw_send(const char* data, size_t len);
172 ssize_t raw_recv(char* buf, size_t len);
173
174 bool read_line(string& out);
175 response read_response();
176 response send_command(const string& cmd);
177 void expect_code(int expected, const string& cmd);
178
179 vector<string> do_ehlo(const string& domain);
180
181 void do_post_connect(const string& domain, tls_mode mode, const ssl_context* ctx, const string& sni_hostname);
182
183 void do_tls_handshake(const ssl_context& ctx, const string& sni_hostname);
184
185 void open_and_connect(const ip_address& addr);
186
187public:
191 smtp_socket() = default;
192
197 explicit smtp_socket(native_handle_type fd) noexcept :
198 ip_socket(fd) {}
199
208 void connect(const ip_address& addr, const string& domain = "localhost", tls_mode mode = tls_mode::none,
209 const ssl_context* ctx = nullptr, const string& sni_hostname = "");
210
221 void connect(const string& hostname, ports port, const string& domain = "localhost", tls_mode mode = tls_mode::none,
222 dns_client* dns = nullptr, const ssl_context* ctx = nullptr, const string& sni_hostname = "");
223
230 starttls_result starttls(const ssl_context& ctx, const string& sni_hostname = "");
231
236
243 void authenticate(const string& username, const string& password, auth_method method = auth_method::plain);
244
249 void send(const smtp_message& msg);
250
254 void noop();
255
260 NEFORCE_NODISCARD bool is_connected() const noexcept { return connected_ && is_open(); }
261
266 NEFORCE_NODISCARD bool is_tls_active() const noexcept { return tls_active_; }
267
272 NEFORCE_NODISCARD bool verify_peer() const { return ssl_.verify_peer(); }
273
278 NEFORCE_NODISCARD string cipher_name() const { return ssl_.get_cipher_name(); }
279
284 NEFORCE_NODISCARD string tls_version() const { return ssl_.get_version(); }
285};
286 // Network
288
289NEFORCE_END_NAMESPACE__
290#endif // NEFORCE_NEWORK_SMTP_SOCKET_HPP__
DNS客户端类
IP地址封装类
ip_socket()=default
默认构造函数
映射容器
定义 map.hpp:37
void authenticate(const string &username, const string &password, auth_method method=auth_method::plain)
SMTP认证
void noop()
发送NOOP命令
void disconnect()
断开连接,发送QUIT命令
NEFORCE_NODISCARD bool is_connected() const noexcept
是否已连接
NEFORCE_NODISCARD bool verify_peer() const
验证服务器证书
starttls_result starttls(const ssl_context &ctx, const string &sni_hostname="")
执行STARTTLS升级
void connect(const string &hostname, ports port, const string &domain="localhost", tls_mode mode=tls_mode::none, dns_client *dns=nullptr, const ssl_context *ctx=nullptr, const string &sni_hostname="")
连接SMTP服务器(域名)
NEFORCE_NODISCARD string cipher_name() const
获取当前TLS密码套件名
void send(const smtp_message &msg)
发送邮件
smtp_socket(native_handle_type fd) noexcept
从原生句柄构造
NEFORCE_NODISCARD string tls_version() const
获取当前TLS版本
void connect(const ip_address &addr, const string &domain="localhost", tls_mode mode=tls_mode::none, const ssl_context *ctx=nullptr, const string &sni_hostname="")
连接SMTP服务器(IP)
smtp_socket()=default
默认构造函数
tls_mode
TLS连接模式
auth_method
SMTP认证方式
NEFORCE_NODISCARD bool is_tls_active() const noexcept
TLS是否已激活
int native_handle_type
平台原生句柄类型
NEFORCE_NODISCARD bool is_open() const noexcept
检查socket是否已打开
SSL/TLS上下文管理类
SSL/TLS流封装类
动态大小数组容器
DNS客户端实现
NEFORCE_INLINE17 constexpr none_t none
默认空表示
int64_t ssize_t
有符号大小类型
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
IP协议族Socket基类
映射容器
SSL/TLS流封装
exception(const char *info=static_type, const char *type=static_type, const int code=0)
构造函数
NEFORCE_NODISCARD int code() const noexcept
获取异常码
NEFORCE_NODISCARD const char * type() const noexcept
获取异常类型
网络端口封装类
SMTP邮件消息结构
map< string, string > extra_headers
额外邮件头
string body
邮件正文
vector< string > cc
抄送地址列表
string subject
邮件主题
bool is_html
是否为HTML格式
string from
发件人地址
vector< string > to
收件人地址列表
vector< string > bcc
密送地址列表
string message
响应消息文本
NEFORCE_NODISCARD bool is_success() const noexcept
检查响应是否成功
bool upgraded
是否成功升级
bool peer_verified
对等方证书是否已验证
string tls_version
TLS协议版本
string cipher_name
当前密码套件名称
动态大小数组容器