# Method Protocols.LMTP.Server()->create()

Method create

  `Protocols.LMTP.Server Protocols.LMTP.Server(array(string) _domains, void|int port, void|string ip, function(:void) _cb_mailfrom, function(:void) _cb_rcptto, function(:void) _cb_data)`

Description

  Create a receiving LMTP server. It implements RFC 2821, 2822, 2033 and 1854.

Parameter `domain`

  Domains name this server relay, you need to provide at least one domain (the first one will be used for MAILER-DAEMON address). if you want to relay everything you can put a '*' after this first domain.

Parameter `port`

  Port this server listen on

Parameter `listenip`

  IP on which server listen

Parameter `cb_mailfrom`

  Mailfrom callback function, this function will be called when a client send a mail from command. This function must take a string as argument (corresponding to the sender's email) and return int corresponding to the SMTP code to output to the client. If you return an array the first element is the SMTP code and the second is the error string to display.

Parameter `cb_rcptto`

  Same as cb_mailfrom but called when a client sends a rcpt to.

Parameter `cb_data`

  This function is called for each recipient in the "rcpt to" command after the client sends the "data" command It must have the following synopsis: int|array cb_data(object mime, string sender, string recipient, void|string rawdata) object mime : the mime data object string sender : sender of the mail (from the mailfrom command) string recipient : one recipient given by one rcpt command. return : SMTP code to output to the client. If you return an array the first element is the SMTP code and the second is the error string to display. Note that to comply with LMTP protocol you must output a code each time this function is called.

Example

      Here is an example of silly program that does nothing except outputing
        informations to stdout.
       int cb_mailfrom(string mail)
       {
         return 250;
       }
       int cb_rcptto(string email)
       {
         // check the user's mailbox here
         return 250;
       }
       int cb_data(object mime, string sender, string recipient)
       {
         write(sprintf("smtpd: mailfrom=%s, to=%s, headers=%O\ndata=%s\n",
         sender, recipient, mime->headers, mime->getdata()));
         // check the data and deliver the mail here
         if(mime->body_parts)
         {
         {
           foreach(mime->body_parts, object mpart)
             write(sprintf("smtpd: mpart data = %O\n", mpart->getdata()));
         }
         return 250;
       }
       int main(int argc, array(string) argv)
       {
         Protocols.LMTP.Server(({ "ece.fr" }), 2500, "127.0.0.1",       cb_mailfrom, cb_rcptto, cb_data);
         return -1;
       }