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"));
224 }
else if (value.
type() == QVariant::StringList) {
226 for (
const QString &rcpt : rcpts) {
231 value = email.
value(QStringLiteral(
"cc"));
234 }
else if (value.
type() == QVariant::StringList) {
236 for (
const QString &rcpt : rcpts) {
241 value = email.
value(QStringLiteral(
"bcc"));
244 }
else if (value.
type() == QVariant::StringList) {
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());
257 c->
error(QStringLiteral(
"Can't send email without parts or body, check stash"));
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)) {
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)
QList< QVariant > toList() const const
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
bool isNull() const const
QByteArray defaultContentType() const
bool isEmpty() const 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
QStringList toStringList() const const
QString senderPassword() const
void setDefaultCharset(const QByteArray &charset)
void setSenderAuthMethod(AuthMethod method)
Cutelyst View abstract view component
QString fromLatin1(const char *str, int size)
void setStashKey(const QString &stashKey)
QVariant::Type type() const const
QString senderHost() const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject * parent() const const
QString toString() const 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