ContentType * Bodypart::contentType() const { ContentType * ct = header()->contentType(); if ( ct ) return ct; if ( !parent() ) return 0; ct = parent()->header()->contentType(); if ( ct ) { if ( ct->type() == "multipart" ) { ct = 0; } else if ( ct->type() == "message" && ct->subtype() == "rfc822" ) { Bodypart * bp = parent()->children()->firstElement(); ct = bp->header()->contentType(); } } return ct; }
void Multipart::appendMultipart( EString &r, bool avoidUtf8 ) const { ContentType * ct = header()->contentType(); EString delim = ct->parameter( "boundary" ); if ( ! this ) ::log( "Fetch::bodyStructure - FATAL, cannnot determine message", Log::Error ); else { if ( this->parent() && this->parent()->isMessage() ) { Message *msg = (Message *)this->parent(); if ( msg->hasPGPsignedPart() ) { appendAnyPart( r, children()->first(), ct, avoidUtf8 ); return; } } else if ( this->isMessage() ) { Message *msg = (Message *)this; if ( msg->hasPGPsignedPart() ) { appendAnyPart( r, children()->first(), ct, avoidUtf8 ); return; } } } List<Bodypart>::Iterator it( children() ); r.append( "--" + delim ); while ( it ) { r.append( crlf ); Bodypart * bp = it; ++it; r.append( bp->header()->asText( avoidUtf8 ) ); r.append( crlf ); appendAnyPart( r, bp, ct, avoidUtf8 ); r.append( crlf ); r.append( "--" ); r.append( delim ); } r.append( "--" ); r.append( crlf ); }
Injectee * DSN::result() const { Injectee * r = new Injectee; Bodypart * plainText = new Bodypart( 1, r ); Bodypart * dsn = new Bodypart( 2, r ); Bodypart * original = new Bodypart( 3, r ); plainText->setParent( r ); dsn->setParent( r ); original->setParent( r ); r->children()->append( plainText ); r->children()->append( dsn ); r->children()->append( original ); // set up the original message, either full or header-only if ( fullReport() ) { original->header()->add( "Content-Type", "text/rfc822-headers" ); original->setData( message()->header()->asText() ); // this is what we _should_ do, except that we don't. the body // of the message is lost, probably because original-> has a // null parent. //original->header()->add( "Content-Type", "message/rfc822" ); //original->setMessage( message() ); // and maybe we shouldn't anyway. sending a potentially big // body in a bounce is not necessarily a good idea. } else { // nasty mime name there original->header()->add( "Content-Type", "text/rfc822-headers" ); original->setData( message()->header()->asText() ); } // the from field has to contain... what? let's try this for now. Address * from = new Address( Configuration::hostname(), "postmaster", Configuration::hostname() ); // set up the top-level header Header * h = r->header(); if ( resultDate() ) { h->add( "Date", resultDate()->rfc822() ); } else { Date * now = new Date; now->setCurrentTime(); h->add( "Date", now->rfc822() ); } h->add( "From", from->toString() ); if ( sender() ) h->add( "To", sender()->toString() ); if ( allOk() ) h->add( "Subject", "Message delivered" ); else if ( allFailed() ) h->add( "Subject", "Message delivery failed" ); else h->add( "Subject", "Message delivery reports" ); h->add( "Mime-Version", "1.0" ); h->add( "Content-Type", "multipart/report; boundary=" + Message::acceptableBoundary( message()->rfc822() ) ); // set up the plaintext and DSN parts // what charset should we use for plainText? plainText->header()->add( "Content-Type", "text/plain; format=flowed" ); dsn->header()->add( "Content-Type", "message/delivery-status" ); plainText->setData( plainBody() ); dsn->setData( dsnBody() ); r->addMessageId(); return r; }