inetmail.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:25k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * inetmail.h
  3.  *
  4.  * Internet Mail channel classes
  5.  * Simple Mail Transport Protocol & Post Office Protocol v3
  6.  *
  7.  * Portable Windows Library
  8.  *
  9.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  10.  *
  11.  * The contents of this file are subject to the Mozilla Public License
  12.  * Version 1.0 (the "License"); you may not use this file except in
  13.  * compliance with the License. You may obtain a copy of the License at
  14.  * http://www.mozilla.org/MPL/
  15.  *
  16.  * Software distributed under the License is distributed on an "AS IS"
  17.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  18.  * the License for the specific language governing rights and limitations
  19.  * under the License.
  20.  *
  21.  * The Original Code is Portable Windows Library.
  22.  *
  23.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  24.  *
  25.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  26.  * All Rights Reserved.
  27.  *
  28.  * Contributor(s): ______________________________________.
  29.  *
  30.  * $Log: inetmail.h,v $
  31.  * Revision 1.13  2000/06/21 01:01:21  robertj
  32.  * AIX port, thanks Wolfgang Platzer (wolfgang.platzer@infonova.at).
  33.  *
  34.  * Revision 1.12  2000/06/19 11:33:53  robertj
  35.  * Fixed incorrect comment documentation
  36.  *
  37.  * Revision 1.11  1999/03/09 08:01:46  robertj
  38.  * Changed comments for doc++ support (more to come).
  39.  *
  40.  * Revision 1.10  1999/02/16 08:07:10  robertj
  41.  * MSVC 6.0 compatibility changes.
  42.  *
  43.  * Revision 1.9  1998/11/30 02:50:51  robertj
  44.  * New directory structure
  45.  *
  46.  * Revision 1.8  1998/09/23 06:19:36  robertj
  47.  * Added open source copyright license.
  48.  *
  49.  * Revision 1.7  1996/12/21 01:24:15  robertj
  50.  * Added missing open message to pop server.
  51.  *
  52.  * Revision 1.6  1996/09/16 12:57:45  robertj
  53.  * Removed redundant functions.
  54.  *
  55.  * Revision 1.5  1996/09/14 13:17:59  robertj
  56.  * Renamed file and changed to be a protocol off new indirect channel to separate
  57.  *   the protocol from the low level byte transport channel.
  58.  *
  59.  * Revision 1.4  1996/07/27 04:14:49  robertj
  60.  * Redesign and reimplement of mail sockets.
  61.  *
  62.  * Revision 1.3  1996/06/28 13:16:32  robertj
  63.  * Changed SMTP incoming message handler so can tell when started, processing or ended message.
  64.  *
  65.  * Revision 1.2  1996/03/16 04:38:24  robertj
  66.  * Added ParseReponse() for splitting reponse line into code and info.
  67.  *
  68.  * Revision 1.1  1996/01/23 13:04:20  robertj
  69.  * Initial revision
  70.  *
  71.  * Revision 1.3  1995/06/17 11:12:15  robertj
  72.  * Documentation update.
  73.  *
  74.  * Revision 1.2  1995/06/17 00:39:53  robertj
  75.  * More implementation.
  76.  *
  77.  * Revision 1.1  1995/06/04 13:17:16  robertj
  78.  * Initial revision
  79.  *
  80.  */
  81. #ifndef _PMAILPROTOCOL
  82. #define _PMAILPROTOCOL
  83. #ifdef __GNUC__
  84. #pragma interface
  85. #endif
  86. #include <ptclib/inetprot.h>
  87. class PSocket;
  88. //////////////////////////////////////////////////////////////////////////////
  89. // PSMTP
  90. /** A TCP/IP socket for the Simple Mail Transfer Protocol.
  91.    When acting as a client, the procedure is to make the connection to a
  92.    remote server, then to send a message using the following procedure:
  93.       <PRE><CODE>
  94.       PSMTPClient mail("mailserver");
  95.       if (mail.IsOpen()) {
  96.         mail.BeginMessage("Me@here.com.au", "Fred@somwhere.com");
  97.         mail.Write(myMessage);
  98.         if (!mail.EndMessage())
  99.           PError << "Mail send failed." << endl;
  100.       }
  101.       else
  102.          PError << "Mail conection failed." << endl;
  103.       </PRE></CODE>
  104.     When acting as a server, a descendant class would be created to override
  105.     at least the <A>LookUpName()</A> and <A>HandleMessage()</A> functions.
  106.     Other functions may be overridden for further enhancement to the sockets
  107.     capabilities, but these two will give a basic SMTP server functionality.
  108.     The server socket thread would continuously call the
  109.     <A>ProcessMessage()</A> function until it returns FALSE. This will then
  110.     call the appropriate virtual function on parsing the SMTP protocol.
  111. */
  112. class PSMTP : public PInternetProtocol
  113. {
  114.   PCLASSINFO(PSMTP, PInternetProtocol)
  115.   public:
  116.   // New functions for class.
  117.     enum Commands {
  118.       HELO, EHLO, QUIT, HELP, NOOP,
  119.       TURN, RSET, VRFY, EXPN, RCPT,
  120.       MAIL, SEND, SAML, SOML, DATA,
  121.       NumCommands
  122.     };
  123.   protected:
  124.     PSMTP();
  125.     // Create a new SMTP protocol channel.
  126. };
  127. /** A TCP/IP socket for the Simple Mail Transfer Protocol.
  128.    When acting as a client, the procedure is to make the connection to a
  129.    remote server, then to send a message using the following procedure:
  130.       <PRE><CODE>
  131.       PSMTPSocket mail("mailserver");
  132.       if (mail.IsOpen()) {
  133.         mail.BeginMessage("Me@here.com.au", "Fred@somwhere.com");
  134.         mail.Write(myMessage);
  135.         if (!mail.EndMessage())
  136.           PError << "Mail send failed." << endl;
  137.       }
  138.       else
  139.          PError << "Mail conection failed." << endl;
  140.       </PRE></CODE>
  141. */
  142. class PSMTPClient : public PSMTP
  143. {
  144.   PCLASSINFO(PSMTPClient, PSMTP)
  145.   public:
  146.     /** Create a TCP/IP SMPTP protocol socket channel. The parameterless form
  147.        creates an unopened socket, the form with the <CODE>address</CODE>
  148.        parameter makes a connection to a remote system, opening the socket. The
  149.        form with the <CODE>socket</CODE> parameter opens the socket to an
  150.        incoming call from a "listening" socket.
  151.      */
  152.     PSMTPClient();
  153.     /** Destroy the channel object. This will close the channel and as a
  154.        client, QUIT from remote SMTP server.
  155.      */
  156.     ~PSMTPClient();
  157.   // Overrides from class PChannel.
  158.     /** Close the socket, and if connected as a client, QUITs from server.
  159.        @return
  160.        TRUE if the channel was closed and the QUIT accepted by the server.
  161.      */
  162.     virtual BOOL Close();
  163.   // New functions for class.
  164.     /** Begin transmission of a message using the SMTP socket as a client. This
  165.        negotiates with the remote server and establishes the protocol state
  166.        for data transmission. The usual Write() or stream commands may then
  167.        be used to transmit the data itself.
  168.        @return
  169.        TRUE if message was handled, FALSE if an error occurs.
  170.      */
  171.     BOOL BeginMessage(
  172.       const PString & from,        // User name of sender.
  173.       const PString & to,          // User name of recipient.
  174.       BOOL eightBitMIME = FALSE    // Mesage will be 8 bit MIME.
  175.     );
  176.     BOOL BeginMessage(
  177.       const PString & from,        // User name of sender.
  178.       const PStringList & toList,  // List of user names of recipients.
  179.       BOOL eightBitMIME = FALSE    // Mesage will be 8 bit MIME.
  180.     );
  181.     /** End transmission of a message using the SMTP socket as a client.
  182.        @return
  183.        TRUE if message was accepted by remote server, FALSE if an error occurs.
  184.      */
  185.     BOOL EndMessage();
  186.   protected:
  187.     BOOL OnOpen();
  188.     BOOL    haveHello;
  189.     BOOL    extendedHello;
  190.     BOOL    eightBitMIME;
  191.     PString fromAddress;
  192.     PStringList toNames;
  193.   private:
  194.     BOOL _BeginMessage();
  195. };
  196. /** A TCP/IP socket for the Simple Mail Transfer Protocol.
  197.    When acting as a client, the procedure is to make the connection to a
  198.    remote server, then to send a message using the following procedure:
  199.       <PRE><CODE>
  200.       PSMTPSocket mail("mailserver");
  201.       if (mail.IsOpen()) {
  202.         mail.BeginMessage("Me@here.com.au", "Fred@somwhere.com");
  203.         mail.Write(myMessage);
  204.         if (!mail.EndMessage())
  205.           PError << "Mail send failed." << endl;
  206.       }
  207.       else
  208.          PError << "Mail conection failed." << endl;
  209.       </PRE></CODE>
  210.     When acting as a server, a descendant class would be created to override
  211.     at least the <A>LookUpName()</A> and <A>HandleMessage()</A> functions.
  212.     Other functions may be overridden for further enhancement to the sockets
  213.     capabilities, but these two will give a basic SMTP server functionality.
  214.     The server socket thread would continuously call the
  215.     <A>ProcessMessage()</A> function until it returns FALSE. This will then
  216.     call the appropriate virtual function on parsing the SMTP protocol.
  217. */
  218. class PSMTPServer : public PSMTP
  219. {
  220.   PCLASSINFO(PSMTPServer, PSMTP)
  221.   public:
  222.     /** Create a TCP/IP SMPTP protocol socket channel. The parameterless form
  223.        creates an unopened socket, the form with the <CODE>address</CODE>
  224.        parameter makes a connection to a remote system, opening the socket. The
  225.        form with the <CODE>socket</CODE> parameter opens the socket to an
  226.        incoming call from a "listening" socket.
  227.      */
  228.     PSMTPServer();
  229.   // New functions for class.
  230.     /** Process commands, dispatching to the appropriate virtual function. This
  231.        is used when the socket is acting as a server.
  232.        @return
  233.        TRUE if more processing may be done, FALSE if the QUIT command was
  234.        received or the <A>OnUnknown()</A> function returns FALSE.
  235.      */
  236.     BOOL ProcessCommand();
  237.     void ServerReset();
  238.     // Reset the state of the SMTP server socket.
  239.     enum ForwardResult {
  240.       LocalDomain,    // User may be on local machine, do LookUpName().
  241.       WillForward,    // User may be forwarded to another SMTP host.
  242.       CannotForward   // User cannot be forwarded.
  243.     };
  244.     // Result of forward check
  245.     /** Determine if a user for this domain may be on the local system, or
  246.        should be forwarded.
  247.        @return
  248.        Result of forward check operation.
  249.      */
  250.     virtual ForwardResult ForwardDomain(
  251.       PCaselessString & userDomain,       // Domain for user
  252.       PCaselessString & forwardDomainList // Domains forwarding to
  253.     );
  254.     enum LookUpResult {
  255.       ValidUser,      // User name was valid and unique.
  256.       AmbiguousUser,  // User name was valid but ambiguous.
  257.       UnknownUser,    // User name was invalid.
  258.       LookUpError     // Some other error occurred in look up.
  259.     };
  260.     // Result of user name look up
  261.     /** Look up a name in the context of the SMTP server.
  262.        The default bahaviour simply returns FALSE.
  263.        @return
  264.        Result of name look up operation.
  265.      */
  266.     virtual LookUpResult LookUpName(
  267.       const PCaselessString & name,    // Name to look up.
  268.       PString & expandedName           // Expanded form of name (if found).
  269.     );
  270.     /** Handle a received message. The <CODE>buffer</CODE> parameter contains
  271.        the partial or complete message received, depending on the
  272.        <CODE>completed</CODE> parameter.
  273.        The default behaviour is to simply return FALSE;
  274.        @return
  275.        TRUE if message was handled, FALSE if an error occurs.
  276.      */
  277.     virtual BOOL HandleMessage(
  278.       PCharArray & buffer,  // Buffer containing message data received.
  279.       BOOL starting,        // This is the first call for the message.
  280.       BOOL completed        // This is the last call for the message.
  281.       // Indication that the entire message has been received.
  282.     );
  283.   protected:
  284.     BOOL OnOpen();
  285.     virtual void OnHELO(
  286.       const PCaselessString & remoteHost  // Name of remote host.
  287.     );
  288.     // Start connection.
  289.     virtual void OnEHLO(
  290.       const PCaselessString & remoteHost  // Name of remote host.
  291.     );
  292.     // Start extended SMTP connection.
  293.     virtual void OnQUIT();
  294.     // close connection and die.
  295.     virtual void OnHELP();
  296.     // get help.
  297.     virtual void OnNOOP();
  298.     // do nothing
  299.     
  300.     virtual void OnTURN();
  301.     // switch places
  302.     
  303.     virtual void OnRSET();
  304.     // Reset state.
  305.     virtual void OnVRFY(
  306.       const PCaselessString & name    // Name to verify.
  307.     );
  308.     // Verify address.
  309.     virtual void OnEXPN(
  310.       const PCaselessString & name    // Name to expand.
  311.     );
  312.     // Expand alias.
  313.     virtual void OnRCPT(
  314.       const PCaselessString & recipient   // Name of recipient.
  315.     );
  316.     // Designate recipient
  317.     virtual void OnMAIL(
  318.       const PCaselessString & sender  // Name of sender.
  319.     );
  320.     // Designate sender
  321.     
  322.     virtual void OnSEND(
  323.       const PCaselessString & sender  // Name of sender.
  324.     );
  325.     // send message to screen
  326.     virtual void OnSAML(
  327.       const PCaselessString & sender  // Name of sender.
  328.     );
  329.     // send AND mail
  330.     
  331.     virtual void OnSOML(
  332.       const PCaselessString & sender  // Name of sender.
  333.     );
  334.     // send OR mail
  335.     virtual void OnDATA();
  336.     // Message text.
  337.     /** Handle an unknown command.
  338.        @return
  339.        TRUE if more processing may be done, FALSE if the
  340.        <A>ProcessCommand()</A> function is to return FALSE.
  341.      */
  342.     virtual BOOL OnUnknown(
  343.       const PCaselessString & command  // Complete command line received.
  344.     );
  345.     virtual void OnSendMail(
  346.       const PCaselessString & sender  // Name of sender.
  347.     );
  348.     // Common code for OnMAIL(), OnSEND(), OnSOML() and OnSAML() funtions.
  349.     /** Read a standard text message that is being received by the socket. The
  350.        text message is terminated by a line with a '.' character alone.
  351.        The default behaviour is to read the data into the <CODE>buffer</CODE>
  352.        parameter until either the end of the message or when the
  353.        <CODE>messageBufferSize</CODE> bytes have been read.
  354.        @return
  355.        TRUE if partial message received, FALSE if the end of the data was
  356.        received.
  357.      */
  358.     virtual BOOL OnTextData(PCharArray & buffer, BOOL & completed);
  359.     /** Read an eight bit MIME message that is being received by the socket. The
  360.        MIME message is terminated by the CR/LF/./CR/LF sequence.
  361.        The default behaviour is to read the data into the <CODE>buffer</CODE>
  362.        parameter until either the end of the message or when the
  363.        <CODE>messageBufferSize</CODE> bytes have been read.
  364.        @return
  365.        TRUE if partial message received, FALSE if the end of the data was
  366.        received.
  367.      */
  368.     virtual BOOL OnMIMEData(PCharArray & buffer, BOOL & completed);
  369.   // Member variables
  370.     BOOL        extendedHello;
  371.     BOOL        eightBitMIME;
  372.     PString     fromAddress;
  373.     PString     fromPath;
  374.     PStringList toNames;
  375.     PStringList toDomains;
  376.     PINDEX      messageBufferSize;
  377.     enum { WasMAIL, WasSEND, WasSAML, WasSOML } sendCommand;
  378.     StuffState  endMIMEDetectState;
  379. };
  380. //////////////////////////////////////////////////////////////////////////////
  381. // PPOP3
  382. /** A TCP/IP socket for the Post Office Protocol version 3.
  383.    When acting as a client, the procedure is to make the connection to a
  384.    remote server, then to retrieve a message using the following procedure:
  385.       <PRE><CODE>
  386.       PPOP3Client mail("popserver");
  387.       if (mail.IsOpen()) {
  388.         if (mail.LogIn("Me", "password")) {
  389.           if (mail.GetMessageCount() > 0) {
  390.             PUnsignedArray sizes = mail.GetMessageSizes();
  391.             for (PINDEX i = 0; i < sizes.GetSize(); i++) {
  392.               if (mail.BeginMessage(i+1))
  393.                 mail.Read(myMessage, sizes[i]);
  394.               else
  395.                 PError << "Error getting mail message." << endl;
  396.             }
  397.           }
  398.           else
  399.             PError << "No mail messages." << endl;
  400.         }
  401.         else
  402.            PError << "Mail log in failed." << endl;
  403.       }
  404.       else
  405.          PError << "Mail conection failed." << endl;
  406.       </PRE></CODE>
  407.     When acting as a server, a descendant class would be created to override
  408.     at least the <A>HandleOpenMailbox()</A>, <A>HandleSendMessage()</A> and
  409.     <A>HandleDeleteMessage()</A> functions. Other functions may be overridden
  410.     for further enhancement to the sockets capabilities, but these will give a
  411.     basic POP3 server functionality.
  412.     The server socket thread would continuously call the
  413.     <A>ProcessMessage()</A> function until it returns FALSE. This will then
  414.     call the appropriate virtual function on parsing the POP3 protocol.
  415.  */
  416. class PPOP3 : public PInternetProtocol
  417. {
  418.   PCLASSINFO(PPOP3, PInternetProtocol)
  419.   public:
  420.     enum Commands {
  421.       USER, PASS, QUIT, RSET, NOOP, STATcmd,
  422.       LIST, RETR, DELE, APOP, TOP,  UIDL,
  423.       NumCommands
  424.     };
  425.   protected:
  426.     PPOP3();
  427.     /** Parse a response line string into a response code and any extra info
  428.        on the line. Results are placed into the member variables
  429.        <CODE>lastResponseCode</CODE> and <CODE>lastResponseInfo</CODE>.
  430.        The default bahaviour looks for a space or a '-' and splits the code
  431.        and info either side of that character, then returns FALSE.
  432.        @return
  433.        Position of continuation character in response, 0 if no continuation
  434.        lines are possible.
  435.      */
  436.     virtual PINDEX ParseResponse(
  437.       const PString & line // Input response line to be parsed
  438.     );
  439.   // Member variables
  440.     static PString okResponse;
  441.     static PString errResponse;
  442. };
  443. /** A TCP/IP socket for the Post Office Protocol version 3.
  444.    When acting as a client, the procedure is to make the connection to a
  445.    remote server, then to retrieve a message using the following procedure:
  446.       <PRE><CODE>
  447.       PPOP3Client mail;
  448.       if (mail.Connect("popserver")) {
  449.         if (mail.LogIn("Me", "password")) {
  450.           if (mail.GetMessageCount() > 0) {
  451.             PUnsignedArray sizes = mail.GetMessageSizes();
  452.             for (PINDEX i = 0; i < sizes.GetSize(); i++) {
  453.               if (mail.BeginMessage(i+1))
  454.                 mail.Read(myMessage, sizes[i]);
  455.               else
  456.                 PError << "Error getting mail message." << endl;
  457.             }
  458.           }
  459.           else
  460.             PError << "No mail messages." << endl;
  461.         }
  462.         else
  463.            PError << "Mail log in failed." << endl;
  464.       }
  465.       else
  466.          PError << "Mail conection failed." << endl;
  467.       </PRE></CODE>
  468.  */
  469. class PPOP3Client : public PPOP3
  470. {
  471.   PCLASSINFO(PPOP3Client, PPOP3)
  472.   public:
  473.     /** Create a TCP/IP POP3 protocol socket channel. The parameterless form
  474.        creates an unopened socket, the form with the <CODE>address</CODE>
  475.        parameter makes a connection to a remote system, opening the socket. The
  476.        form with the <CODE>socket</CODE> parameter opens the socket to an
  477.        incoming call from a "listening" socket.
  478.      */
  479.     PPOP3Client();
  480.     /** Destroy the channel object. This will close the channel and as a
  481.        client, QUIT from remote POP3 server.
  482.      */
  483.     ~PPOP3Client();
  484.   // Overrides from class PChannel.
  485.     /** Close the socket, and if connected as a client, QUITs from server.
  486.        @return
  487.        TRUE if the channel was closed and the QUIT accepted by the server.
  488.      */
  489.     virtual BOOL Close();
  490.   // New functions for class.
  491.     /** Log into the POP server using the mailbox and access codes specified.
  492.        @return
  493.        TRUE if logged in.
  494.      */
  495.     BOOL LogIn(
  496.       const PString & username,   // User name on remote system.
  497.       const PString & password    // Password for user name.
  498.     );
  499.     /** Get a count of the number of messages in the mail box.
  500.        @return
  501.        Number of messages in mailbox or -1 if an error occurred.
  502.      */
  503.     int GetMessageCount();
  504.     /** Get an array of a integers representing the sizes of each of the
  505.        messages in the mail box.
  506.        @return
  507.        Array of integers representing the size of each message.
  508.      */
  509.     PUnsignedArray GetMessageSizes();
  510.     /** Get an array of a strings representing the standard internet message
  511.        headers of each of the messages in the mail box.
  512.        Note that the remote server may not support this function, in which
  513.        case an empty array will be returned.
  514.        @return
  515.        Array of strings continaing message headers.
  516.      */
  517.     PStringArray GetMessageHeaders();
  518.     /* Begin the retrieval of an entire message. The application may then use
  519.        the <A>PApplicationSocket::ReadLine()</A> function with the
  520.        <CODE>unstuffLine</CODE> parameter set to TRUE. Repeated calls until
  521.        its return valus is FALSE will read the message headers and body.
  522.        @return
  523.        Array of strings continaing message headers.
  524.      */
  525.     BOOL BeginMessage(
  526.       PINDEX messageNumber
  527.         /** Number of message to retrieve. This is an integer from 1 to the
  528.            maximum number of messages available.
  529.          */
  530.     );
  531.     /** Delete the message specified from the mail box.
  532.        @return
  533.        Array of strings continaing message headers.
  534.      */
  535.     BOOL DeleteMessage(
  536.       PINDEX messageNumber
  537.         /* Number of message to retrieve. This is an integer from 1 to the
  538.            maximum number of messages available.
  539.          */
  540.     );
  541.   protected:
  542.     BOOL OnOpen();
  543.   // Member variables
  544.     BOOL loggedIn;
  545. };
  546. /** A TCP/IP socket for the Post Office Protocol version 3.
  547.     When acting as a server, a descendant class would be created to override
  548.     at least the <A>HandleOpenMailbox()</A>, <A>HandleSendMessage()</A> and
  549.     <A>HandleDeleteMessage()</A> functions. Other functions may be overridden
  550.     for further enhancement to the sockets capabilities, but these will give a
  551.     basic POP3 server functionality.
  552.     The server socket thread would continuously call the
  553.     <A>ProcessMessage()</A> function until it returns FALSE. This will then
  554.     call the appropriate virtual function on parsing the POP3 protocol.
  555.  */
  556. class PPOP3Server : public PPOP3
  557. {
  558.   PCLASSINFO(PPOP3Server, PPOP3)
  559.   public:
  560.     /** Create a TCP/IP POP3 protocol socket channel. The parameterless form
  561.        creates an unopened socket, the form with the <CODE>address</CODE>
  562.        parameter makes a connection to a remote system, opening the socket. The
  563.        form with the <CODE>socket</CODE> parameter opens the socket to an
  564.        incoming call from a "listening" socket.
  565.      */
  566.     PPOP3Server();
  567.   // New functions for class.
  568.     /** Process commands, dispatching to the appropriate virtual function. This
  569.        is used when the socket is acting as a server.
  570.        @return
  571.        TRUE if more processing may be done, FALSE if the QUIT command was
  572.        received or the <A>OnUnknown()</A> function returns FALSE.
  573.      */
  574.     BOOL ProcessCommand();
  575.     /** Log the specified user into the mail system and return sizes of each
  576.        message in mail box.
  577.        The user override of this function is expected to populate the protected
  578.        member fields <CODE>messageSizes</CODE> and <CODE>messageIDs</CODE>.
  579.        @return
  580.        TRUE if user and password were valid.
  581.      */
  582.     virtual BOOL HandleOpenMailbox(
  583.       const PString & username,  // User name for mail box
  584.       const PString & password   // Password for user name
  585.     );
  586.     /** Handle the sending of the specified message to the remote client. The
  587.        data written to the socket will automatically have the '.' character
  588.        stuffing enabled.
  589.        @return
  590.        TRUE if successfully sent message.
  591.      */
  592.     virtual void HandleSendMessage(
  593.       PINDEX messageNumber, // Number of message to send.
  594.       const PString & id,   // Unique id of message to send.
  595.       PINDEX lines          // Nuumber of lines in body of message to send.
  596.     );
  597.     
  598.     /** Handle the deleting of the specified message from the mail box. This is
  599.        called when the OnQUIT command is called for each message that was
  600.        deleted using the DELE command.
  601.        @return
  602.        TRUE if successfully sent message.
  603.      */
  604.     virtual void HandleDeleteMessage(
  605.       PINDEX messageNumber, // Number of message to send.
  606.       const PString & id    // Unique id of message to send.
  607.     );
  608.     
  609.   protected:
  610.     BOOL OnOpen();
  611.     virtual void OnUSER(
  612.       const PString & name  // Name of user.
  613.     );
  614.     // Specify user name (mailbox).
  615.     virtual void OnPASS(
  616.       const PString & passwd  // Password for account.
  617.     );
  618.     // Specify password and log user in.
  619.     virtual void OnQUIT();
  620.     // End connection, saving all changes (delete messages).
  621.     virtual void OnRSET();
  622.     // Reset connection (undelete messages).
  623.     virtual void OnNOOP();
  624.     // Do nothing.
  625.     virtual void OnSTAT();
  626.     // Get number of messages in mailbox.
  627.     /** Get the size of a message in mailbox. If <CODE>msg</CODE> is 0 then get
  628.        sizes of all messages in mailbox.
  629.      */
  630.     virtual void OnLIST(
  631.       PINDEX msg  // Number of message.
  632.     );
  633.     virtual void OnRETR(
  634.       PINDEX msg  // Number of message.
  635.     );
  636.     // Retrieve a message from mailbox.
  637.     virtual void OnDELE(
  638.       PINDEX msg  // Number of message.
  639.     );
  640.     // Delete a message from mailbox.
  641.     virtual void OnTOP(
  642.       PINDEX msg,  // Number of message.
  643.       PINDEX count // Count of messages
  644.     );
  645.     // Get the message header and top <CODE>count</CODE> lines of message.
  646.     /** Get unique ID for message in mailbox. If <CODE>msg</CODE> is 0 then get
  647.        all IDs for all messages in mailbox.
  648.      */
  649.     virtual void OnUIDL(
  650.       PINDEX msg  // Number of message.
  651.     );
  652.     /** Handle an unknown command.
  653.        @return
  654.        TRUE if more processing may be done, FALSE if the
  655.        <A>ProcessCommand()</A> function is to return FALSE.
  656.      */
  657.     virtual BOOL OnUnknown(
  658.       const PCaselessString & command  // Complete command line received.
  659.     );
  660.   // Member variables
  661.     PString        username;
  662.     PUnsignedArray messageSizes;
  663.     PStringArray   messageIDs;
  664.     PBYTEArray     messageDeletions;
  665. };
  666. #endif  // _PMAILPROTOCOL
  667. // End Of File ///////////////////////////////////////////////////////////////