diff options
Diffstat (limited to 'src/m_email/EMAilHelper.cpp')
-rw-r--r-- | src/m_email/EMAilHelper.cpp | 170 |
1 files changed, 165 insertions, 5 deletions
diff --git a/src/m_email/EMAilHelper.cpp b/src/m_email/EMAilHelper.cpp index 7d19dad..ff9c0b7 100644 --- a/src/m_email/EMAilHelper.cpp +++ b/src/m_email/EMAilHelper.cpp @@ -64,7 +64,7 @@ auto ExtractFieldValue(const vmime::shared_ptr<vmime::header>& header, auto field_value = field->getValue(); if (!field_value) { - FLOG_WARN("cannot get '%s' Field Value from header", field_name); + FLOG_WARN("cannot get '%1' Field Value from header", field_name); return {}; } @@ -81,7 +81,7 @@ auto ExtractFieldValueMailBox(const vmime::shared_ptr<vmime::header>& header, auto field_value = field->getValue<vmime::mailbox>(); if (!field_value) { - FLOG_WARN("cannot get '%s' Field Value from header", field_name); + FLOG_WARN("cannot get '%1' Field Value from header", field_name); return {}; } @@ -99,7 +99,7 @@ auto ExtractFieldValueAddressList( auto field_value = field->getValue<vmime::addressList>(); if (!field_value) { - FLOG_WARN("cannot get '%s' Field Value from header", field_name); + FLOG_WARN("cannot get '%1' Field Value from header", field_name); return {}; } @@ -114,6 +114,8 @@ auto ExtractFieldValueAddressList( auto ExtractFieldValueText(const vmime::shared_ptr<vmime::header>& header, const QString& field_name) -> QString { + if (!header->hasField(field_name.toStdString())) return {}; + auto field = header->getField(field_name.toStdString()); if (!field) { FLOG_WARN("cannot get '%1' Field from header", field_name); @@ -122,7 +124,7 @@ auto ExtractFieldValueText(const vmime::shared_ptr<vmime::header>& header, auto field_value = field->getValue<vmime::text>(); if (!field_value) { - FLOG_WARN("cannot get '%s' Field Value from header", field_name); + FLOG_WARN("cannot get '%1' Field Value from header", field_name); return {}; } @@ -139,7 +141,7 @@ auto ExtractFieldValueDateTime(const vmime::shared_ptr<vmime::header>& header, auto field_value = field->getValue<vmime::datetime>(); if (!field_value) { - FLOG_WARN("cannot get '%s' Field Value from header", field_name); + FLOG_WARN("cannot get '%1' Field Value from header", field_name); return {}; } @@ -167,4 +169,162 @@ auto ParseEmailString(const QString& input, QString& name, } return false; +} + +auto EncodeBase64WithLineBreaks(const QByteArray& data, + int line_length) -> QString { + // Get the Base64 encoded data + QByteArray base64_data = data.toBase64(); + + // Split the base64 data into lines of the given line length + QStringList lines; + for (int i = 0; i < base64_data.size(); i += line_length) { + lines.append(base64_data.mid(i, line_length)); + } + + // Join lines with CRLF + return lines.join("\r\n"); +} + +auto CheckIfEMLMessage(const QByteArray& data, + vmime::shared_ptr<vmime::message>& message) -> bool { + vmime::string vmime_data(data.constData(), data.size()); + + message = vmime::make_shared<vmime::message>(); + try { + message->parse(vmime_data); + return message->getParsedLength() != 0 && !message->getHeader()->isEmpty(); + } catch (const vmime::exception& e) { + FLOG_DEBUG("error occurred when parsing vmime data: %1", e.what()); + return false; + } +} + +auto BuildPlainTextEML(const EMailMetaData& meta_data, + const QByteArray& body_data, QString& eml_data) -> int { + auto from = meta_data.from; + auto recipient_list = meta_data.to; + auto cc_list = meta_data.cc; + auto bcc_list = meta_data.bcc; + auto subject = meta_data.subject; + + QString name; + QString email; + + try { + vmime::messageBuilder plaintext_msg_builder; + + if (ParseEmailString(from, name, email)) { + plaintext_msg_builder.setExpeditor( + vmime::mailbox(vmime::text(name.toStdString()), email.toStdString())); + } else { + plaintext_msg_builder.setExpeditor(vmime::mailbox(from.toStdString())); + } + + for (const QString& recipient : recipient_list) { + auto trimmed_recipient = recipient.trimmed(); + if (ParseEmailString(trimmed_recipient, name, email)) { + plaintext_msg_builder.getRecipients().appendAddress( + vmime::make_shared<vmime::mailbox>(vmime::text(name.toStdString()), + email.toStdString())); + } else { + plaintext_msg_builder.getRecipients().appendAddress( + vmime::make_shared<vmime::mailbox>( + trimmed_recipient.toStdString())); + } + } + + for (const QString& recipient : cc_list) { + auto trimmed_recipient = recipient.trimmed(); + if (ParseEmailString(trimmed_recipient, name, email)) { + plaintext_msg_builder.getCopyRecipients().appendAddress( + vmime::make_shared<vmime::mailbox>(vmime::text(name.toStdString()), + email.toStdString())); + } else { + plaintext_msg_builder.getCopyRecipients().appendAddress( + vmime::make_shared<vmime::mailbox>( + trimmed_recipient.toStdString())); + } + } + + for (const QString& recipient : bcc_list) { + auto trimmed_recipient = recipient.trimmed(); + if (ParseEmailString(trimmed_recipient, name, email)) { + plaintext_msg_builder.getBlindCopyRecipients().appendAddress( + vmime::make_shared<vmime::mailbox>(vmime::text(name.toStdString()), + email.toStdString())); + } else { + plaintext_msg_builder.getBlindCopyRecipients().appendAddress( + vmime::make_shared<vmime::mailbox>( + trimmed_recipient.toStdString())); + } + } + + plaintext_msg_builder.setSubject(vmime::text(subject.toStdString())); + + vmime::shared_ptr<vmime::message> plaintext_msg = + plaintext_msg_builder.construct(); + + auto plaintext_msg_header = plaintext_msg->getHeader(); + + auto plaintext_msg_content_type_header_field = + plaintext_msg_header->getField<vmime::contentTypeField>( + vmime::fields::CONTENT_TYPE); + plaintext_msg_content_type_header_field->setValue("text/plain"); + plaintext_msg_content_type_header_field->appendParameter( + vmime::make_shared<vmime::parameter>("charset", "UTF-8")); + plaintext_msg_content_type_header_field->appendParameter( + vmime::make_shared<vmime::parameter>("format", "flowed")); + + auto plaintext_msg_content_trans_encode_field = + plaintext_msg_header->getField( + vmime::fields::CONTENT_TRANSFER_ENCODING); + plaintext_msg_content_trans_encode_field->setValue("base64"); + + auto plaintext_msg_body = plaintext_msg->getBody(); + + auto mime_part_body_content = + vmime::make_shared<vmime::stringContentHandler>(); + mime_part_body_content->setData(body_data.toStdString()); + plaintext_msg_body->setContents(mime_part_body_content); + + eml_data = + Q_SC(plaintext_msg->generate(vmime::lineLengthLimits::convenient)); + return 0; + + } catch (const vmime::exception& e) { + eml_data = QString("VMIME Error: %1").arg(e.what()); + return -1; + } +} + +auto GetMetaData(QByteArray& data, EMailMetaData& meta_data) {} + +auto GetEMLMetaData(vmime::shared_ptr<vmime::message>& message, + EMailMetaData& meta_data) -> int { + auto header = message->getHeader(); + + auto from_field_value_text = + ExtractFieldValueMailBox(header, vmime::fields::FROM); + auto to_field_value_text = + ExtractFieldValueAddressList(header, vmime::fields::TO); + auto cc_field_value_text = + ExtractFieldValueAddressList(header, vmime::fields::CC); + auto bcc_field_value_text = + ExtractFieldValueAddressList(header, vmime::fields::BCC); + auto date_field_value = + ExtractFieldValueDateTime(header, vmime::fields::DATE); + auto subject_field_value_text = + ExtractFieldValueText(header, vmime::fields::SUBJECT); + auto reply_to_field_value_text = + ExtractFieldValueMailBox(header, vmime::fields::REPLY_TO); + auto organization_text = + ExtractFieldValueText(header, vmime::fields::ORGANIZATION); + + meta_data.from = from_field_value_text; + meta_data.to = to_field_value_text.split(','); + meta_data.cc = cc_field_value_text.split(','); + meta_data.bcc = bcc_field_value_text.split(','); + meta_data.subject = subject_field_value_text; + return 0; }
\ No newline at end of file |