nMail-企业级邮件中间件介绍

1、功能概述

可实现企业用户多人、同时、大量的电子邮件在服务器端的集中发送和接收,用户可查询、管理各自的邮件信箱。

2、应用场合

大并发、高性能、强功能等较高要求的企业级客户在自己开发的传统C/S应用、多层应用或Web应用中快速集成电子邮件收发的功能。

可实现客户端不连接外网,通过服务器集中收发外网邮件,并存储在数据库中集中管理和查询)。

3、功能描述

1)发送邮件

可向多个邮件地址发送电子邮件(支持从程序中发送和从数据库中发送),邮件可为文本或HTML格式,可带附件,提交发送的邮件进入队列排队发送,邮件可分高中低三个等级,等级高优先发送,发送失败可重试(如重试两次)。

2)接收邮件

组件后台自动完成邮件的接收,自动根据配置和接收到的邮件特征进行识别和分拣到接收者的收信箱。

3)存为草稿

邮件编写好后,可存为草稿而不立即发送,可重新读取邮件草稿再执行发送,邮件才开始进入发送队列。

4)读取邮箱

可读取用户的各邮箱(草稿箱、发送箱、已发送、收件箱、已删除)中未读邮件数量和全部邮件数量;可读取各邮箱的邮件内容列表,可分页方式读取,也可全部读取,通过邮件ID,可读取邮件和附件内容。

5)读取状态

可单个或批量设置用户的各邮箱中的邮件的读取状态(已读或未读)。

6)删除邮件

可单个或批量删除用户的各邮箱中的邮件,可逻辑删除(移动到已删除邮箱),也可物理彻底删除,逻辑删除的邮件可恢复到原来的邮箱。

4、性能特点

1)可支持大并发客户端调用发送邮件和查看邮箱(数百甚至数千);

2)支持密集邮件发送(群发),可同时向数百、数千邮件地址发送邮件;

3)组件可支持分布式部署(收发不在同一台服务器),可实现应用服务器集群部署;

5、环境支持

1)支持各种主流的邮件服务器的邮件收发(SMTP/POP3/IMAP等协议);

2)组件可部署到Sybase EAServer 5.x/6.x各种版本上(开发版/工作组版/高级版)未来将支持IISJbossWebLogicWebSpare等应用服务器;

3)提供WebService HTTP/CORBA IIOP/数据库SP等接口,支持PowerBuilder (9/10/10.5/11.2/11.5)Java.NET等客户端调用;

4 )组件支持各种主流数据库 MS SQLServer Oracle Sybase ASE/ASA 等;
要实现一个能够接收HTTP请求并处理邮件数据的代理服务器,需要以下步骤: 1. 创建一个C++程序,包含HTTP服务器和邮件客户端的代码。 2. 通过HTTP服务器接收HTTP请求,解析请求头和请求体,获取需要处理的邮件数据。 3. 使用邮件客户端连接邮件服务器,将需要处理的邮件数据发送给邮件服务器。 4. 等待邮件服务器的响应,将响应数据返回给HTTP客户端。 以下是一个简单的示例程序,使用Boost库实现HTTP服务器和邮件客户端: ```c++ #include <iostream> #include <string> #include <boost/asio.hpp> #include <boost/asio/ssl.hpp> #include <boost/bind.hpp> #include <boost/lexical_cast.hpp> #include <boost/algorithm/string.hpp> #include <boost/property_tree/json_parser.hpp> #include <boost/property_tree/ptree.hpp> #include <openssl/ssl.h> #include <openssl/err.h> using namespace boost::asio; using namespace boost::asio::ip; using namespace boost::property_tree; class proxy_server { public: proxy_server(io_service& io_service, int port, const std::string& mail_server, int mail_port) : io_service_(io_service), acceptor_(io_service, tcp::endpoint(tcp::v4(), port)), mail_server_(mail_server), mail_port_(mail_port) { start_accept(); } private: void start_accept() { socket_ptr sock(new tcp::socket(io_service_)); acceptor_.async_accept(*sock, boost::bind(&proxy_server::handle_accept, this, sock, boost::asio::placeholders::error)); } void handle_accept(socket_ptr sock, const boost::system::error_code& error) { if (!error) { boost::asio::async_read_until(*sock, request_, "\r\n\r\n", boost::bind(&proxy_server::handle_read, this, sock, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); } start_accept(); } void handle_read(socket_ptr sock, const boost::system::error_code& error, size_t bytes_transferred) { if (!error) { std::istream stream(&request_); std::string line; getline(stream, line); std::vector<std::string> parts; boost::split(parts, line, boost::is_any_of(" ")); if (parts.size() == 3) { std::string method = parts[0]; std::string path = parts[1]; std::string version = parts[2]; ptree headers; std::string header_line; while (getline(stream, header_line) && header_line != "\r") { std::vector<std::string> header_parts; boost::split(header_parts, header_line, boost::is_any_of(":")); if (header_parts.size() == 2) { std::string header_name = header_parts[0]; std::string header_value = header_parts[1]; headers.add(header_name, header_value); } } std::string content; if (headers.get_optional<std::string>("Content-Length")) { size_t content_length = boost::lexical_cast<size_t>(headers.get<std::string>("Content-Length")); boost::asio::read(*sock, request_, boost::asio::transfer_exactly(content_length - bytes_transferred)); std::istream content_stream(&request_); getline(content_stream, content); } std::string mail_data = parse_mail_data(content); std::string mail_server = mail_server_ + ":" + boost::lexical_cast<std::string>(mail_port_); boost::asio::io_service mail_io_service; tcp::resolver mail_resolver(mail_io_service); tcp::resolver::query mail_query(mail_server, "smtp"); tcp::socket mail_socket(mail_io_service); boost::asio::connect(mail_socket, mail_resolver.resolve(mail_query)); boost::asio::write(mail_socket, boost::asio::buffer("DATA\r\n")); boost::asio::read_until(mail_socket, reply_, "\r\n"); boost::asio::write(mail_socket, boost::asio::buffer(mail_data + "\r\n.\r\n")); boost::asio::read_until(mail_socket, reply_, "\r\n"); std::string response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: 18\r\n\r\nMail sent to " + mail_server_; boost::asio::write(*sock, boost::asio::buffer(response)); } } } std::string parse_mail_data(const std::string& content) { ptree json; std::istringstream is(content); read_json(is, json); std::stringstream ss; ss << "From: " << json.get<std::string>("from") << "\r\n"; ss << "To: " << json.get<std::string>("to") << "\r\n"; ss << "Subject: " << json.get<std::string>("subject") << "\r\n"; ss << "\r\n"; ss << json.get<std::string>("body"); return ss.str(); } private: io_service& io_service_; tcp::acceptor acceptor_; boost::asio::streambuf request_; boost::asio::streambuf reply_; std::string mail_server_; int mail_port_; }; int main(int argc, char** argv) { SSL_load_error_strings(); SSL_library_init(); if (argc != 4) { std::cerr << "Usage: " << argv[0] << " <port> <mail_server> <mail_port>" << std::endl; return 1; } try { io_service io_service; proxy_server server(io_service, atoi(argv[1]), argv[2], atoi(argv[3])); io_service.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } ``` 以上只是一个简单的示例程序,实际应用中还需要进行更多的错误处理和安全性保护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值