18 #include "viewemail_p.h"
20 #include <Cutelyst/application.h>
21 #include <Cutelyst/context.h>
22 #include <Cutelyst/response.h>
24 #include <QtCore/QLoggingCategory>
26 #include <SimpleMail/mimemessage.h>
27 #include <SimpleMail/emailaddress.h>
28 #include <SimpleMail/mimetext.h>
29 #include <SimpleMail/serverreply.h>
31 Q_LOGGING_CATEGORY(CUTELYST_VIEW_EMAIL,
"cutelyst.view.email", QtWarningMsg)
34 using namespace SimpleMail;
41 QString ViewEmail::stashKey()
const
50 d->stashKey = stashKey;
54 QByteArray ViewEmail::defaultContentType()
const
57 return d->defaultContentType;
63 d->defaultContentType = contentType;
67 QByteArray ViewEmail::defaultCharset()
const
70 return d->defaultCharset;
76 d->defaultCharset = charset;
80 QByteArray ViewEmail::defaultEncoding()
const
83 return d->defaultEncoding;
89 d->defaultEncoding = encoding;
96 return d->sender->host();
102 d->sender->setHost(host);
104 d->server->setHost(host);
111 return d->sender->port();
117 d->sender->setPort(quint16(port));
119 d->server->setPort(quint16(port));
132 d->sender->setConnectionType(
static_cast<Sender::ConnectionType
>(ct));
134 d->server->setConnectionType(
static_cast<Server::ConnectionType
>(ct));
147 d->sender->setAuthMethod(
static_cast<Sender::AuthMethod
>(method));
149 d->server->setAuthMethod(
static_cast<Server::AuthMethod
>(method));
156 return d->sender->user();
162 d->sender->setUser(user);
164 d->server->setUsername(user);
171 return d->sender->password();
177 d->sender->setPassword(password);
179 d->server->setPassword(password);
183 bool ViewEmail::async()
const
194 d->server =
new Server(
this);
195 d->server->setHost(d->sender->host());
196 d->server->setPort(d->sender->port());
197 d->server->setUsername(d->sender->user());
198 d->server->setPassword(d->sender->password());
199 d->server->setAuthMethod(
static_cast<Server::AuthMethod
>(d->sender->authMethod()));
200 d->server->setConnectionType(
static_cast<Server::ConnectionType
>(d->sender->connectionType()));
212 QVariantHash email = c->
stash(d->stashKey).toHash();
213 if (email.isEmpty()) {
214 c->
error(QStringLiteral(
"Cannot render template, template name or template stash key not defined"));
221 value = email.value(QStringLiteral(
"to"));
222 if (value.type() == QVariant::String && !value.toString().isEmpty()) {
223 message.addTo(value.toString());
224 }
else if (value.type() == QVariant::StringList) {
225 const auto rcpts = value.toStringList();
226 for (
const QString &rcpt : rcpts) {
231 value = email.value(QStringLiteral(
"cc"));
232 if (value.type() == QVariant::String && !value.toString().isEmpty()) {
233 message.addCc(value.toString());
234 }
else if (value.type() == QVariant::StringList) {
235 const auto rcpts = value.toStringList();
236 for (
const QString &rcpt : rcpts) {
241 value = email.value(QStringLiteral(
"bcc"));
242 if (value.type() == QVariant::String && !value.toString().isEmpty()) {
243 message.addBcc(value.toString());
244 }
else if (value.type() == QVariant::StringList) {
245 const auto rcpts = value.toStringList();
246 for (
const QString &rcpt : rcpts) {
247 message.addBcc(rcpt);
251 message.setSender(email.value(QStringLiteral(
"from")).toString());
252 message.setSubject(email.value(QStringLiteral(
"subject")).toString());
254 QVariant body = email.value(QStringLiteral(
"body"));
255 QVariant parts = email.value(QStringLiteral(
"parts"));
256 if (body.isNull() && parts.isNull()) {
257 c->
error(QStringLiteral(
"Can't send email without parts or body, check stash"));
261 if (!parts.isNull()) {
262 const QVariantList partsVariant = parts.toList();
263 for (
const QVariant &part : partsVariant) {
264 auto mime = part.value<MimePart*>();
266 message.addPart(mime);
268 qCCritical(CUTELYST_VIEW_EMAIL) <<
"Failed to cast MimePart";
272 auto contentTypeIt = email.constFind(QStringLiteral(
"content_type"));
273 if (contentTypeIt != email.constEnd()
274 && !contentTypeIt.value().isNull()
275 && !contentTypeIt.value().toString().isEmpty()) {
276 const QByteArray contentType = contentTypeIt.value().toString().toLatin1();
277 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using specified content_type" << contentType;
278 message.getContent().setContentType(contentType);
279 }
else if (!d->defaultContentType.isEmpty()) {
280 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using default content_type" << d->defaultContentType;
281 message.getContent().setContentType(d->defaultContentType);
284 auto part =
new MimeText(body.toString());
285 d->setupAttributes(part, email);
286 message.setContent(part);
290 ServerReply *reply = d->server->sendMail(message);
291 connect(reply, &ServerReply::finished, reply, &ServerReply::deleteLater);
292 }
else if (!d->sender->sendMail(message)) {
293 c->
error(QString::fromLatin1(d->sender->responseText()));
305 void ViewEmail::initSender()
308 d->sender =
new Sender(
this);
311 const auto app = qobject_cast<Application *>(parent());
313 config = app->config(QStringLiteral(
"VIEW_EMAIL")).toHash();
316 d->stashKey = config.value(QStringLiteral(
"stash_key"), QStringLiteral(
"email")).toString();
318 if (!config.value(QStringLiteral(
"sender_host")).isNull()) {
319 d->sender->setHost(config.value(QStringLiteral(
"sender_host")).toString());
321 if (!config.value(QStringLiteral(
"sender_port")).isNull()) {
322 d->sender->setPort(quint16(config.value(QStringLiteral(
"sender_port")).toInt()));
324 if (!config.value(QStringLiteral(
"sender_username")).isNull()) {
325 d->sender->setUser(config.value(QStringLiteral(
"sender_username")).toString());
327 if (!config.value(QStringLiteral(
"sender_password")).isNull()) {
328 d->sender->setPassword(config.value(QStringLiteral(
"sender_password")).toString());
333 void ViewEmailPrivate::setupAttributes(MimePart *part,
const QVariantHash &attrs)
const
335 auto contentTypeIt = attrs.constFind(QStringLiteral(
"content_type"));
336 if (contentTypeIt != attrs.constEnd()
337 && !contentTypeIt.value().isNull()
338 && !contentTypeIt.value().toString().isEmpty()) {
339 const QByteArray contentType = contentTypeIt.value().toString().toLatin1();
340 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using specified content_type" << contentType;
341 part->setContentType(contentType);
342 }
else if (!defaultContentType.isEmpty()) {
343 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using default content_type" << defaultContentType;
344 part->setContentType(defaultContentType);
347 auto charsetIt = attrs.constFind(QStringLiteral(
"charset"));
348 if (charsetIt != attrs.constEnd()
349 && !charsetIt.value().isNull()
350 && !charsetIt.value().toString().isEmpty()) {
351 const QByteArray charset = charsetIt.value().toString().toLatin1();
352 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using specified charset" << charset;
353 part->setCharset(charset);
354 }
else if (!defaultCharset.isEmpty()) {
355 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using default charset" << defaultCharset;
356 part->setCharset(defaultCharset);
359 auto encodingIt = attrs.constFind(QStringLiteral(
"encoding"));
360 if (encodingIt != attrs.constEnd()
361 && !encodingIt.value().isNull()
362 && !encodingIt.value().toString().isEmpty()) {
363 const QByteArray encoding = encodingIt.value().toString().toLatin1();
364 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using specified encoding" << encoding;
365 setupEncoding(part, encoding);
366 }
else if (!defaultEncoding.isEmpty()) {
367 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using default charset" << defaultEncoding;
368 setupEncoding(part, defaultEncoding);
372 void ViewEmailPrivate::setupEncoding(MimePart *part,
const QByteArray &encoding)
const
374 if (encoding ==
"7bit") {
375 part->setEncoding(MimePart::_7Bit);
376 }
else if (encoding ==
"8bit") {
377 part->setEncoding(MimePart::_8Bit);
378 }
else if (encoding ==
"base64") {
379 part->setEncoding(MimePart::Base64);
380 }
else if (encoding ==
"quoted-printable") {
381 part->setEncoding(MimePart::QuotedPrintable);
383 qCCritical(CUTELYST_VIEW_EMAIL) <<
"Unknown encoding" << encoding;
387 #include "moc_viewemail.cpp"