aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/poco/Net/src/SMTPChannel.cpp
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/poco/Net/src/SMTPChannel.cpp
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/poco/Net/src/SMTPChannel.cpp')
-rw-r--r--contrib/libs/poco/Net/src/SMTPChannel.cpp210
1 files changed, 210 insertions, 0 deletions
diff --git a/contrib/libs/poco/Net/src/SMTPChannel.cpp b/contrib/libs/poco/Net/src/SMTPChannel.cpp
new file mode 100644
index 0000000000..a498179a44
--- /dev/null
+++ b/contrib/libs/poco/Net/src/SMTPChannel.cpp
@@ -0,0 +1,210 @@
+//
+// SMTPChannel.cpp
+//
+// Library: Net
+// Package: Logging
+// Module: SMTPChannel
+//
+// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#include "Poco/Net/SMTPChannel.h"
+#include "Poco/Net/MailMessage.h"
+#include "Poco/Net/MailRecipient.h"
+#include "Poco/Net/SMTPClientSession.h"
+#include "Poco/Net/StringPartSource.h"
+#include "Poco/Message.h"
+#include "Poco/DateTimeFormatter.h"
+#include "Poco/DateTimeFormat.h"
+#include "Poco/LocalDateTime.h"
+#include "Poco/LoggingFactory.h"
+#include "Poco/Instantiator.h"
+#include "Poco/NumberFormatter.h"
+#include "Poco/FileStream.h"
+#include "Poco/File.h"
+#include "Poco/Environment.h"
+
+
+namespace Poco {
+namespace Net {
+
+
+const std::string SMTPChannel::PROP_MAILHOST("mailhost");
+const std::string SMTPChannel::PROP_SENDER("sender");
+const std::string SMTPChannel::PROP_RECIPIENT("recipient");
+const std::string SMTPChannel::PROP_LOCAL("local");
+const std::string SMTPChannel::PROP_ATTACHMENT("attachment");
+const std::string SMTPChannel::PROP_TYPE("type");
+const std::string SMTPChannel::PROP_DELETE("delete");
+const std::string SMTPChannel::PROP_THROW("throw");
+
+
+SMTPChannel::SMTPChannel():
+ _mailHost("localhost"),
+ _local(true),
+ _type("text/plain"),
+ _delete(false),
+ _throw(false)
+{
+}
+
+
+SMTPChannel::SMTPChannel(const std::string& mailhost, const std::string& sender, const std::string& recipient):
+ _mailHost(mailhost),
+ _sender(sender),
+ _recipient(recipient),
+ _local(true),
+ _type("text/plain"),
+ _delete(false),
+ _throw(false)
+{
+}
+
+
+SMTPChannel::~SMTPChannel()
+{
+ try
+ {
+ close();
+ }
+ catch (...)
+ {
+ poco_unexpected();
+ }
+}
+
+
+void SMTPChannel::open()
+{
+}
+
+
+void SMTPChannel::close()
+{
+}
+
+
+void SMTPChannel::log(const Message& msg)
+{
+ try
+ {
+ MailMessage message;
+ message.setSender(_sender);
+ message.addRecipient(MailRecipient(MailRecipient::PRIMARY_RECIPIENT, _recipient));
+ message.setSubject("Log Message from " + _sender);
+ std::stringstream content;
+ content << "Log Message\r\n"
+ << "===========\r\n\r\n"
+ << "Host: " << Environment::nodeName() << "\r\n"
+ << "Logger: " << msg.getSource() << "\r\n";
+
+ if (_local)
+ {
+ DateTime dt(msg.getTime());
+ content << "Timestamp: " << DateTimeFormatter::format(LocalDateTime(dt), DateTimeFormat::RFC822_FORMAT) << "\r\n";
+ }
+ else
+ content << "Timestamp: " << DateTimeFormatter::format(msg.getTime(), DateTimeFormat::RFC822_FORMAT) << "\r\n";
+
+ content << "Priority: " << NumberFormatter::format(msg.getPriority()) << "\r\n"
+ << "Process ID: " << NumberFormatter::format(msg.getPid()) << "\r\n"
+ << "Thread: " << msg.getThread() << " (ID: " << msg.getTid() << ")\r\n"
+ << "Message text: " << msg.getText() << "\r\n\r\n";
+
+ message.addContent(new StringPartSource(content.str()));
+
+ if (!_attachment.empty())
+ {
+ {
+ Poco::FileInputStream fis(_attachment, std::ios::in | std::ios::binary | std::ios::ate);
+ if (fis.good())
+ {
+ typedef std::allocator<std::string::value_type>::size_type SST;
+
+ std::streamoff size = fis.tellg();
+ poco_assert (std::numeric_limits<unsigned int>::max() >= size);
+ poco_assert (std::numeric_limits<SST>::max() >= size);
+ char* pMem = new char [static_cast<unsigned int>(size)];
+ fis.seekg(std::ios::beg);
+ fis.read(pMem, size);
+ message.addAttachment(_attachment,
+ new StringPartSource(std::string(pMem, static_cast<SST>(size)),
+ _type,
+ _attachment));
+
+ delete [] pMem;
+ }
+ }
+ if (_delete) File(_attachment).remove();
+ }
+
+ SMTPClientSession session(_mailHost);
+ session.login();
+ session.sendMessage(message);
+ session.close();
+ }
+ catch (Exception&)
+ {
+ if (_throw) throw;
+ }
+}
+
+
+void SMTPChannel::setProperty(const std::string& name, const std::string& value)
+{
+ if (name == PROP_MAILHOST)
+ _mailHost = value;
+ else if (name == PROP_SENDER)
+ _sender = value;
+ else if (name == PROP_RECIPIENT)
+ _recipient = value;
+ else if (name == PROP_LOCAL)
+ _local = isTrue(value);
+ else if (name == PROP_ATTACHMENT)
+ _attachment = value;
+ else if (name == PROP_TYPE)
+ _type = value;
+ else if (name == PROP_DELETE)
+ _delete = isTrue(value);
+ else if (name == PROP_THROW)
+ _throw = isTrue(value);
+ else
+ Channel::setProperty(name, value);
+}
+
+
+std::string SMTPChannel::getProperty(const std::string& name) const
+{
+ if (name == PROP_MAILHOST)
+ return _mailHost;
+ else if (name == PROP_SENDER)
+ return _sender;
+ else if (name == PROP_RECIPIENT)
+ return _recipient;
+ else if (name == PROP_LOCAL)
+ return _local ? "true" : "false";
+ else if (name == PROP_ATTACHMENT)
+ return _attachment;
+ else if (name == PROP_TYPE)
+ return _type;
+ else if (name == PROP_DELETE)
+ return _delete ? "true" : "false";
+ else if (name == PROP_THROW)
+ return _throw ? "true" : "false";
+ else
+ return Channel::getProperty(name);
+}
+
+
+void SMTPChannel::registerChannel()
+{
+ Poco::LoggingFactory::defaultFactory().registerChannelClass("SMTPChannel",
+ new Poco::Instantiator<SMTPChannel, Poco::Channel>);
+}
+
+
+} } // namespace Poco::Net