7#include "job/skeletonmessagejob.h"
8#include "settings/messagecomposersettings.h"
10#include "job/jobbase_p.h"
11#include "part/globalpart.h"
12#include "part/infopart.h"
17#include "messagecomposer_debug.h"
19#include <KEmailAddress>
20#include <KMime/Message>
24class MessageComposer::SkeletonMessageJobPrivate :
public JobBasePrivate
27 SkeletonMessageJobPrivate(SkeletonMessageJob *qq)
34 InfoPart *infoPart =
nullptr;
35 GlobalPart *globalPart =
nullptr;
36 KMime::Message *message =
nullptr;
38 Q_DECLARE_PUBLIC(SkeletonMessageJob)
41void SkeletonMessageJobPrivate::doStart()
43 Q_Q(SkeletonMessageJob);
46 Q_ASSERT(message ==
nullptr);
47 message =
new KMime::Message;
51 auto from =
new KMime::Headers::From;
55 message->setHeader(from);
60 auto to =
new KMime::Headers::To;
62 const QStringList lstTo = infoPart->to();
63 for (
const QString &a : lstTo) {
72 message->setHeader(to);
76 if (!infoPart->replyTo().isEmpty()) {
77 auto replyTo =
new KMime::Headers::ReplyTo;
78 const QStringList lstReplyTo = infoPart->replyTo();
80 for (
const QString &a : lstReplyTo) {
89 message->setHeader(replyTo);
94 auto cc =
new KMime::Headers::Cc;
96 const QStringList lstCc = infoPart->cc();
97 for (
const QString &a : lstCc) {
106 message->setHeader(cc);
111 auto bcc =
new KMime::Headers::Bcc;
113 const QStringList lstBcc = infoPart->bcc();
114 for (
const QString &a : lstBcc) {
123 message->setHeader(bcc);
128 auto subject =
new KMime::Headers::Subject;
129 subject->fromUnicodeString(infoPart->subject());
131 message->setHeader(subject);
136 auto date =
new KMime::Headers::Date;
138 message->setHeader(date);
142 if (!infoPart->fcc().isEmpty()) {
143 auto header =
new KMime::Headers::Generic(
"X-KMail-Fcc");
144 header->fromUnicodeString(infoPart->fcc());
145 message->setHeader(header);
149 if (infoPart->transportId() > -1) {
150 auto header =
new KMime::Headers::Generic(
"X-KMail-Transport");
152 message->setHeader(header);
157 auto messageId =
new KMime::Headers::MessageID();
159 if (MessageComposer::MessageComposerSettings::self()->useCustomMessageIdSuffix()) {
160 fqdn =
QUrl::toAce(MessageComposer::MessageComposerSettings::self()->customMsgIDSuffix());
166 qCWarning(MESSAGECOMPOSER_LOG) <<
"Unable to generate a Message-ID, falling back to 'localhost.localdomain'.";
167 fqdn =
"local.domain";
169 messageId->generate(fqdn);
170 message->setHeader(messageId);
175 for (KMime::Headers::Base *extra : extraHeaders) {
176 const QByteArray headerType(extra->type());
177 auto copyHeader = KMime::Headers::createHeader(headerType);
179 copyHeader =
new KMime::Headers::Generic(headerType.constData(), headerType.size());
181 copyHeader->from7BitString(extra->as7BitString(
false));
182 message->setHeader(copyHeader);
187 if (globalPart->requestDeleveryConfirmation()) {
189 const QString addr = infoPart->replyTo().isEmpty() ? infoPart->from() : infoPart->replyTo().at(0);
190 auto requestDeleveryConfirmation =
new KMime::Headers::Generic(
"Return-Receipt-To");
191 requestDeleveryConfirmation->fromUnicodeString(addr);
192 message->setHeader(requestDeleveryConfirmation);
198 if (globalPart->MDNRequested()) {
200 const QString addr = infoPart->replyTo().
isEmpty() ? infoPart->from() : infoPart->replyTo().at(0);
201 auto mdn =
new KMime::Headers::Generic(
"Disposition-Notification-To");
202 mdn->fromUnicodeString(addr);
203 message->setHeader(mdn);
208 if (infoPart->urgent()) {
209 auto urg1 =
new KMime::Headers::Generic(
"X-PRIORITY");
210 urg1->fromUnicodeString(QStringLiteral(
"2 (High)"));
211 auto urg2 =
new KMime::Headers::Generic(
"Priority");
212 urg2->fromUnicodeString(QStringLiteral(
"urgent"));
213 message->setHeader(urg1);
214 message->setHeader(urg2);
218 if (!infoPart->inReplyTo().isEmpty()) {
219 auto header =
new KMime::Headers::InReplyTo;
220 header->fromUnicodeString(infoPart->inReplyTo());
221 message->setHeader(header);
225 if (!infoPart->references().isEmpty()) {
226 auto header =
new KMime::Headers::References;
227 header->fromUnicodeString(infoPart->references());
228 message->setHeader(header);
234SkeletonMessageJob::SkeletonMessageJob(
InfoPart *infoPart,
GlobalPart *globalPart, QObject *parent)
235 :
JobBase(*new SkeletonMessageJobPrivate(this), parent)
238 d->infoPart = infoPart;
239 d->globalPart = globalPart;
242SkeletonMessageJob::~SkeletonMessageJob() =
default;
244InfoPart *SkeletonMessageJob::infoPart()
const
246 Q_D(
const SkeletonMessageJob);
250void SkeletonMessageJob::setInfoPart(
InfoPart *part)
252 Q_D(SkeletonMessageJob);
256GlobalPart *SkeletonMessageJob::globalPart()
const
258 Q_D(
const SkeletonMessageJob);
259 return d->globalPart;
262void SkeletonMessageJob::setGlobalPart(
GlobalPart *part)
264 Q_D(SkeletonMessageJob);
265 d->globalPart = part;
268KMime::Message *SkeletonMessageJob::message()
const
270 Q_D(
const SkeletonMessageJob);
274void SkeletonMessageJob::start()
276 Q_D(SkeletonMessageJob);
280#include "moc_skeletonmessagejob.cpp"
The InfoPart class contains the message header.
A dummy abstract class defining some errors pertaining to the Composer.
A message containing only the headers...
KCODECS_EXPORT QString normalizeAddressesAndEncodeIdn(const QString &str)
PostalAddress address(const QVariant &location)
Simple interface that both EncryptJob and SignEncryptJob implement so the composer can extract some e...
QByteArray & append(QByteArrayView data)
bool isEmpty() const const
QDateTime currentDateTime()
QString fromLatin1(QByteArrayView str)
bool isEmpty() const const
QString number(double n, char format, int precision)
QByteArray toAce(const QString &domain, AceProcessingOptions options)