.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{ . if \nF \{ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "Net::Server::Mail 3pm" .TH Net::Server::Mail 3pm "2013-09-05" "perl v5.18.1" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" Net::Server::Mail \- Class to easily create a mail server .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 1 \& use Net::Server::Mail::SMTP; \& \& my @local_domains = qw(example.com example.org); \& my $server = new IO::Socket::INET Listen => 1, LocalPort => 25; \& \& my $conn; \& while($conn = $server\->accept) \& { \& my $smtp = new Net::Server::Mail::SMTP socket => $conn; \& $smtp\->set_callback(RCPT => \e&validate_recipient); \& $smtp\->set_callback(DATA => \e&queue_message); \& $smtp\->process(); \& $conn\->close(); \& } \& \& sub validate_recipient \& { \& my($session, $recipient) = @_; \& \& my $domain; \& if($recipient =~ /@(.*)>\es*$/) \& { \& $domain = $1; \& } \& \& if(not defined $domain) \& { \& return(0, 513, \*(AqSyntax error.\*(Aq); \& } \& elsif(not(grep $domain eq $_, @local_domains)) \& { \& return(0, 554, "$recipient: Recipient address rejected: Relay access denied"); \& } \& \& return(1); \& } \& \& sub queue_message \& { \& my($session, $data) = @_; \& \& my $sender = $session\->get_sender(); \& my @recipients = $session\->get_recipients(); \& \& return(0, 554, \*(AqError: no valid recipients\*(Aq) \& unless(@recipients); \& \& my $msgid = add_queue($sender, \e@recipients, $data); \& or return(0); \& \& return(1, 250, "message queued $msgid"); \& } .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" This module is a versatile and extensible implementation of the \s-1SMTP\s0 protocol and its different evolutions like \s-1ESMTP\s0 and \s-1LMTP.\s0 The event driven object-oriented \s-1API\s0 makes easy to incorporate the \s-1SMTP\s0 protocol to your programs. .PP Other SMTPd implementations don't support useful \s-1ESMTP\s0 extensions and the \s-1LMTP\s0 protocol. Their interface design precludes adding them later. So I've decided to rewrite a complete implementation with extensibility in mind. .PP It provides mechanism to easy addition future or not yet implemented \&\s-1ESMTP\s0 extensions. Developers can hook code at each \s-1SMTP\s0 session state and change the module's behaviors by registering event call-backs. The class is designed to be easily inherited from. .PP This class is the base class for mail service protocols such axs \&\fBNet::Server::Mail::SMTP\fR, \fBNet::Server::Mail::ESMTP\fR and \&\fBNet::Server::Mail::LMTP\fR. Refer to the documentation provided with each of these modules. .SH "METHODS" .IX Header "METHODS" .SS "new" .IX Subsection "new" .Vb 1 \& $instance = new Net::Server::Mail [option => \*(Aqvalue\*(Aq, ...] .Ve .PP options: .IP "handle_in" 4 .IX Item "handle_in" Sets the input handle, from which the server reads data. Defaults to \&\s-1STDIN.\s0 .IP "handle_out" 4 .IX Item "handle_out" Sets the output handle, to which the server writes data. Defaults to \&\s-1STDOUT.\s0 .IP "socket" 4 .IX Item "socket" Sets a socket to be used for server reads and writes instead of handles. .IP "error_sleep_time" 4 .IX Item "error_sleep_time" Number of seconds to wait for before printing an error message. This avoids some DoS attacks that attempt to flood the server with bogus commands. A value of 0 turns this feature off. Defaults to 0. .IP "idle_timeout" 4 .IX Item "idle_timeout" Number of seconds a connection must remain idle before it is closed. A value of 0 turns this feature off. Defaults to 0. .SS "dojob" .IX Subsection "dojob" Some command need to do some job after the handler call. Handler may want to overide this comportement to prevent from this job being executed. .PP By calling this method with a (defined) false value as argument, expected job isn't executed. Defaults to true. .SS "set_callback" .IX Subsection "set_callback" .Vb 1 \& ($success, $code, $msg) = $obj\->set_callback(VERB, \e&function, $context)> .Ve .PP Sets the callback code to be called on a particular event. The function should return 1 to 3 values: (success, [return_code, [\*(L"message\*(R"]]). .PP .Vb 10 \& $mailserver\->set_callback \& ( \& \*(AqRCPT\*(Aq, sub \& { \& my($address) = @_; \& if(is_relayed($address)) \& { \& # default success code/message will be used \& return 1; \& } \& else \& { \& return(0, 513, \*(AqRelaying denied.\*(Aq); \& } \& } \& ); .Ve .SS "process" .IX Subsection "process" .Vb 1 \& $mailserver\->process; .Ve .PP Start a new session. .SS "banner" .IX Subsection "banner" Send the introduction banner. You have to call it manually when are using \fIprocess_once()\fR method. Don't use it with \fIprocess()\fR method. .SH "EVENTS" .IX Header "EVENTS" .SS "banner" .IX Subsection "banner" Append at the opening of a new connection. .PP Handler takes no argument. .SS "timeout" .IX Subsection "timeout" This event append where timeout is exeded. .PP Handler takes no argument. .SH "SEE ALSO" .IX Header "SEE ALSO" Please, see Net::Server::Mail::SMTP, Net::Server::Mail::ESMTP and Net::Server::Mail::LMTP. .SH "AUTHOR" .IX Header "AUTHOR" Olivier Poitrey .SH "AVAILABILITY" .IX Header "AVAILABILITY" Available on \s-1CPAN.\s0 .PP anonymous Git repository: .PP git clone git://github.com/rs/net\-server\-mail.git .PP Git repository on the web: .PP .SH "BUGS" .IX Header "BUGS" Please use \s-1CPAN\s0 system to report a bug (http://rt.cpan.org/). .SH "LICENCE" .IX Header "LICENCE" This library is free software; you can redistribute it and/or modify it under the terms of the \s-1GNU\s0 Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. .PP This library is distributed in the hope that it will be useful, but \&\s-1WITHOUT ANY WARRANTY\s0; without even the implied warranty of \&\s-1MERCHANTABILITY\s0 or \s-1FITNESS FOR A PARTICULAR PURPOSE. \s0 See the \s-1GNU\s0 Lesser General Public License for more details. .PP You should have received a copy of the \s-1GNU\s0 Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, \s-1MA 02111\-1307 USA\s0 .SH "COPYRIGHT" .IX Header "COPYRIGHT" .IP "Copyright (C) 2002 \- Olivier Poitrey" 4 .IX Item "Copyright (C) 2002 - Olivier Poitrey" .PD 0 .IP "Copyright (C) 2007\-2013 \- Xavier Guimard" 4 .IX Item "Copyright (C) 2007-2013 - Xavier Guimard" .PD .SS "\s-1STARTTLS\s0" .IX Subsection "STARTTLS" .IP "Copyright (C) 2009 \- Dan Moore " 4 .IX Item "Copyright (C) 2009 - Dan Moore " .PD 0 .IP "Copyright (C) 2013 \- Mytram " 4 .IX Item "Copyright (C) 2013 - Mytram " .IP "Copyright (C) 2013 \- Xavier Guimard " 4 .IX Item "Copyright (C) 2013 - Xavier Guimard " .PD .SS "Contributors" .IX Subsection "Contributors" .IP "2012 \- Georg Hoesch (patch to reduce memory consumption)" 4 .IX Item "2012 - Georg Hoesch (patch to reduce memory consumption)"