---
name: "Net::Server::Mail::SMTP"
section: "3pm"
platform: "linux"
package: "libnet-server-mail-perl"
version: "0.28-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Net::Server::Mail::SMTP"
---

# Net::Server::Mail::SMTP(3pm)

A module to implement the SMTP protocol

## NAME

Net::Server::Mail::SMTP - A module to implement the SMTP protocol

## SYNOPSIS

```
    use Net::Server::Mail::SMTP;
    my @local_domains = qw(example.com example.org);
    my $server = IO::Socket::INET->new( Listen => 1, LocalPort => 25 );
    my $conn;
    while($conn = $server->accept)
    {
        my $smtp = Net::Server::Mail::SMTP->new( socket => $conn );
        $smtp->set_callback(RCPT => \&validate_recipient);
        $smtp->set_callback(DATA => \&queue_message);
        $smtp->process();
        $conn->close();
    }
    sub validate_recipient
    {
        my($session, $recipient) = @_;
        my $domain;
        if($recipient =~ /\@(.*)>\s*$/)
        {
            $domain = $1;
        }
        if(not defined $domain)
        {
            return(0, 513, 'Syntax error.');
        }
        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, 'Error: no valid recipients')
            unless(@recipients);
        my $msgid = add_queue($sender, \@recipients, $data)
          or return(0);
        return(1, 250, "message queued $msgid");
    }
```

## DESCRIPTION

This class implement the SMTP (RFC 821) protocol. Notice that it don't implement the extension mechanism introduce in RFC 2821. You have to use Net::Server::Mail::ESMTP if you want this capability.

This class inherit from Net::Server::Mail. Please see Net::Server::Mail for documentation of common methods.

## METHODS

SMTP specific methods.

### get\_sender

Returns the sender of the current session. Return undefined if the reverse path step is not complete.

### get\_recipients

Returns the list of recipients supplied by client. Returns undef if forward\_path step is not engaged. Returns an empty list if not recipients succeed.

## EVENTS

Descriptions of callback who's can be used with set\_callback method. All handle takes the Net::Server::Mail::SMTP object as first argument and specific callback's arguments.

### HELO

Takes the hostname given as argument. Engage the reverse path step on success.

```
    sub helo_handle
    {
        my($session, $hostname) = @_;
        if($hostname eq 'localhost')
        {
            return(0, 553, q(I don't like this hostname, try again.));
        }
        # don't forgot to return a success reply if you are happy with
        # command's value
        return 1;
    }
```

### NOOP

This handler takes no argument

### EXPN

Command not yet implemented.

Handler takes address as argument.

### EXPN

Command not implemented, deprecated by RFC 2821

Handler takes no argument.

### VRFY

Command not yet implemented.

Handler takes address as argument.

### HELP

Command not yet implemented.

Handler takes a command name as argument.

### MAIL

Handler takes address as argument. On success, engage the forward path step and keep the given address for later use (get it with **get\_sender()** method).

### RCPT

Handler takes address as argument. On success, engage the mail data path step and push the given address into the recipient list for later use (get it with **get\_recipients()** method).

### SEND

Command not implemented.

Handler takes no argument.

### SOML

Command not implemented.

Handler takes no argument.

### SAML

Command not implemented.

Handler takes no argument.

### DATA

This handler is called after the final . sent by client. It takes data as argument in a scalar reference. You should queue the message and reply with the queue ID.

### DATA-INIT

This handler is called before enter in the "waiting for data" step. The default success reply is a 354 code telling the client to send the mail content.

### DATA-PART

This handler is called at each parts of mail content sent. It takes as argument a scalar reference to the part of data received. It is deprecated to change the contents of this scalar.

### RSET

Handler takes no argument.

On success, all step are initialized and sender/recipients list are flushed.

### QUIT

Handler takes no argument.

Connection is closed after this command. This behavior may change in future, you will probably be able to control the closing of connection.

## SEE ALSO

Please, see Net::Server::Mail, Net::Server::Mail::ESMTP and Net::Server::Mail::LMTP.

## AUTHOR

Olivier Poitrey \<rs@rhapsodyk.net\>

## AVAILABILITY

Available on CPAN.

anonymous Git repository:

git clone git://github.com/rs/net-server-mail.git

Git repository on the web:

\<https://github.com/rs/net-server-mail\>

## BUGS

Please use CPAN system to report a bug (http://rt.cpan.org/).

## LICENCE

This library is free software; you can redistribute it and/or modify it under the terms of the GNU 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.

This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

## COPYRIGHT

Copyright (C) 2002 - Olivier Poitrey, 2007 - Xavier Guimard
