home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 2 BBS / 02-BBS.zip / lora299s.zip / INETMAIL.CPP < prev    next >
C/C++ Source or Header  |  1998-05-12  |  23KB  |  661 lines

  1.  
  2. // LoraBBS Version 2.99 Free Edition
  3. // Copyright (C) 1987-98 Marco Maccaferri
  4. //
  5. // This program is free software; you can redistribute it and/or modify
  6. // it under the terms of the GNU General Public License as published by
  7. // the Free Software Foundation; either version 2 of the License, or
  8. // (at your option) any later version.
  9. //
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. // GNU General Public License for more details.
  14. //
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program; if not, write to the Free Software
  17. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  
  19. #include "_ldefs.h"
  20. #include "msgbase.h"
  21.  
  22. static PSZ MONTHS[] = {
  23.    "January", "February", "March", "April", "May", "Juni",
  24.    "July", "August", "September", "October", "November", "December"
  25. };
  26.  
  27. INETMAIL::INETMAIL (void)
  28. {
  29.    Tcp = new TTcpip;
  30.    TotalMsgs = 0L;
  31.    LastReaded = 0L;
  32.    strcpy (HostName, "unknown.host");
  33. }
  34.  
  35. INETMAIL::INETMAIL (PSZ pszServer, PSZ pszUser, PSZ pszPwd)
  36. {
  37.    Tcp = new TTcpip;
  38.    TotalMsgs = 0L;
  39.    LastReaded = 0L;
  40.    strcpy (HostName, "unknown.host");
  41.  
  42.    Open (pszServer, pszUser, pszPwd);
  43. }
  44.  
  45. INETMAIL::~INETMAIL (void)
  46. {
  47.    if (Tcp != NULL)
  48.       delete Tcp;
  49. }
  50.  
  51. USHORT INETMAIL::Add (VOID)
  52. {
  53.    return (Add (Text));
  54. }
  55.  
  56. USHORT INETMAIL::Add (class TMsgBase *MsgBase)
  57. {
  58.    New ();
  59.  
  60.    strcpy (From, MsgBase->From);
  61.    strcpy (To, MsgBase->To);
  62.    strcpy (Subject, MsgBase->Subject);
  63.  
  64.    strcpy (FromAddress, MsgBase->FromAddress);
  65.    strcpy (ToAddress, MsgBase->ToAddress);
  66.  
  67.    Written.Day = MsgBase->Written.Day;
  68.    Written.Month = MsgBase->Written.Month;
  69.    Written.Year = MsgBase->Written.Year;
  70.    Written.Hour = MsgBase->Written.Hour;
  71.    Written.Minute = MsgBase->Written.Minute;
  72.    Written.Second = MsgBase->Written.Second;
  73.  
  74.    Arrived.Day = MsgBase->Arrived.Day;
  75.    Arrived.Month = MsgBase->Arrived.Month;
  76.    Arrived.Year = MsgBase->Arrived.Year;
  77.    Arrived.Hour = MsgBase->Arrived.Hour;
  78.    Arrived.Minute = MsgBase->Arrived.Minute;
  79.    Arrived.Second = MsgBase->Arrived.Second;
  80.  
  81.    Crash = MsgBase->Crash;
  82.    Direct = MsgBase->Direct;
  83.    FileAttach = MsgBase->FileAttach;
  84.    FileRequest = MsgBase->FileRequest;
  85.    Hold = MsgBase->Hold;
  86.    Immediate = MsgBase->Immediate;
  87.    Intransit = MsgBase->Intransit;
  88.    KillSent = MsgBase->KillSent;
  89.    Local = MsgBase->Local;
  90.    Private = MsgBase->Private;
  91.    ReceiptRequest = MsgBase->ReceiptRequest;
  92.    Received = MsgBase->Received;
  93.    Sent = MsgBase->Sent;
  94.  
  95.    return (Add (MsgBase->Text));
  96. }
  97.  
  98. /*
  99. USHORT INETMAIL::Add (class TCollection &MsgText)
  100. {
  101.    FILE *fp;
  102.    USHORT RetVal = FALSE;
  103.    USHORT GotFrom, GotSubject, GotTo;
  104.    CHAR szBuffer[128], *pszText;
  105.  
  106.    GotFrom = GotSubject = GotTo = FALSE;
  107.  
  108.    if ((fp = fopen ("outmail.log", "ab")) != NULL) {
  109.             fprintf (fp, "HELO %s\r\n", HostName);
  110.  
  111.             if (strchr (From, '@') != NULL)
  112.                fprintf (fp, "MAIL FROM:<%s>\r\n", From);
  113.             else
  114.                fprintf (fp, "MAIL FROM:<%s>\r\n", FromAddress);
  115.                if (strchr (To, '@') != NULL)
  116.                   fprintf (fp, "RCPT TO:<%s>\r\n", To);
  117.                else
  118.                   fprintf (fp, "RCPT TO:<%s>\r\n", ToAddress);
  119.                   fprintf (fp, "DATA\r\n");
  120.                      if ((pszText = (CHAR *)MsgText.First ()) != NULL)
  121.                         do {
  122.                            if (!strncmp (pszText, "\001From: ", 7)) {
  123.                               fprintf (fp, "%s\r\n", &pszText[1]);
  124.                               GotFrom = TRUE;
  125.                            }
  126.                            else if (!strncmp (pszText, "\001To: ", 5)) {
  127.                               fprintf (fp, "%s\r\n", &pszText[1]);
  128.                               GotTo = TRUE;
  129.                            }
  130.                            else if (!strncmp (pszText, "\001Subject: ", 10)) {
  131.                               fprintf (fp, "%s\r\n", &pszText[1]);
  132.                               GotSubject = TRUE;
  133.                            }
  134.                            else if (!strncmp (pszText, "\001X-Mailreader: ", 15)) {
  135.                               fprintf (fp, "%s\r\n", &pszText[1]);
  136.                            }
  137.                            else if (!strncmp (pszText, "\001In-Reply-To: ", 14)) {
  138.                               fprintf (fp, "%s\r\n", &pszText[1]);
  139.                            }
  140.                            else if (!strncmp (pszText, "\001Sender: ", 9)) {
  141.                               fprintf (fp, "%s\r\n", &pszText[1]);
  142.                            }
  143.                         } while ((pszText = (CHAR *)MsgText.Next ()) != NULL);
  144.  
  145.                      if (GotFrom == FALSE) {
  146.                         if (strchr (From, '@') != NULL)
  147.                            fprintf (fp, "From: %s\r\n", From);
  148.                         else
  149.                            fprintf (fp, "From: %s <%s>\r\n", From, FromAddress);
  150.                      }
  151.                      if (GotTo == FALSE) {
  152.                         if (strchr (To, '@') != NULL)
  153.                            fprintf (fp, "To: %s\r\n", To);
  154.                         else
  155.                            fprintf (fp, "To: %s <%s>\r\n", To, ToAddress);
  156.                      }
  157.                      if (GotSubject == FALSE) {
  158.                         fprintf (fp, "Subject: %s\r\n", Subject);
  159.                      }
  160.                      fprintf (fp, "Date: %d %3.3s %d %02d:%02d:%02d GMT\r\n", Written.Day, MONTHS[Written.Month - 1], Written.Year, Written.Hour, Written.Minute, Written.Second);
  161.  
  162.                      fprintf (fp, "\r\n");
  163.  
  164.                      if ((pszText = (CHAR *)MsgText.First ()) != NULL)
  165.                         do {
  166.                            if (*pszText != 0x01 && strncmp (pszText, "SEEN-BY:", 8)) {
  167.                               if (!strcmp (pszText, "."))
  168.                                  fprintf (fp, "..\r\n");
  169.                               else
  170.                                  fprintf (fp, "%s\r\n", pszText);
  171.                            }
  172.                         } while ((pszText = (CHAR *)MsgText.Next ()) != NULL);
  173.  
  174.                      fprintf (fp, ".\r\n");
  175.  
  176.                         RetVal = TRUE;
  177.  
  178.             fprintf (fp, "QUIT\r\n");
  179.  
  180.       fclose (fp);
  181.    }
  182.  
  183.    return (RetVal);
  184. }
  185. */
  186.  
  187. USHORT INETMAIL::Add (class TCollection &MsgText)
  188. {
  189.    USHORT RetVal = FALSE;
  190.    USHORT GotFrom, GotSubject, GotTo;
  191.    CHAR szBuffer[128], *pszText;
  192.    class TTcpip *OldTcp = Tcp;
  193.  
  194.    GotFrom = GotSubject = GotTo = FALSE;
  195.  
  196.    if ((Tcp = new TTcpip) != NULL) {
  197.       if (Tcp->ConnectServer (SMTPHostName, 25) == TRUE) {
  198.          if (GetResponse (szBuffer, (USHORT)(sizeof (szBuffer) - 1)) == 220) {
  199.             sprintf (szBuffer, "HELO %s\r\n", HostName);
  200.             Tcp->SendBytes ((UCHAR *)szBuffer, (USHORT)strlen (szBuffer));
  201.             GetResponse (szBuffer, (USHORT)(sizeof (szBuffer) - 1));
  202.  
  203.             if (strchr (From, '@') != NULL)
  204.                sprintf (szBuffer, "MAIL FROM:<%s>\r\n", From);
  205.             else
  206.                sprintf (szBuffer, "MAIL FROM:<%s>\r\n", FromAddress);
  207.             Tcp->SendBytes ((UCHAR *)szBuffer, (USHORT)strlen (szBuffer));
  208.             if (GetResponse (szBuffer, (USHORT)(sizeof (szBuffer) - 1)) == 250) {
  209.                if (strchr (To, '@') != NULL)
  210.                   sprintf (szBuffer, "RCPT TO:<%s>\r\n", To);
  211.                else
  212.                   sprintf (szBuffer, "RCPT TO:<%s>\r\n", ToAddress);
  213.                Tcp->SendBytes ((UCHAR *)szBuffer, (USHORT)strlen (szBuffer));
  214.                if (GetResponse (szBuffer, (USHORT)(sizeof (szBuffer) - 1)) == 250) {
  215.                   sprintf (szBuffer, "DATA\r\n");
  216.                   Tcp->SendBytes ((UCHAR *)szBuffer, (USHORT)strlen (szBuffer));
  217.                   if (GetResponse (szBuffer, (USHORT)(sizeof (szBuffer) - 1)) == 354) {
  218.                      if ((pszText = (CHAR *)MsgText.First ()) != NULL)
  219.                         do {
  220.                            if (!strncmp (pszText, "\001From: ", 7)) {
  221.                               Tcp->BufferBytes ((UCHAR *)&pszText[1], (USHORT)(strlen (pszText) - 1));
  222.                               Tcp->BufferBytes ((UCHAR *)"\r\n", 2);
  223.                               GotFrom = TRUE;
  224.                            }
  225.                            else if (!strncmp (pszText, "\001To: ", 5)) {
  226.                               Tcp->BufferBytes ((UCHAR *)&pszText[1], (USHORT)(strlen (pszText) - 1));
  227.                               Tcp->BufferBytes ((UCHAR *)"\r\n", 2);
  228.                               GotTo = TRUE;
  229.                            }
  230.                            else if (!strncmp (pszText, "\001Subject: ", 10)) {
  231.                               Tcp->BufferBytes ((UCHAR *)&pszText[1], (USHORT)(strlen (pszText) - 1));
  232.                               Tcp->BufferBytes ((UCHAR *)"\r\n", 2);
  233.                               GotSubject = TRUE;
  234.                            }
  235.                            else if (!strncmp (pszText, "\001X-Mailreader: ", 15)) {
  236.                               Tcp->BufferBytes ((UCHAR *)&pszText[1], (USHORT)(strlen (pszText) - 1));
  237.                               Tcp->BufferBytes ((UCHAR *)"\r\n", 2);
  238.                            }
  239.                            else if (!strncmp (pszText, "\001In-Reply-To: ", 14)) {
  240.                               Tcp->BufferBytes ((UCHAR *)&pszText[1], (USHORT)(strlen (pszText) - 1));
  241.                               Tcp->BufferBytes ((UCHAR *)"\r\n", 2);
  242.                            }
  243.                            else if (!strncmp (pszText, "\001Sender: ", 9)) {
  244.                               Tcp->BufferBytes ((UCHAR *)&pszText[1], (USHORT)(strlen (pszText) - 1));
  245.                               Tcp->BufferBytes ((UCHAR *)"\r\n", 2);
  246.                            }
  247.                         } while ((pszText = (CHAR *)MsgText.Next ()) != NULL);
  248.  
  249.                      if (GotFrom == FALSE) {
  250.                         if (strchr (From, '@') != NULL)
  251.                            sprintf (szBuffer, "From: %s\r\n", From);
  252.                         else
  253.                            sprintf (szBuffer, "From: %s <%s>\r\n", From, FromAddress);
  254.                         Tcp->BufferBytes ((UCHAR *)szBuffer, (USHORT)strlen (szBuffer));
  255.                      }
  256.                      if (GotTo == FALSE) {
  257.                         if (strchr (To, '@') != NULL)
  258.                            sprintf (szBuffer, "To: %s\r\n", To);
  259.                         else
  260.                            sprintf (szBuffer, "To: %s <%s>\r\n", To, ToAddress);
  261.                         Tcp->BufferBytes ((UCHAR *)szBuffer, (USHORT)strlen (szBuffer));
  262.                      }
  263.                      if (GotSubject == FALSE) {
  264.                         sprintf (szBuffer, "Subject: %s\r\n", Subject);
  265.                         Tcp->BufferBytes ((UCHAR *)szBuffer, (USHORT)strlen (szBuffer));
  266.                      }
  267.                      sprintf (szBuffer, "Date: %d %3.3s %d %02d:%02d:%02d GMT\r\n", Written.Day, MONTHS[Written.Month - 1], Written.Year, Written.Hour, Written.Minute, Written.Second);
  268.                      Tcp->BufferBytes ((UCHAR *)szBuffer, (USHORT)strlen (szBuffer));
  269.  
  270.                      Tcp->BufferBytes ((UCHAR *)"\r\n", 2);
  271.  
  272.                      if ((pszText = (CHAR *)MsgText.First ()) != NULL)
  273.                         do {
  274.                            if (*pszText != 0x01 && strncmp (pszText, "SEEN-BY:", 8)) {
  275.                               if (!strcmp (pszText, "."))
  276.                                  Tcp->BufferBytes ((UCHAR *)"..", 2);
  277.                               else
  278.                                  Tcp->BufferBytes ((UCHAR *)pszText, (USHORT)strlen (pszText));
  279.                               Tcp->BufferBytes ((UCHAR *)"\r\n", 2);
  280.                            }
  281.                         } while ((pszText = (CHAR *)MsgText.Next ()) != NULL);
  282.  
  283.                      sprintf (szBuffer, ".\r\n");
  284.                      Tcp->BufferBytes ((UCHAR *)szBuffer, (USHORT)strlen (szBuffer));
  285.                      Tcp->UnbufferBytes ();
  286.  
  287.                      if (GetResponse (szBuffer, (USHORT)(sizeof (szBuffer) - 1)) == 250)
  288.                         RetVal = TRUE;
  289.                   }
  290.                }
  291.             }
  292.  
  293.             sprintf (szBuffer, "QUIT\r\n");
  294.             Tcp->SendBytes ((UCHAR *)szBuffer, (USHORT)strlen (szBuffer));
  295.             GetResponse (szBuffer, (USHORT)(sizeof (szBuffer) - 1));
  296.          }
  297.       }
  298.       delete Tcp;
  299.    }
  300.    Tcp = OldTcp;
  301.  
  302.    return (RetVal);
  303. }
  304.  
  305. VOID INETMAIL::Close (VOID)
  306. {
  307.    CHAR String[50];
  308.  
  309.    Tcp->SendBytes ((UCHAR *)"QUIT\r\n", 6);
  310.    GetResponse (String, (USHORT)(sizeof (String) - 1));
  311.    TotalMsgs = 0L;
  312. }
  313.  
  314. USHORT INETMAIL::Delete (ULONG ulMsg)
  315. {
  316.    CHAR String[50];
  317.  
  318.    sprintf (String, "DELE %lu\r\n", ulMsg);
  319.    Tcp->SendBytes ((UCHAR *)String, (USHORT)strlen (String));
  320.    return (GetResponse (String, (USHORT)(sizeof (String) - 1)));
  321. }
  322.  
  323. USHORT INETMAIL::GetHWM (ULONG &ulMsg)
  324. {
  325.    ulMsg = 0L;
  326.  
  327.    return (FALSE);
  328. }
  329.  
  330. USHORT INETMAIL::GetResponse (PSZ pszResponse, USHORT usMaxLen)
  331. {
  332.    USHORT retVal = FALSE, len = 0;
  333.    CHAR c, *pszResp;
  334.  
  335. loop:
  336.    pszResp = pszResponse;
  337.  
  338.    do {
  339.       c = '\0';
  340.       if (Tcp->BytesReady () == TRUE) {
  341.          if ((c = (CHAR)Tcp->ReadByte ()) != '\r') {
  342.             if (c != '\n') {
  343.                *pszResp++ = c;
  344.                if (++len >= usMaxLen)
  345.                   c = '\r';
  346.             }
  347.          }
  348.       }
  349.    } while (c != '\r' && Tcp->Carrier () == TRUE);
  350.  
  351.    *pszResp = '\0';
  352.    if (pszResponse[0] == '+')
  353.       retVal = TRUE;
  354.    else if (pszResponse[0] == '-')
  355.       retVal = FALSE;
  356.    else if (pszResponse[3] == ' ')
  357.       retVal = (USHORT)atoi (pszResponse);
  358.    else
  359.       goto loop;
  360.  
  361.    return (retVal);
  362. }
  363.  
  364. USHORT INETMAIL::GetLine (PSZ pszResponse, USHORT usMaxLen)
  365. {
  366.    USHORT retVal = FALSE, len = 0;
  367.    CHAR c, *pszResp;
  368.  
  369.    pszResp = pszResponse;
  370.  
  371.    do {
  372.       c = '\0';
  373.       if (Tcp->BytesReady () == TRUE) {
  374.          if ((c = (CHAR)Tcp->ReadByte ()) != '\r') {
  375.             if (c != '\n') {
  376.                *pszResp++ = c;
  377.                if (++len >= usMaxLen)
  378.                   c = '\r';
  379.             }
  380.          }
  381.       }
  382.    } while (c != '\r' && Tcp->Carrier () == TRUE);
  383.  
  384.    *pszResp = '\0';
  385.    if (pszResponse[0] == '+')
  386.       retVal = TRUE;
  387.    else if (pszResponse[0] == '-')
  388.       retVal = FALSE;
  389.    else if (pszResponse[3] == ' ')
  390.       retVal = (USHORT)atoi (pszResponse);
  391.  
  392.    return (retVal);
  393. }
  394.  
  395. ULONG INETMAIL::Highest (VOID)
  396. {
  397.    return (TotalMsgs);
  398. }
  399.  
  400. USHORT INETMAIL::Lock (ULONG ulTimeout)
  401. {
  402.    ulTimeout = ulTimeout;
  403.    return (TRUE);
  404. }
  405.  
  406. ULONG INETMAIL::Lowest (VOID)
  407. {
  408.    return (1L);
  409. }
  410.  
  411. ULONG INETMAIL::MsgnToUid (ULONG ulMsg)
  412. {
  413.    return (ulMsg);
  414. }
  415.  
  416. VOID INETMAIL::New (VOID)
  417. {
  418.    LastReaded = 0L;
  419.    From[0] = To[0] = Subject[0] = '\0';
  420.    Crash = Direct = FileAttach = FileRequest = Hold = Immediate = FALSE;
  421.    Intransit = KillSent = Local = Private = ReceiptRequest = Received = FALSE;
  422.    Sent = 0;
  423.    memset (&Written, 0, sizeof (Written));
  424.    memset (&Arrived, 0, sizeof (Arrived));
  425.    Original = Reply = 0L;
  426.    Text.Clear ();
  427. }
  428.  
  429. USHORT INETMAIL::Next (ULONG &ulMsg)
  430. {
  431.    USHORT RetVal = FALSE;
  432.  
  433.    if (ulMsg < TotalMsgs) {
  434.       ulMsg++;
  435.       RetVal = TRUE;
  436.    }
  437.  
  438.    return (RetVal);
  439. }
  440.  
  441. ULONG INETMAIL::Number (VOID)
  442. {
  443.    return (TotalMsgs);
  444. }
  445.  
  446. USHORT INETMAIL::Open (PSZ pszServer, PSZ pszUser, PSZ pszPwd)
  447. {
  448.    USHORT retVal = FALSE;
  449.    CHAR String[128], *p;
  450.  
  451.    if (Tcp->ConnectServer (pszServer, 110) == TRUE) {
  452.       if (GetResponse (String, (USHORT)(sizeof (String) - 1)) == TRUE) {
  453.          sprintf (String, "USER %s\r\n", pszUser);
  454.          Tcp->SendBytes ((UCHAR *)String, (USHORT)strlen (String));
  455.          if (GetResponse (String, (USHORT)(sizeof (String) - 1)) == TRUE) {
  456.             sprintf (String, "PASS %s\r\n", pszPwd);
  457.             Tcp->SendBytes ((UCHAR *)String, (USHORT)strlen (String));
  458.             if (GetResponse (String, (USHORT)(sizeof (String) - 1)) == TRUE) {
  459.                sprintf (String, "STAT\r\n");
  460.                Tcp->SendBytes ((UCHAR *)String, (USHORT)strlen (String));
  461.                if (GetResponse (String, (USHORT)(sizeof (String) - 1)) == TRUE) {
  462.                   p = strtok (String, " ");
  463.                   if ((p = strtok (NULL, " ")) != NULL)
  464.                      TotalMsgs = atol (p);
  465.                }
  466.                retVal = TRUE;
  467.                LastReaded = 0L;
  468.             }
  469.          }
  470.       }
  471.    }
  472.  
  473.    return (retVal);
  474. }
  475.  
  476. VOID INETMAIL::Pack (VOID)
  477. {
  478. }
  479.  
  480. USHORT INETMAIL::Previous (ULONG &ulMsg)
  481. {
  482.    USHORT RetVal = FALSE;
  483.  
  484.    if (ulMsg > 1) {
  485.       ulMsg--;
  486.       RetVal = TRUE;
  487.    }
  488.  
  489.    return (RetVal);
  490. }
  491.  
  492. USHORT INETMAIL::ReadHeader (ULONG ulMsg)
  493. {
  494.    ulMsg = ulMsg;
  495.  
  496.    return (FALSE);
  497. }
  498.  
  499. USHORT INETMAIL::Read (ULONG ulMsg, SHORT nWidth)
  500. {
  501.    return (Read (ulMsg, Text, nWidth));
  502. }
  503.  
  504. USHORT INETMAIL::Read (ULONG ulMsg, class TCollection &MsgText, SHORT nWidth)
  505. {
  506.    USHORT retVal = FALSE, SkipNext;
  507.    SHORT i, nReaded, nCol;
  508.    PSZ p;
  509.    struct dosdate_t date;
  510.    struct dostime_t time;
  511.  
  512.    From[0] = To[0] = Subject[0] = '\0';
  513.    MsgText.Clear ();
  514.  
  515.    if (Tcp != NULL) {
  516.       New ();
  517.       sprintf (szBuffer, "RETR %lu\r\n", ulMsg);
  518.       Tcp->SendBytes ((UCHAR *)szBuffer, (USHORT)strlen (szBuffer));
  519.  
  520.       if (GetResponse (szBuffer, (USHORT)(sizeof (szBuffer) - 1)) == TRUE) {
  521.          retVal = TRUE;
  522.  
  523.          _dos_getdate (&date);
  524.          _dos_gettime (&time);
  525.          Arrived.Day = Written.Day = date.day;
  526.          Arrived.Month = Written.Month = date.month;
  527.          Arrived.Year = Written.Year = (USHORT)date.year;
  528.          Arrived.Hour = Written.Hour = time.hour;
  529.          Arrived.Minute = Written.Minute = time.minute;
  530.          Arrived.Second = Written.Second = time.second;
  531.  
  532.          do {
  533.             szBuffer[0] = 1;
  534.             GetLine (&szBuffer[1], (USHORT)(sizeof (szBuffer) - 2));
  535.             if (szBuffer[1] != '\0' && strcmp (szBuffer, "."))
  536.                Text.Add (szBuffer);
  537.  
  538.             if (!strncmp (&szBuffer[1], "From: ", 6)) {
  539.                if (strlen (&szBuffer[7]) >= sizeof (From))
  540.                   szBuffer[7 + sizeof (From)] = '\0';
  541.                strcpy (From, &szBuffer[7]);
  542.             }
  543.             else if (!strncmp (&szBuffer[1], "Subject: ", 9)) {
  544.                if (strlen (&szBuffer[10]) >= sizeof (Subject))
  545.                   szBuffer[10 + sizeof (Subject)] = '\0';
  546.                strcpy (Subject, &szBuffer[10]);
  547.             }
  548.             else if (!strncmp (&szBuffer[1], "Date: ", 6)) {
  549.                p = strtok (&szBuffer[7], " ");
  550.                if (p != NULL && !isdigit (p[0]))
  551.                   p = strtok (NULL, " ");
  552.                if (p != NULL) {
  553.                   Written.Day = (UCHAR)atoi (p);
  554.                   if ((p = strtok (NULL, " ")) != NULL) {
  555.                      for (i = 0; i < 12; i++)
  556.                         if (strnicmp (MONTHS[i], p, 3) == 0) {
  557.                            Written.Month = (UCHAR)(i + 1);
  558.                            i = 12;
  559.                         }
  560.                   }
  561.                   if ((p = strtok (NULL, " ")) != NULL) {
  562.                      Written.Year = (USHORT)atoi (p);
  563.                      if (Written.Year >= 80 && Written.Year < 100)
  564.                         Written.Year += 1900;
  565.                      else if (Written.Year < 80)
  566.                         Written.Year += 2000;
  567.                   }
  568.                   if ((p = strtok (NULL, " ")) != NULL) {
  569.                      Written.Hour = (UCHAR)((p[0] - '0') * 10 + (p[1] - '0'));
  570.                      p += 2;
  571.                      if (p[0] == ':')
  572.                         p++;
  573.                      Written.Minute = (UCHAR)((p[0] - '0') * 10 + (p[1] - '0'));
  574.                      p += 2;
  575.                      if (p[0] != '\0') {
  576.                         if (p[0] == ':')
  577.                            p++;
  578.                         if (p[0] != '\0')
  579.                            Written.Second = (UCHAR)((p[0] - '0') * 10 + (p[1] - '0'));
  580.                      }
  581.                   }
  582.                }
  583.             }
  584.          } while (szBuffer[1] != '\0' && strcmp (szBuffer, "."));
  585.  
  586.          Id = LastReaded = ulMsg;
  587.          pLine = szLine;
  588.          nCol = 0;
  589.          SkipNext = FALSE;
  590.  
  591.          do {
  592.             GetLine (szBuffer, (USHORT)(sizeof (szBuffer) - 1));
  593.             nReaded = (USHORT)strlen (szBuffer);
  594.  
  595.             for (i = 0, pBuff = szBuffer; i < nReaded; i++, pBuff++) {
  596.                if (*pBuff != '\n') {
  597.                   *pLine++ = *pBuff;
  598.                   nCol++;
  599.                   if (nCol >= nWidth) {
  600.                      *pLine = '\0';
  601.                      while (nCol > 1 && *pLine != ' ') {
  602.                         nCol--;
  603.                         pLine--;
  604.                      }
  605.                      if (nCol > 0) {
  606.                         while (*pLine == ' ')
  607.                            pLine++;
  608.                         strcpy (szWrp, pLine);
  609.                      }
  610.                      *pLine = '\0';
  611.                      MsgText.Add (szLine, (USHORT)(strlen (szLine) + 1));
  612.                      strcpy (szLine, szWrp);
  613.                      pLine = strchr (szLine, '\0');
  614.                      nCol = (SHORT)strlen (szLine);
  615.                      SkipNext = TRUE;
  616.                   }
  617.                }
  618.             }
  619.             *pLine = '\0';
  620.             if (pLine > szLine && SkipNext == TRUE) {
  621.                pLine--;
  622.                while (pLine > szLine && *pLine == ' ')
  623.                   *pLine-- = '\0';
  624.                if (pLine > szLine && strcmp (szLine, "."))
  625.                   MsgText.Add (szLine, (USHORT)(strlen (szLine) + 1));
  626.             }
  627.             else if (SkipNext == FALSE) {
  628.                if (strcmp (szLine, "."))
  629.                   MsgText.Add (szLine, (USHORT)(strlen (szLine) + 1));
  630.             }
  631.             SkipNext = FALSE;
  632.             pLine = szLine;
  633.             nCol = 0;
  634.          } while (strcmp (szBuffer, "."));
  635.       }
  636.    }
  637.  
  638.    return (retVal);
  639. }
  640.  
  641. VOID INETMAIL::SetHWM (ULONG ulMsg)
  642. {
  643.    ulMsg = ulMsg;
  644. }
  645.  
  646. ULONG INETMAIL::UidToMsgn (ULONG ulMsg)
  647. {
  648.    return (ulMsg);
  649. }
  650.  
  651. VOID INETMAIL::UnLock (VOID)
  652. {
  653. }
  654.  
  655. USHORT INETMAIL::WriteHeader (ULONG ulMsg)
  656. {
  657.    ulMsg = ulMsg;
  658.    return (FALSE);
  659. }
  660.  
  661.