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)
24 :
View(new ViewEmailPrivate, parent, name)
45 return d->defaultContentType;
51 d->defaultContentType = contentType;
58 return d->defaultCharset;
64 d->defaultCharset = charset;
71 return d->defaultEncoding;
77 d->defaultEncoding = encoding;
84 return d->server->host();
90 d->server->setHost(host);
96 return d->server->port();
102 d->server->setPort(quint16(port));
114 d->server->setConnectionType(static_cast<Server::ConnectionType>(ct));
126 d->server->setAuthMethod(static_cast<Server::AuthMethod>(method));
132 return d->server->username();
138 d->server->setUsername(user);
144 return d->server->password();
150 d->server->setPassword(password);
156 QVariantHash email = c->
stash(d->stashKey).toHash();
157 if (email.isEmpty()) {
159 "Cannot render template, template name or template stash key not defined"));
166 value = email.
value(u
"to"_s);
168 message.addTo(SimpleMail::EmailAddress{value.
toString()});
171 for (
const QString &rcpt : rcpts) {
172 message.addTo(SimpleMail::EmailAddress{rcpt});
176 value = email.
value(u
"cc"_s);
178 message.addCc(SimpleMail::EmailAddress{value.
toString()});
181 for (
const QString &rcpt : rcpts) {
182 message.addCc(SimpleMail::EmailAddress{rcpt});
186 value = email.
value(u
"bcc"_s);
188 message.addBcc(SimpleMail::EmailAddress{value.
toString()});
191 for (
const QString &rcpt : rcpts) {
192 message.addBcc(SimpleMail::EmailAddress{rcpt});
196 message.setSender(SimpleMail::EmailAddress{email.value(u
"from"_s).toString()});
197 message.setSubject(email.value(u
"subject"_s).toString());
202 c->
appendError(u
"Can't send email without parts or body, check stash"_s);
207 const QVariantList partsVariant = parts.
toList();
208 for (
const QVariant &part : partsVariant) {
209 auto mime = part.value<std::shared_ptr<MimePart>>();
211 message.addPart(mime);
213 qCCritical(CUTELYST_VIEW_EMAIL) <<
"Failed to cast MimePart";
217 auto contentTypeIt = email.constFind(u
"content_type"_s);
218 if (contentTypeIt != email.constEnd() && !contentTypeIt.value().isNull() &&
219 !contentTypeIt.value().toString().isEmpty()) {
220 const QByteArray contentType = contentTypeIt.value().toString().toLatin1();
221 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using specified content_type" << contentType;
222 message.getContent().setContentType(contentType);
223 }
else if (!d->defaultContentType.isEmpty()) {
224 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using default content_type" << d->defaultContentType;
225 message.getContent().setContentType(d->defaultContentType);
228 auto part = std::make_shared<MimeText>(body.
toString());
229 d->setupAttributes(part, email);
230 message.setContent(part);
233 ServerReply *reply = d->server->sendMail(message);
234 connect(reply, &ServerReply::finished, reply, &ServerReply::deleteLater);
240 :
View(d, parent, name)
245 void ViewEmail::initSender()
248 d->server =
new Server(
this);
256 d->stashKey = config.value(u
"stash_key"_s, u
"email"_s).toString();
258 if (!config.value(u
"sender_host"_s).isNull()) {
259 d->server->setHost(config.value(u
"sender_host"_s).toString());
261 if (!config.value(u
"sender_port"_s).isNull()) {
262 d->server->setPort(quint16(config.value(u
"sender_port"_s).toInt()));
264 if (!config.value(u
"sender_username"_s).isNull()) {
265 d->server->setUsername(config.value(u
"sender_username"_s).toString());
267 if (!config.value(u
"sender_password"_s).isNull()) {
268 d->server->setPassword(config.value(u
"sender_password"_s).toString());
272 void ViewEmailPrivate::setupAttributes(std::shared_ptr<MimePart> part,
273 const QVariantHash &attrs)
const 275 auto contentTypeIt = attrs.constFind(u
"content_type"_s);
276 if (contentTypeIt != attrs.constEnd() && !contentTypeIt.value().isNull() &&
277 !contentTypeIt.value().toString().isEmpty()) {
278 const QByteArray contentType = contentTypeIt.value().toString().toLatin1();
279 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using specified content_type" << contentType;
280 part->setContentType(contentType);
281 }
else if (!defaultContentType.isEmpty()) {
282 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using default content_type" << defaultContentType;
283 part->setContentType(defaultContentType);
286 auto charsetIt = attrs.constFind(u
"charset"_s);
287 if (charsetIt != attrs.constEnd() && !charsetIt.value().isNull() &&
288 !charsetIt.value().toString().isEmpty()) {
289 const QByteArray charset = charsetIt.value().toString().toLatin1();
290 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using specified charset" << charset;
291 part->setCharset(charset);
292 }
else if (!defaultCharset.isEmpty()) {
293 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using default charset" << defaultCharset;
294 part->setCharset(defaultCharset);
297 auto encodingIt = attrs.constFind(u
"encoding"_s);
298 if (encodingIt != attrs.constEnd() && !encodingIt.value().isNull() &&
299 !encodingIt.value().toString().isEmpty()) {
300 const QByteArray encoding = encodingIt.value().toString().toLatin1();
301 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using specified encoding" << encoding;
302 setupEncoding(part, encoding);
303 }
else if (!defaultEncoding.isEmpty()) {
304 qCDebug(CUTELYST_VIEW_EMAIL) <<
"Using default charset" << defaultEncoding;
305 setupEncoding(part, defaultEncoding);
309 void ViewEmailPrivate::setupEncoding(std::shared_ptr<MimePart> part,
312 if (encoding ==
"7bit") {
313 part->setEncoding(MimePart::_7Bit);
314 }
else if (encoding ==
"8bit") {
315 part->setEncoding(MimePart::_8Bit);
316 }
else if (encoding ==
"base64") {
317 part->setEncoding(MimePart::Base64);
318 }
else if (encoding ==
"quoted-printable") {
319 part->setEncoding(MimePart::QuotedPrintable);
321 qCCritical(CUTELYST_VIEW_EMAIL) <<
"Unknown encoding" << encoding;
325 #include "moc_viewemail.cpp" QHash< QString, QVariant > toHash() const const
void setDefaultEncoding(const QByteArray &encoding)
void setSenderUser(const QString &user)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QList< QVariant > toList() const const
void setSenderPassword(const QString &password)
void setSenderHost(const QString &host)
void appendError(const QString &error)
QByteArray render(Context *c) const override
QByteArray defaultCharset() const
bool isNull() const const
void stash(const QVariantHash &unite)
QByteArray defaultContentType() const
bool isEmpty() const const
AuthMethod senderAuthMethod() const
ConnectionType senderConnectionType() const
The Cutelyst namespace holds all public Cutelyst API.
void setSenderPort(int port)
QByteArray defaultEncoding() const
QStringList toStringList() const const
A view that sends stash data via e-mail.
QString senderPassword() const
void setDefaultCharset(const QByteArray &charset)
void setSenderAuthMethod(AuthMethod method)
Abstract View component for Cutelyst.
QVariant config(const QString &key, const QVariant &defaultValue={}) const
The Cutelyst application.
ViewEmail(QObject *parent, const QString &name={})
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