| 165 | void set_email_data(const email_data &data) { data_ = data; } |
| 166 | |
| 167 | async_simple::coro::Lazy<void> send_email() { |
| 168 | std::string host = server_.server; |
| 169 | size_t pos = host.find("://"); |
| 170 | if (pos != std::string::npos) { |
| 171 | host.erase(0, pos + 3); |
| 172 | } |
| 173 | |
| 174 | asio::ip::tcp::resolver::query qry( |
| 175 | host, server_.port, asio::ip::resolver_query_base::numeric_service); |
| 176 | std::error_code ec; |
| 177 | auto endpoint_iterator = resolver_.resolve(qry, ec); |
| 178 | |
| 179 | ec = co_await async_connect(io_context_, socket_, host, server_.port); |
| 180 | if (ec) { |
| 181 | std::cout << "Connect error: " << ec.message() << '\n'; |
| 182 | throw asio::system_error(ec); |
| 183 | } |
| 184 | |
| 185 | std::cout << "connect ok\n"; |
| 186 | if constexpr (IS_SSL) { |
| 187 | upgrade_to_ssl(); |
| 188 | } |
| 189 | |
| 190 | build_request(); |
| 191 | |
| 192 | const char *header = asio::buffer_cast<const char *>(request_.data()); |
| 193 | std::cout << header << '\n'; |
| 194 | [[maybe_unused]] auto [write_ec, size] = co_await async_write( |
| 195 | get_socket(), asio::buffer(header, request_.size())); |
| 196 | if (write_ec) { |
| 197 | std::cout << "write failed, reason: " << ec.message() << '\n'; |
| 198 | throw asio::system_error(write_ec); |
| 199 | } |
| 200 | |
| 201 | while (true) { |
| 202 | const int max_length = 1024; |
| 203 | char read_buf[max_length]; |
| 204 | [[maybe_unused]] auto [read_ec, size] = co_await async_read_some( |
| 205 | get_socket(), asio::buffer(read_buf, max_length)); |
| 206 | if (read_ec) { |
| 207 | std::cout << "read failed, reason: " << ec.message() << '\n'; |
| 208 | throw asio::system_error(read_ec); |
| 209 | } |
| 210 | |
| 211 | std::string_view content(read_buf, size); |
| 212 | std::cout << content; |
| 213 | |
| 214 | if (content.find("250 Mail OK") != std::string_view::npos) { |
| 215 | std::cout << "end smtp\n"; |
| 216 | break; |
| 217 | } |
| 218 | } |
| 219 | } |
| 220 | |
| 221 | private: |
| 222 | auto &get_socket() { |
no test coverage detected