Messagelib

messagehelper.cpp
1 /*
2  SPDX-FileCopyrightText: 2009 Klarälvdalens Datakonsult AB, a KDAB Group company, [email protected]
3  SPDX-FileCopyrightText: 2009 Andras Mantia <[email protected]>
4 
5  SPDX-License-Identifier: GPL-2.0-or-later
6 */
7 
8 #include "messagehelper.h"
9 #include "settings/messagecomposersettings.h"
10 
11 #include "MessageCore/MailingList"
12 #include "MessageCore/StringUtil"
13 
14 #include <KIdentityManagement/Identity>
15 #include <KIdentityManagement/IdentityManager>
16 #include <KMime/DateFormatter>
17 #include <KMime/MDN>
18 #include <KMime/Message>
19 
20 using namespace MessageCore;
21 
22 namespace MessageHelper
23 {
25 {
26  applyIdentity(message, identMan, id);
27  message->removeHeader<KMime::Headers::To>();
28  message->removeHeader<KMime::Headers::Subject>();
29  message->date()->setDateTime(QDateTime::currentDateTime());
30 
31  // This will allow to change Content-Type:
32  message->contentType()->setMimeType("text/plain");
33 }
34 
36  const KMime::Message::Ptr &origMsg,
38  uint id,
39  bool idHeaders)
40 {
41  if (idHeaders) {
42  MessageHelper::initHeader(msg, identMan, id);
43  } else {
44  auto header = new KMime::Headers::Generic("X-KMail-Identity");
45  header->fromUnicodeString(QString::number(id), "utf-8");
46  msg->setHeader(header);
47  }
48 
49  if (auto hdr = origMsg->headerByType("X-KMail-Transport")) {
50  const QString transport = hdr->asUnicodeString();
51  auto header = new KMime::Headers::Generic("X-KMail-Transport");
52  header->fromUnicodeString(transport, "utf-8");
53  msg->setHeader(header);
54  }
55 }
56 
58 {
59  const KIdentityManagement::Identity &ident = identMan->identityForUoidOrDefault(id);
60 
61  if (ident.fullEmailAddr().isEmpty()) {
62  message->removeHeader<KMime::Headers::From>();
63  } else {
64  message->from()->addAddress(ident.primaryEmailAddress().toUtf8(), ident.fullName());
65  }
66 
67  if (ident.replyToAddr().isEmpty()) {
68  message->removeHeader<KMime::Headers::ReplyTo>();
69  } else {
70  message->replyTo()->addAddress(ident.replyToAddr().toUtf8());
71  }
72 
73  if (ident.bcc().isEmpty()) {
74  message->removeHeader<KMime::Headers::Bcc>();
75  } else {
76  const auto mailboxes = KMime::Types::Mailbox::listFromUnicodeString(ident.bcc());
77  for (const KMime::Types::Mailbox &mailbox : mailboxes) {
78  message->bcc()->addAddress(mailbox);
79  }
80  }
81 
82  if (ident.cc().isEmpty()) {
83  message->removeHeader<KMime::Headers::Cc>();
84  } else {
85  const auto mailboxes = KMime::Types::Mailbox::listFromUnicodeString(ident.cc());
86  for (const KMime::Types::Mailbox &mailbox : mailboxes) {
87  message->cc()->addAddress(mailbox);
88  }
89  }
90 
91  if (ident.organization().isEmpty()) {
92  message->removeHeader<KMime::Headers::Organization>();
93  } else {
94  auto const organization = new KMime::Headers::Organization;
95  organization->fromUnicodeString(ident.organization(), "utf-8");
96  message->setHeader(organization);
97  }
98 
99  if (ident.isDefault()) {
100  message->removeHeader("X-KMail-Identity");
101  } else {
102  auto header = new KMime::Headers::Generic("X-KMail-Identity");
103  header->fromUnicodeString(QString::number(ident.uoid()), "utf-8");
104  message->setHeader(header);
105  }
106 
107  if (ident.transport().isEmpty()) {
108  message->removeHeader("X-KMail-Transport");
109  } else {
110  auto header = new KMime::Headers::Generic("X-KMail-Transport");
111  header->fromUnicodeString(ident.transport(), "utf-8");
112  message->setHeader(header);
113  }
114 
115  if (ident.fcc().isEmpty()) {
116  message->removeHeader("X-KMail-Fcc");
117  } else {
118  auto header = new KMime::Headers::Generic("X-KMail-Fcc");
119  header->fromUnicodeString(ident.fcc(), "utf-8");
120  message->setHeader(header);
121  }
122 
123  if (ident.disabledFcc()) {
124  auto header = new KMime::Headers::Generic("X-KMail-FccDisabled");
125  header->fromUnicodeString(QStringLiteral("true"), "utf-8");
126  message->setHeader(header);
127  } else {
128  message->removeHeader("X-KMail-FccDisabled");
129  }
130 }
131 
132 KMime::Types::AddrSpecList extractAddrSpecs(const KMime::Message::Ptr &msg, const QByteArray &header)
133 {
134  KMime::Types::AddrSpecList result;
135  if (auto hrd = msg->headerByType(header.constData())) {
136  // Don't use "asUnicodeString().toUtf8()" it removes \" from \"foo, bla\" <[email protected]> => send failed
137  // Bug 439218
140  for (KMime::Types::AddressList::const_iterator ait = al.constBegin(); ait != alend; ++ait) {
141  KMime::Types::MailboxList::const_iterator mitEnd((*ait).mailboxList.constEnd());
142  for (KMime::Types::MailboxList::const_iterator mit = (*ait).mailboxList.constBegin(); mit != mitEnd; ++mit) {
143  result.push_back((*mit).addrSpec());
144  }
145  }
146  }
147  return result;
148 }
149 
150 void setAutomaticFields(const KMime::Message::Ptr &msg, bool aIsMulti)
151 {
152  auto header = msg->header<KMime::Headers::MIMEVersion>(true);
153  header->from7BitString("1.0");
154 
155  if (aIsMulti || msg->contents().size() > 1) {
156  // Set the type to 'Multipart' and the subtype to 'Mixed'
157  msg->contentType(false)->setMimeType("multipart/mixed");
158  // Create a random printable string and set it as the boundary parameter
159  msg->contentType(false)->setBoundary(KMime::multiPartBoundary());
160  }
161 }
162 }
QString number(int n, int base)
QDateTime currentDateTime()
typedef const_iterator
QVector::const_iterator constEnd() const const
AddressList splitAddressField(const QByteArray &text)
Splits the given address list text into separate addresses.
Definition: stringutil.cpp:283
const Identity & identityForUoidOrDefault(uint uoid) const
void initHeader(const KMime::Message::Ptr &message, const KIdentityManagement::IdentityManager *identMan, uint id)
Initialize header fields.
bool isEmpty() const const
QByteArray toUtf8() const const
void applyIdentity(const KMime::Message::Ptr &message, const KIdentityManagement::IdentityManager *identMan, uint id)
Set the from, to, cc, bcc, encryption etc headers as specified in the given identity.
void initFromMessage(const KMime::Message::Ptr &msg, const KMime::Message::Ptr &origMsg, KIdentityManagement::IdentityManager *identMan, uint id, bool idHeaders)
Initialize headers fields according to the identity and the transport header of the given original me...
void setAutomaticFields(const KMime::Message::Ptr &msg, bool aIsMulti)
Set fields that are either automatically set (Message-id) or that do not change from one message to a...
const char * constData() const const
Contains random helper methods when dealing with messages.
static QVector< Mailbox > listFromUnicodeString(const QString &s)
void fromUnicodeString(const QString &s, const QByteArray &b) override
QVector::const_iterator constBegin() const const
QString primaryEmailAddress() const
QString message
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Mar 27 2023 04:08:17 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.