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 error_code code =
last_error()) noexcept
33 network_exception(info, code) {}
35 explicit smtp_exception(
const exception& e) :
36 network_exception(e) {}
38 ~smtp_exception()
override =
default;
40 NEFORCE_NODISCARD
const char*
type() const noexcept
override {
return "smtp_exception"; }
290 string server_domain_;
291 bool connected_ =
false;
294 bool tls_active_ =
false;
300 ssize_t raw_recv(
char* buf,
size_t len);
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);
309 void do_post_connect(
const string& domain, tls_mode mode,
const ssl_context* ctx,
const string& sni_hostname);
311 void do_tls_handshake(
const ssl_context& ctx,
const string& sni_hostname);
313 void open_and_connect(
const ip_address& addr);
337 const ssl_context* ctx =
nullptr,
const string& sni_hostname =
"");
394 NEFORCE_NODISCARD
bool is_tls_active() const noexcept {
return tls_active_; }
400 NEFORCE_NODISCARD
bool verify_peer()
const {
return ssl_.verify_peer(); }
406 NEFORCE_NODISCARD
string cipher_name()
const {
return ssl_.get_cipher_name(); }
412 NEFORCE_NODISCARD
string tls_version()
const {
return ssl_.get_version(); }
417NEFORCE_END_NAMESPACE__
ip_socket()=default
默认构造函数
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 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是否已打开
void * native_handle_type
系统句柄类型
error_code last_error() noexcept
获取当前系统错误码
constexpr none_t none
默认空表示
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
const char * type() const noexcept override
获取异常类型
map< string, string > extra_headers
额外邮件头
vector< string > bcc
密送地址列表
vector< string > cc
抄送地址列表
vector< string > to
收件人地址列表
bool is_success() const noexcept
检查响应是否成功
string tls_version
TLS协议版本
bool peer_verified
对等方证书是否已验证
string cipher_name
当前密码套件名称