
---@class socket_smtp_message*
---@field headers? table<string, string> 邮件头。
---@field body? string|ltn12_source 邮件正文。

---@class socket_smtp_mail*
---@field from string 发件人。
---@field rcpt string|string[] 收件人。
---@field source? ltn12_source 邮件 source。
---@field user? string 用户名。
---@field password? string 密码。
---@field server? string SMTP 服务器。
---@field port? integer SMTP 端口。
---@field domain? string HELO/EHLO domain。
---@field create? function socket 创建函数。

---@class socket_smtp_connection*
local socket_smtp_connection = {}

---@class socket_smtp*
---@field TIMEOUT number 默认超时。
---@field SERVER string 默认服务器。
---@field PORT integer 默认端口。
---@field DOMAIN string 默认 domain。
---@field ZONE string 默认时区。
---@type socket_smtp*
local M = {}

M.TIMEOUT = 60
M.SERVER = nil
M.PORT = 25
M.DOMAIN = nil
M.ZONE = nil

--- 打开 SMTP 连接。
---@param server? string 服务器。
---@param port? integer 端口。
---@param create? function socket 创建函数。
---@return socket_smtp_connection*? connection 连接对象。
---@return string? errMsg 错误信息。
function M.open(server, port, create) end

--- 构造 MIME message source。
---@param message socket_smtp_message* 消息参数。
---@return ltn12_source source source 函数。
function M.message(message) end

--- 发送邮件。
---@param mail socket_smtp_mail* 邮件参数。
---@return any result 结果。
function M.send(mail) end

--- LuaSocket try 函数。
---@param ... any 值。
---@return any ... 非错误返回值。
function M.try(...) end

return M
