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> 17 Q_LOGGING_CATEGORY(CUTELYST_VIEW_EMAIL,
"cutelyst.view.email", QtWarningMsg)
23 :
View(new ViewEmailPrivate, parent, name)
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)) {
289 :
View(d, parent, name)
294 void 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());
321 void 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);
357 void 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"
QHash< QString, QVariant > toHash() const const
void setDefaultEncoding(const QByteArray &encoding)
void setSenderUser(const QString &user)
bool error() const noexcept
Returns true if an error was set.
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
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
void stash(const QVariantHash &unite)
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)
QString fromLatin1(QByteArrayView str)
QByteArray defaultEncoding() const
QString senderPassword() const
void setDefaultCharset(const QByteArray &charset)
void setSenderAuthMethod(AuthMethod method)
Cutelyst View abstract view component
QVariant config(const QString &key, const QVariant &defaultValue={}) const
The Cutelyst Application.
void setStashKey(const QString &stashKey)
QString senderHost() const
T qobject_cast(QObject *object)
QObject * parent() const const
QString toString() const const
void setDefaultContentType(const QByteArray &contentType)
void setSenderConnectionType(ConnectionType ct)
QString senderUser() const