void DKIMSigner::Sign(boost::shared_ptr<Message> message) { AnsiString senderAddress = message->GetFromAddress(); AnsiString senderDomain = StringParser::ExtractDomain(senderAddress); // Check if signing is enabled for this domain. boost::shared_ptr<const Domain> pDomain = CacheContainer::Instance()->GetDomain(senderDomain); if (!pDomain || !pDomain->GetDKIMEnabled()) return; LOG_DEBUG("Signing message using DKIM..."); AnsiString selector = pDomain->GetDKIMSelector(); AnsiString domain = pDomain->GetName(); AnsiString privateKeyFile = pDomain->GetDKIMPrivateKeyFile(); if (selector.IsEmpty() || privateKeyFile.IsEmpty()) { ErrorManager::Instance()->ReportError(ErrorManager::Medium, 5305, "DKIMSigner::Sign", "Either the selector or private key file was not specified."); return; } Canonicalization::CanonicalizeMethod headerMethod = (Canonicalization::CanonicalizeMethod) pDomain->GetDKIMHeaderCanonicalizationMethod(); Canonicalization::CanonicalizeMethod bodyMethod = (Canonicalization::CanonicalizeMethod) pDomain->GetDKIMBodyCanonicalizationMethod(); HashCreator::HashType algorithm = (HashCreator::HashType) pDomain->GetDKIMSigningAlgorithm(); DKIM dkim; if (!dkim.Sign(message, domain, selector, privateKeyFile, algorithm, headerMethod, bodyMethod)) { ErrorManager::Instance()->ReportError(ErrorManager::Medium, 5306, "DKIMSigner::Sign", "Message signing using DKIM failed."); } }