NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
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 error_code code = last_error()) noexcept
32 :
33 network_exception(info, code) {}
34
35 explicit smtp_exception(const exception& e) :
36 network_exception(e) {}
37
38 ~smtp_exception() override = default;
39
40 NEFORCE_NODISCARD const char* type() const noexcept override { return "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 io_context* ctx_{nullptr};
298
299 ssize_t raw_send(const char* data, size_t len);
300 ssize_t raw_recv(char* buf, size_t len);
301
302 bool read_line(string& out);
303 response read_response();
304 response send_command(const string& cmd);
305 void expect_code(int expected, const string& cmd);
306
307 vector<string> do_ehlo(const string& domain);
308
309 void do_post_connect(const string& domain, tls_mode mode, const ssl_context* ctx, const string& sni_hostname);
310
311 void do_tls_handshake(const ssl_context& ctx, const string& sni_hostname);
312
313 void open_and_connect(const ip_address& addr);
314
315public:
319 smtp_socket() = default;
320
325 explicit smtp_socket(native_handle_type fd) noexcept :
326 ip_socket(fd) {}
327
336 void connect(const ip_address& addr, const string& domain = "localhost", tls_mode mode = tls_mode::none,
337 const ssl_context* ctx = nullptr, const string& sni_hostname = "");
338
349 void connect(const string& hostname, ports port, const string& domain = "localhost", tls_mode mode = tls_mode::none,
350 dns_client* dns = nullptr, const ssl_context* ctx = nullptr, const string& sni_hostname = "");
351
358 starttls_result starttls(const ssl_context& ctx, const string& sni_hostname = "");
359
364
371 void authenticate(const string& username, const string& password, auth_method method = auth_method::plain);
372
377 void send(const smtp_message& msg);
378
382 void noop();
383
388 NEFORCE_NODISCARD bool is_connected() const noexcept { return connected_ && is_open(); }
389
394 NEFORCE_NODISCARD bool is_tls_active() const noexcept { return tls_active_; }
395
400 NEFORCE_NODISCARD bool verify_peer() const { return ssl_.verify_peer(); }
401
406 NEFORCE_NODISCARD string cipher_name() const { return ssl_.get_cipher_name(); }
407
412 NEFORCE_NODISCARD string tls_version() const { return ssl_.get_version(); }
413};
414 // SMTP
416
417NEFORCE_END_NAMESPACE__
418#endif // NEFORCE_NEWORK_SMTP_SOCKET_HPP__
统一异步操作核心
IP地址封装类
ip_socket()=default
默认构造函数
映射容器
定义 map.hpp:37
string cipher_name() const
获取当前TLS密码套件名
smtp_socket()=default
默认构造函数
void authenticate(const string &username, const string &password, auth_method method=auth_method::plain)
SMTP认证
bool is_connected() const noexcept
是否已连接
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服务器(域名)
void send(const smtp_message &msg)
发送邮件
void noop()
发送NOOP命令
void disconnect()
断开连接,发送QUIT命令
bool is_tls_active() const noexcept
TLS是否已激活
bool verify_peer() const
验证服务器证书
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)
starttls_result starttls(const ssl_context &ctx, const string &sni_hostname="")
执行STARTTLS升级
string tls_version() const
获取当前TLS版本
bool is_open() const noexcept
检查socket是否已打开
SSL/TLS上下文管理类
SSL/TLS流封装类
动态大小数组容器
DNS客户端实现
void * native_handle_type
系统句柄类型
error_code last_error() noexcept
获取当前系统错误码
constexpr none_t none
默认空表示
int64_t ssize_t
有符号大小类型
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
IP协议族Socket基类
映射容器
SSL/TLS流封装
网络端口封装类
const char * type() const noexcept override
获取异常类型
SMTP邮件消息结构
map< string, string > extra_headers
额外邮件头
string from
发件人地址
vector< string > bcc
密送地址列表
vector< string > cc
抄送地址列表
bool is_html
是否为HTML格式
vector< string > to
收件人地址列表
string subject
邮件主题
bool is_success() const noexcept
检查响应是否成功
string message
响应消息文本
bool peer_verified
对等方证书是否已验证
string cipher_name
当前密码套件名称
动态大小数组容器