5#include "viewemail_p.h"
7#include <Cutelyst/application.h>
8#include <Cutelyst/context.h>
9#include <Cutelyst/response.h>
10#include <SimpleMail/emailaddress.h>
11#include <SimpleMail/mimemessage.h>
12#include <SimpleMail/mimetext.h>
13#include <SimpleMail/serverreply.h>
15#include <QtCore/QLoggingCategory>
17Q_LOGGING_CATEGORY(CUTELYST_VIEW_EMAIL,
"cutelyst.view.email", QtWarningMsg)
20using namespace SimpleMail;
37 d->stashKey = stashKey;
44 return d->defaultContentType;
50 d->defaultContentType = contentType;
57 return d->defaultCharset;
63 d->defaultCharset = charset;
70 return d->defaultEncoding;
76 d->defaultEncoding = encoding;
83 return d->sender->host();
89 d->sender->setHost(host);
91 d->server->setHost(host);
98 return d->sender->port();
104 d->sender->setPort(quint16(port));
106 d->server->setPort(quint16(port));
119 d->sender->setConnectionType(
static_cast<Sender::ConnectionType
>(ct));
121 d->server->setConnectionType(
static_cast<Server::ConnectionType
>(ct));
134 d->sender->setAuthMethod(
static_cast<Sender::AuthMethod
>(method));
136 d->server->setAuthMethod(
static_cast<Server::AuthMethod
>(method));
143 return d->sender->user();
149 d->sender->setUser(user);
151 d->server->setUsername(user);
158 return d->sender->password();
164 d->sender->setPassword(password);
166 d->server->setPassword(password);
181 d->server =
new Server(
this);
182 d->server->setHost(d->sender->host());
183 d->server->setPort(d->sender->port());
184 d->server->setUsername(d->sender->user());
185 d->server->setPassword(d->sender->password());
186 d->server->setAuthMethod(
static_cast<Server::AuthMethod
>(d->sender->authMethod()));
187 d->server->setConnectionType(
188 static_cast<Server::ConnectionType
>(d->sender->connectionType()));
200 QVariantHash email = c->
stash(d->stashKey).toHash();
201 if (email.isEmpty()) {
202 c->
error(QStringLiteral(
203 "Cannot render template, template name or template stash key not defined"));
210 value = email.
value(QStringLiteral(
"to"));
212 message.addTo(value.toString());
214 const auto rcpts = value.toStringList();
215 for (
const QString &rcpt : rcpts) {
220 value = email.value(QStringLiteral(
"cc"));
222 message.addCc(value.toString());
224 const auto rcpts = value.toStringList();
225 for (
const QString &rcpt : rcpts) {
230 value = email.value(QStringLiteral(
"bcc"));
232 message.addBcc(value.toString());
234 const auto rcpts = value.toStringList();
235 for (
const QString &rcpt : rcpts) {
236 message.addBcc(rcpt);
240 message.setSender(email.value(QStringLiteral(
"from")).toString());
241 message.setSubject(email.value(QStringLiteral(
"subject")).toString());
246 c->
error(QStringLiteral(
"Can't send email without parts or body, check stash"));
251 const QVariantList partsVariant = parts.
toList();
252 for (
const QVariant &part : partsVariant) {
253 auto mime = part.value<MimePart *>();
255 message.addPart(mime);
257 qCCritical(CUTELYST_VIEW_EMAIL) <<
"Failed to cast MimePart";
261 auto contentTypeIt = email.constFind(QStringLiteral(
"content_type"));
262 if (contentTypeIt != email.constEnd() && !contentTypeIt.value().isNull() &&
263 !contentTypeIt.value().toString().isEmpty()) {
264 const QByteArray contentType = contentTypeIt.value().toString().toLatin1();
265 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using specified content_type" << contentType;
266 message.getContent().setContentType(contentType);
267 }
else if (!d->defaultContentType.isEmpty()) {
268 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using default content_type" << d->defaultContentType;
269 message.getContent().setContentType(d->defaultContentType);
272 auto part =
new MimeText(body.
toString());
273 d->setupAttributes(part, email);
274 message.setContent(part);
278 ServerReply *reply = d->server->sendMail(message);
279 connect(reply, &ServerReply::finished, reply, &ServerReply::deleteLater);
280 }
else if (!d->sender->sendMail(message)) {
294void ViewEmail::initSender()
297 d->sender =
new Sender(
this);
302 config = app->config(QStringLiteral(
"VIEW_EMAIL")).toHash();
305 d->stashKey = config.value(QStringLiteral(
"stash_key"), QStringLiteral(
"email")).toString();
307 if (!config.value(QStringLiteral(
"sender_host")).isNull()) {
308 d->sender->setHost(config.value(QStringLiteral(
"sender_host")).toString());
310 if (!config.value(QStringLiteral(
"sender_port")).isNull()) {
311 d->sender->setPort(quint16(config.value(QStringLiteral(
"sender_port")).toInt()));
313 if (!config.value(QStringLiteral(
"sender_username")).isNull()) {
314 d->sender->setUser(config.value(QStringLiteral(
"sender_username")).toString());
316 if (!config.value(QStringLiteral(
"sender_password")).isNull()) {
317 d->sender->setPassword(config.value(QStringLiteral(
"sender_password")).toString());
321void ViewEmailPrivate::setupAttributes(MimePart *part,
const QVariantHash &attrs)
const
323 auto contentTypeIt = attrs.constFind(QStringLiteral(
"content_type"));
324 if (contentTypeIt != attrs.constEnd() && !contentTypeIt.value().isNull() &&
325 !contentTypeIt.value().toString().isEmpty()) {
326 const QByteArray contentType = contentTypeIt.value().toString().toLatin1();
327 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using specified content_type" << contentType;
328 part->setContentType(contentType);
329 }
else if (!defaultContentType.isEmpty()) {
330 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using default content_type" << defaultContentType;
331 part->setContentType(defaultContentType);
334 auto charsetIt = attrs.constFind(QStringLiteral(
"charset"));
335 if (charsetIt != attrs.constEnd() && !charsetIt.value().isNull() &&
336 !charsetIt.value().toString().isEmpty()) {
337 const QByteArray charset = charsetIt.value().toString().toLatin1();
338 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using specified charset" << charset;
339 part->setCharset(charset);
340 }
else if (!defaultCharset.isEmpty()) {
341 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using default charset" << defaultCharset;
342 part->setCharset(defaultCharset);
345 auto encodingIt = attrs.constFind(QStringLiteral(
"encoding"));
346 if (encodingIt != attrs.constEnd() && !encodingIt.value().isNull() &&
347 !encodingIt.value().toString().isEmpty()) {
348 const QByteArray encoding = encodingIt.value().toString().toLatin1();
349 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using specified encoding" << encoding;
350 setupEncoding(part, encoding);
351 }
else if (!defaultEncoding.isEmpty()) {
352 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using default charset" << defaultEncoding;
353 setupEncoding(part, defaultEncoding);
357void ViewEmailPrivate::setupEncoding(MimePart *part,
const QByteArray &encoding)
const
359 if (encoding ==
"7bit") {
360 part->setEncoding(MimePart::_7Bit);
361 }
else if (encoding ==
"8bit") {
362 part->setEncoding(MimePart::_8Bit);
363 }
else if (encoding ==
"base64") {
364 part->setEncoding(MimePart::Base64);
365 }
else if (encoding ==
"quoted-printable") {
366 part->setEncoding(MimePart::QuotedPrintable);
368 qCCritical(CUTELYST_VIEW_EMAIL) <<
"Unknown encoding" << encoding;
372#include "moc_viewemail.cpp"
void stash(const QVariantHash &unite)
bool error() const noexcept
Returns true if an error was set.
QString senderUser() const
void setSenderConnectionType(ConnectionType ct)
QByteArray defaultEncoding() const
QString senderPassword() const
void setSenderUser(const QString &user)
void setSenderHost(const QString &host)
ConnectionType senderConnectionType() const
QString senderHost() const
QByteArray defaultCharset() const
void setStashKey(const QString &stashKey)
void setDefaultContentType(const QByteArray &contentType)
void setAsync(bool enable)
void setSenderPort(int port)
QByteArray defaultContentType() const
void setSenderAuthMethod(AuthMethod method)
void setDefaultCharset(const QByteArray &charset)
void setDefaultEncoding(const QByteArray &encoding)
AuthMethod senderAuthMethod() const
ViewEmail(QObject *parent, const QString &name=QString())
Constructs a new ViewEmail object with the given parent and name.
void setSenderPassword(const QString &password)
virtual QByteArray render(Context *c) const override
View(QObject *parent, const QString &name)
The Cutelyst namespace holds all public Cutelyst API.
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject * parent() const const
T qobject_cast(QObject *object)
QString fromLatin1(const char *str, int size)
bool isNull() const const
QList< QVariant > toList() const const
QString toString() const const