Использование vmime для изменения электронной почты - без сохранения частей на диск - PullRequest
0 голосов
/ 12 сентября 2018

Товарищи из Stackoverflow, надеюсь, вы все в хорошем настроении, чтобы не понижать мой вопрос :) 1001 *

Отказ от ответственности: я задавал тот же вопрос на форумах vmime, но не получил ответа, поэтому отправляю сюда еще раз.

Постановка задачи :

Я использую vmime, чтобы попытаться проанализировать вложенные документы и электронные письма, чтобы внести некоторые изменения в прикрепленные электронные письма. В этом сценарии я хочу иметь возможность изменять электронные письма на лету, возможно, копируя ссылки bodyparts / body в другое сообщение и меняя соответствующие заголовки.

Текущее состояние : Я могу прочитать электронное письмо, разобрать его содержимое и расшифровать, если в нем есть электронное письмо с вложением.

Это фрагмент кода:

###########################################################################
/**
is called recursivels, for all the body parts that have to
be processed
**/
int32_t
ProcessAttachmentPart(std::shared_ptr<vmime::bodyPart> inBodyPart,
                      std::shared_ptr<vmime::bodyPart> outBodyPart,
                      int32_t depth)
{

auto header = inBodyPart->getHeader();
if (header->hasField(vmime::fields::CONTENT_TYPE))
{

    auto field = header->getField(std::string(vmime::fields::CONTENT_TYPE));
    auto partType = field->getValue()->generate();
    if (partType == "message/rfc822" == 0)
    {
        /**
            ---------------> problem here <-----------------
            If this is a sub-message, I have not parsed this message
            when I called Message::parse() somewhere before.
            How to I get a handle to this message now???
        **/

        ApplyBodyTransformation( inBodyPart->getBody(),
                                 outBodyPart->getBody());
    }
    else
    {
        CopyBodyPart(inBodyPart, outBodyPart);
    }
}
else
{
    CopyBodyPart(inBodyPart, outBodyPart);
}
ProcessHeaders(inBodyPart, outBodyPart);
return 0;
}


int32_t
ApplyBodyTransformation(const std::shared_ptr<vmime::body> inBody,
                        std::shared_ptr<vmime::body> outBody)
{
    for (auto part : inBody->getPartList())
    {
        std::shared_ptr<vmime::bodyPart> outBodyPart(new vmime::bodyPart);
        ProcessAttachmentPart(part, outBodyPart,depth);
        outBody->appendPart(outBodyPart);
    }
    return 0;
}

Что я мог сделать - это вызвать функцию inBodyPart-> generate () - прочитать файл в новое сообщение - разобрать и приложить новое сообщение к последнему сообщению.

Что я хочу сделать НЕ писать этот дополнительный файл ..

Я не могу найти ни одного такого API в коде .. Любая помощь будет оценена.

...