void receivedMDNInfos::extract() { const ref <const body> bdy = m_msg->getBody(); for (int i = 0 ; i < bdy->getPartCount() ; ++i) { const ref <const bodyPart> part = bdy->getPartAt(i); if (!part->getHeader()->hasField(fields::CONTENT_TYPE)) continue; const mediaType& type = *part->getHeader()->ContentType()-> getValue().dynamicCast <const mediaType>(); // Extract from second part (message/disposition-notification) if (type.getType() == vmime::mediaTypes::MESSAGE && type.getSubType() == vmime::mediaTypes::MESSAGE_DISPOSITION_NOTIFICATION) { std::ostringstream oss; utility::outputStreamAdapter vos(oss); part->getBody()->getContents()->extract(vos); // Body actually contains fields header fields; fields.parse(oss.str()); try { m_omid = *fields.OriginalMessageId()->getValue().dynamicCast <const messageId>(); } catch (exceptions::no_such_field&) { /* Ignore */ } try { m_disp = *fields.Disposition()->getValue().dynamicCast <const disposition>(); } catch (exceptions::no_such_field&) { /* Ignore */ } } } }
void parameter::setValue(const component& value) { std::ostringstream oss; utility::outputStreamAdapter vos(oss); value.generate(vos); setValue(word(oss.str(), vmime::charsets::US_ASCII)); }
ref <bodyPart> MDNHelper::createThirdMDNPart(const sendableMDNInfos& mdnInfos) { ref <bodyPart> part = vmime::create <bodyPart>(); // Header ref <header> hdr = part->getHeader(); hdr->ContentDisposition()->setValue(vmime::contentDispositionTypes::INLINE); hdr->ContentType()->setValue(mediaType(vmime::mediaTypes::TEXT, vmime::mediaTypes::TEXT_RFC822_HEADERS)); // Body: original message headers std::ostringstream oss; utility::outputStreamAdapter vos(oss); mdnInfos.getMessage()->getHeader()->generate(vos); part->getBody()->setContents(vmime::create <stringContentHandler>(oss.str())); return (part); }
ref <bodyPart> MDNHelper::createSecondMDNPart(const sendableMDNInfos& mdnInfos, const disposition& dispo, const string& reportingUA, const std::vector <string>& reportingUAProducts) { ref <bodyPart> part = vmime::create <bodyPart>(); // Header ref <header> hdr = part->getHeader(); hdr->ContentDisposition()->setValue(vmime::contentDispositionTypes::INLINE); hdr->ContentType()->setValue(mediaType(vmime::mediaTypes::MESSAGE, vmime::mediaTypes::MESSAGE_DISPOSITION_NOTIFICATION)); // Body // // The body of a message/disposition-notification consists of one or // more "fields" formatted according to the ABNF of [RFC-MSGFMT] header // "fields". The syntax of the message/disposition-notification content // is as follows: // // disposition-notification-content = [ reporting-ua-field CRLF ] // [ mdn-gateway-field CRLF ] // [ original-recipient-field CRLF ] // final-recipient-field CRLF // [ original-message-id-field CRLF ] // disposition-field CRLF // *( failure-field CRLF ) // *( error-field CRLF ) // *( warning-field CRLF ) // *( extension-field CRLF ) // header fields; // -- Reporting-UA (optional) if (!reportingUA.empty()) { string ruaText; ruaText = reportingUA; for (unsigned int i = 0 ; i < reportingUAProducts.size() ; ++i) { if (i == 0) ruaText += "; "; else ruaText += ", "; ruaText += reportingUAProducts[i]; } ref <headerField> rua = headerFieldFactory::getInstance()-> create(vmime::fields::REPORTING_UA); rua->setValue(ruaText); fields.appendField(rua); } // -- Final-Recipient ref <headerField> fr = headerFieldFactory::getInstance()-> create(vmime::fields::FINAL_RECIPIENT); fr->setValue("rfc822; " + mdnInfos.getRecipient().getEmail()); // -- Original-Message-ID if (mdnInfos.getMessage()->getHeader()->hasField(vmime::fields::MESSAGE_ID)) { fields.OriginalMessageId()->setValueConst (mdnInfos.getMessage()->getHeader()->MessageId()->getValue()); } // -- Disposition fields.Disposition()->setValue(dispo); std::ostringstream oss; utility::outputStreamAdapter vos(oss); fields.generate(vos); part->getBody()->setContents(vmime::create <stringContentHandler>(oss.str())); return (part); }