5 #include "viewemail_p.h" 7 #include <Cutelyst/application.h> 8 #include <Cutelyst/context.h> 9 #include <Cutelyst/response.h> 11 #include <QtCore/QLoggingCategory> 13 #include <SimpleMail/mimemessage.h> 14 #include <SimpleMail/emailaddress.h> 15 #include <SimpleMail/mimetext.h> 16 #include <SimpleMail/serverreply.h> 18 Q_LOGGING_CATEGORY(CUTELYST_VIEW_EMAIL,
"cutelyst.view.email", QtWarningMsg)
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(static_cast<Server::ConnectionType>(d->sender->connectionType()));
199 QVariantHash email = c->
stash(d->stashKey).toHash();
200 if (email.isEmpty()) {
201 c->
error(QStringLiteral(
"Cannot render template, template name or template stash key not defined"));
208 value = email.value(QStringLiteral(
"to"));
209 if (value.type() == QVariant::String && !value.toString().isEmpty()) {
210 message.addTo(value.toString());
211 }
else if (value.type() == QVariant::StringList) {
212 const auto rcpts = value.toStringList();
213 for (
const QString &rcpt : rcpts) {
218 value = email.value(QStringLiteral(
"cc"));
219 if (value.type() == QVariant::String && !value.toString().isEmpty()) {
220 message.addCc(value.toString());
221 }
else if (value.type() == QVariant::StringList) {
222 const auto rcpts = value.toStringList();
223 for (
const QString &rcpt : rcpts) {
228 value = email.value(QStringLiteral(
"bcc"));
229 if (value.type() == QVariant::String && !value.toString().isEmpty()) {
230 message.addBcc(value.toString());
231 }
else if (value.type() == QVariant::StringList) {
232 const auto rcpts = value.toStringList();
233 for (
const QString &rcpt : rcpts) {
234 message.addBcc(rcpt);
238 message.setSender(email.value(QStringLiteral(
"from")).toString());
239 message.setSubject(email.value(QStringLiteral(
"subject")).toString());
244 c->
error(QStringLiteral(
"Can't send email without parts or body, check stash"));
249 const QVariantList partsVariant = parts.
toList();
250 for (
const QVariant &part : partsVariant) {
251 auto mime = part.value<MimePart*>();
253 message.addPart(mime);
255 qCCritical(CUTELYST_VIEW_EMAIL) <<
"Failed to cast MimePart";
259 auto contentTypeIt = email.constFind(QStringLiteral(
"content_type"));
260 if (contentTypeIt != email.constEnd()
261 && !contentTypeIt.value().isNull()
262 && !contentTypeIt.value().toString().isEmpty()) {
263 const QByteArray contentType = contentTypeIt.value().toString().toLatin1();
264 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using specified content_type" << contentType;
265 message.getContent().setContentType(contentType);
266 }
else if (!d->defaultContentType.isEmpty()) {
267 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using default content_type" << d->defaultContentType;
268 message.getContent().setContentType(d->defaultContentType);
271 auto part =
new MimeText(body.
toString());
272 d->setupAttributes(part, email);
273 message.setContent(part);
277 ServerReply *reply = d->server->sendMail(message);
278 connect(reply, &ServerReply::finished, reply, &ServerReply::deleteLater);
279 }
else if (!d->sender->sendMail(message)) {
292 void ViewEmail::initSender()
295 d->sender =
new Sender(
this);
300 config = app->
config(QStringLiteral(
"VIEW_EMAIL")).
toHash();
303 d->stashKey = config.value(QStringLiteral(
"stash_key"), QStringLiteral(
"email")).toString();
305 if (!config.value(QStringLiteral(
"sender_host")).isNull()) {
306 d->sender->setHost(config.value(QStringLiteral(
"sender_host")).toString());
308 if (!config.value(QStringLiteral(
"sender_port")).isNull()) {
309 d->sender->setPort(quint16(config.value(QStringLiteral(
"sender_port")).toInt()));
311 if (!config.value(QStringLiteral(
"sender_username")).isNull()) {
312 d->sender->setUser(config.value(QStringLiteral(
"sender_username")).toString());
314 if (!config.value(QStringLiteral(
"sender_password")).isNull()) {
315 d->sender->setPassword(config.value(QStringLiteral(
"sender_password")).toString());
320 void ViewEmailPrivate::setupAttributes(MimePart *part,
const QVariantHash &attrs)
const 322 auto contentTypeIt = attrs.constFind(QStringLiteral(
"content_type"));
323 if (contentTypeIt != attrs.constEnd()
324 && !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()
336 && !charsetIt.value().isNull()
337 && !charsetIt.value().toString().isEmpty()) {
338 const QByteArray charset = charsetIt.value().toString().toLatin1();
339 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using specified charset" << charset;
340 part->setCharset(charset);
341 }
else if (!defaultCharset.isEmpty()) {
342 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using default charset" << defaultCharset;
343 part->setCharset(defaultCharset);
346 auto encodingIt = attrs.constFind(QStringLiteral(
"encoding"));
347 if (encodingIt != attrs.constEnd()
348 && !encodingIt.value().isNull()
349 && !encodingIt.value().toString().isEmpty()) {
350 const QByteArray encoding = encodingIt.value().toString().toLatin1();
351 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using specified encoding" << encoding;
352 setupEncoding(part, encoding);
353 }
else if (!defaultEncoding.isEmpty()) {
354 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using default charset" << defaultEncoding;
355 setupEncoding(part, defaultEncoding);
359 void ViewEmailPrivate::setupEncoding(MimePart *part,
const QByteArray &encoding)
const 361 if (encoding ==
"7bit") {
362 part->setEncoding(MimePart::_7Bit);
363 }
else if (encoding ==
"8bit") {
364 part->setEncoding(MimePart::_8Bit);
365 }
else if (encoding ==
"base64") {
366 part->setEncoding(MimePart::Base64);
367 }
else if (encoding ==
"quoted-printable") {
368 part->setEncoding(MimePart::QuotedPrintable);
370 qCCritical(CUTELYST_VIEW_EMAIL) <<
"Unknown encoding" << encoding;
374 #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.
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)
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
QString fromLatin1(const char *str, int size)
The Cutelyst Application.
void setStashKey(const QString &stashKey)
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)
void setSenderConnectionType(ConnectionType ct)
QString senderUser() const