1#ifndef NEFORCE_NEWORK_SMTP_SOCKET_HPP__
2#define NEFORCE_NEWORK_SMTP_SOCKET_HPP__
17NEFORCE_BEGIN_NAMESPACE__
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) {}
35 explicit smtp_exception(
const exception& e) :
36 network_exception(e) {}
38 ~smtp_exception()
override =
default;
40 static constexpr auto static_type =
"smtp_exception";
163 string server_domain_;
164 bool connected_ =
false;
167 bool tls_active_ =
false;
172 ssize_t raw_recv(
char* buf,
size_t len);
174 bool read_line(
string& out);
176 response send_command(
const string& cmd);
177 void expect_code(
int expected,
const string& cmd);
181 void do_post_connect(
const string& domain,
tls_mode mode,
const ssl_context* ctx,
const string& sni_hostname);
183 void do_tls_handshake(
const ssl_context& ctx,
const string& sni_hostname);
185 void open_and_connect(
const ip_address& addr);
209 const ssl_context* ctx =
nullptr,
const string& sni_hostname =
"");
266 NEFORCE_NODISCARD
bool is_tls_active() const noexcept {
return tls_active_; }
272 NEFORCE_NODISCARD
bool verify_peer()
const {
return ssl_.verify_peer(); }
278 NEFORCE_NODISCARD
string cipher_name()
const {
return ssl_.get_cipher_name(); }
284 NEFORCE_NODISCARD
string tls_version()
const {
return ssl_.get_version(); }
289NEFORCE_END_NAMESPACE__
ip_socket()=default
默认构造函数
void authenticate(const string &username, const string &password, auth_method method=auth_method::plain)
SMTP认证
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
默认构造函数
NEFORCE_NODISCARD bool is_tls_active() const noexcept
TLS是否已激活
int native_handle_type
平台原生句柄类型
NEFORCE_NODISCARD bool is_open() const noexcept
检查socket是否已打开
NEFORCE_INLINE17 constexpr none_t none
默认空表示
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
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
获取异常类型
map< string, string > extra_headers
额外邮件头
vector< string > cc
抄送地址列表
vector< string > to
收件人地址列表
vector< string > bcc
密送地址列表
NEFORCE_NODISCARD bool is_success() const noexcept
检查响应是否成功
bool peer_verified
对等方证书是否已验证
string tls_version
TLS协议版本
string cipher_name
当前密码套件名称