mirror of
https://github.com/pocoproject/poco.git
synced 2025-10-23 08:31:43 +02:00
SMTPChannel and SMTPLogger example
This commit is contained in:
198
Net/src/SMTPChannel.cpp
Normal file
198
Net/src/SMTPChannel.cpp
Normal file
@@ -0,0 +1,198 @@
|
||||
//
|
||||
// SMTPChannel.cpp
|
||||
//
|
||||
// $Id: //poco/Main/Net/src/SMTPChannel.cpp#3 $
|
||||
//
|
||||
// Library: Net
|
||||
// Package: Logging
|
||||
// Module: SMTPChannel
|
||||
//
|
||||
// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#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()
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
||||
|
||||
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())
|
||||
{
|
||||
int size = fis.tellg();
|
||||
char* pMem = new char [size];
|
||||
fis.seekg(std::ios::beg);
|
||||
fis.read(pMem, size);
|
||||
message.addAttachment(_attachment, new StringPartSource(std::string(pMem, 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
|
Reference in New Issue
Block a user