7#include <botan/email.h>
9#include <botan/internal/charset.h>
10#include <botan/internal/fmt.h>
16std::optional<std::pair<std::string, DNSName>> parse_email_address(std::string_view addr) {
29 const auto at = addr.find(
'@');
32 if(at == std::string_view::npos || addr.find(
'@', at + 1) != std::string_view::npos) {
37 const std::string_view local = addr.substr(0, at);
38 const std::string_view domain = addr.substr(at + 1);
40 if(local.empty() || domain.empty()) {
51 if(local.starts_with(
'.') || local.ends_with(
'.') || local.find(
"..") != std::string_view::npos) {
56 for(
const char c : local) {
58 if(!is_atext_or_dot(c) &&
static_cast<uint8_t
>(c) < 0x80) {
64 if(!parsed_domain.has_value()) {
68 return std::make_pair(std::string(local), parsed_domain.value());
74 return fmt(
"{}@{}", m_local_part, m_domain.to_string());
79 auto parsed = parse_email_address(addr);
83 for(
const char c : parsed->first) {
84 if(
static_cast<uint8_t
>(c) >= 0x80) {
88 return EmailAddress(std::move(parsed->first), std::move(parsed->second));
95 return fmt(
"{}@{}", m_local_part, m_domain.to_string());
100 auto parsed = parse_email_address(addr);
112 return SmtpUtf8Mailbox(std::move(parsed->first), std::move(parsed->second));
static constexpr CharacterValidityTable alpha_numeric_plus(std::string_view extras)
static std::optional< DNSName > from_string(std::string_view name)
std::string to_string() const
static std::optional< EmailAddress > from_string(std::string_view addr)
static std::optional< SmtpUtf8Mailbox > from_string(std::string_view addr)
std::string to_string() const
std::string fmt(std::string_view format, const T &... args)
bool is_valid_utf8(std::string_view utf8)