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;
57 return d->defaultContentType;
63 d->defaultContentType = contentType;
70 return d->defaultCharset;
76 d->defaultCharset = charset;
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));
126 return static_cast<ViewEmail::ConnectionType>(d->sender->connectionType());
132 d->sender->setConnectionType(static_cast<Sender::ConnectionType>(ct));
134 d->server->setConnectionType(static_cast<Server::ConnectionType>(ct));
141 return static_cast<ViewEmail::AuthMethod>(d->sender->authMethod());
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);
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" void setDefaultEncoding(const QByteArray &encoding)
void setSenderUser(const QString &user)
ViewEmail(QObject *parent, const QString &name=QString())
Constructs a new ViewEmail object with the given parent and name.
void setSenderPassword(const QString &password)
void setSenderHost(const QString &host)
virtual QByteArray render(Context *c) const override
QByteArray defaultCharset() const
QByteArray defaultContentType() const
AuthMethod senderAuthMethod() const
ConnectionType senderConnectionType() const
The Cutelyst namespace holds all public Cutelyst API.
void setAsync(bool enable)
void setSenderPort(int port)
QByteArray defaultEncoding() const
QString senderPassword() const
void setDefaultCharset(const QByteArray &charset)
void setSenderAuthMethod(AuthMethod method)
Cutelyst View abstract view component
void setStashKey(const QString &stashKey)
QString senderHost() const
void setDefaultContentType(const QByteArray &contentType)
bool error() const
Returns true if an error was set.
void setSenderConnectionType(ConnectionType ct)
void stash(const QVariantHash &unite)
QString senderUser() const