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
208
225
241class NEFORCE_API smtp_socket final : public ip_socket {
242public:
247 enum class auth_method {
249 plain,
250 login
251 };
252
257 enum class tls_mode {
259 implicit,
261 };
262
267 struct response {
268 int code;
269 string message;
270
275 NEFORCE_NODISCARD bool is_success() const noexcept { return code >= 200 && code < 400; }
276 };
277
283 bool upgraded = false;
284 string cipher_name;
285 string tls_version;
286 bool peer_verified = false;
287 };
288
289private:
290 string server_domain_;
291 bool connected_ = false;
292
293 tls_mode tls_mode_ = tls_mode::none;
294 bool tls_active_ = false;
295
296 ssl_stream ssl_;
297
298 ssize_t raw_send(const char* data, size_t len);
299 ssize_t raw_recv(char* buf, size_t len);
300
301 bool read_line(string& out);
302 response read_response();
303 response send_command(const string& cmd);
304 void expect_code(int expected, const string& cmd);
305
306 vector<string> do_ehlo(const string& domain);
307
308 void do_post_connect(const string& domain, tls_mode mode, const ssl_context* ctx, const string& sni_hostname);
309
310 void do_tls_handshake(const ssl_context& ctx, const string& sni_hostname);
311
312 void open_and_connect(const ip_address& addr);
313
314public:
318 smtp_socket() = default;
319
324 explicit smtp_socket(native_handle_type fd) noexcept :
325 ip_socket(fd) {}
326
335 void connect(const ip_address& addr, const string& domain = "localhost", tls_mode mode = tls_mode::none,
336 const ssl_context* ctx = nullptr, const string& sni_hostname = "");
337
348 void connect(const string& hostname, ports port, const string& domain = "localhost", tls_mode mode = tls_mode::none,
349 dns_client* dns = nullptr, const ssl_context* ctx = nullptr, const string& sni_hostname = "");
350
357 starttls_result starttls(const ssl_context& ctx, const string& sni_hostname = "");
358
363
370 void authenticate(const string& username, const string& password, auth_method method = auth_method::plain);
371
376 void send(const smtp_message& msg);
377
381 void noop();
382
387 NEFORCE_NODISCARD bool is_connected() const noexcept { return connected_ && is_open(); }
388
393 NEFORCE_NODISCARD bool is_tls_active() const noexcept { return tls_active_; }
394
399 NEFORCE_NODISCARD bool verify_peer() const { return ssl_.verify_peer(); }
400
405 NEFORCE_NODISCARD string cipher_name() const { return ssl_.get_cipher_name(); }
406
411 NEFORCE_NODISCARD string tls_version() const { return ssl_.get_version(); }
412};
413 // SMTP
415
416NEFORCE_END_NAMESPACE__
417#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认证
string cipher_name() const
获取当前TLS密码套件名
bool is_tls_active() const noexcept
TLS是否已激活
void noop()
发送NOOP命令
void disconnect()
断开连接,发送QUIT命令
string tls_version() const
获取当前TLS版本
bool is_connected() const noexcept
是否已连接
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服务器(域名)
bool verify_peer() const
验证服务器证书
void send(const smtp_message &msg)
发送邮件
smtp_socket(native_handle_type fd) noexcept
从原生句柄构造
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认证方式
::UINT_PTR native_handle_type
平台原生句柄类型
bool is_open() const noexcept
检查socket是否已打开
SSL/TLS上下文管理类
SSL/TLS流封装类
动态大小数组容器
DNS客户端实现
constexpr none_t none
默认空表示
int64_t ssize_t
有符号大小类型
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)
构造函数
const char * type() const noexcept
获取异常类型
int code() 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
密送地址列表
bool is_success() const noexcept
检查响应是否成功
string message
响应消息文本
bool upgraded
是否成功升级
bool peer_verified
对等方证书是否已验证
string tls_version
TLS协议版本
string cipher_name
当前密码套件名称
动态大小数组容器