PTLib
Version 2.10.4
|
00001 /* 00002 * inetmail.h 00003 * 00004 * Internet Mail channel classes 00005 * Simple Mail Transport Protocol & Post Office Protocol v3 00006 * 00007 * Portable Windows Library 00008 * 00009 * Copyright (c) 1993-2002 Equivalence Pty. Ltd. 00010 * 00011 * The contents of this file are subject to the Mozilla Public License 00012 * Version 1.0 (the "License"); you may not use this file except in 00013 * compliance with the License. You may obtain a copy of the License at 00014 * http://www.mozilla.org/MPL/ 00015 * 00016 * Software distributed under the License is distributed on an "AS IS" 00017 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See 00018 * the License for the specific language governing rights and limitations 00019 * under the License. 00020 * 00021 * The Original Code is Portable Windows Library. 00022 * 00023 * The Initial Developer of the Original Code is Equivalence Pty. Ltd. 00024 * 00025 * Contributor(s): Federico Pinna and Reitek S.p.A. 00026 * 00027 * $Revision: 25387 $ 00028 * $Author: rjongbloed $ 00029 * $Date: 2011-03-22 22:51:09 -0500 (Tue, 22 Mar 2011) $ 00030 */ 00031 00032 #ifndef PTLIB_INETMAIL_H 00033 #define PTLIB_INETMAIL_H 00034 00035 #ifdef P_USE_PRAGMA 00036 #pragma interface 00037 #endif 00038 00039 #include <ptclib/inetprot.h> 00040 #include <ptclib/mime.h> 00041 00042 class PSocket; 00043 00044 00046 // PSMTP 00047 00073 class PSMTP : public PInternetProtocol 00074 { 00075 PCLASSINFO(PSMTP, PInternetProtocol) 00076 00077 public: 00078 // New functions for class. 00079 enum Commands { 00080 HELO, EHLO, QUIT, HELP, NOOP, 00081 TURN, RSET, VRFY, EXPN, RCPT, 00082 MAIL, SEND, SAML, SOML, DATA, 00083 AUTH, NumCommands 00084 }; 00085 00086 protected: 00087 PSMTP(); 00088 // Create a new SMTP protocol channel. 00089 }; 00090 00091 00108 class PSMTPClient : public PSMTP 00109 { 00110 PCLASSINFO(PSMTPClient, PSMTP) 00111 00112 public: 00119 PSMTPClient(); 00120 00124 ~PSMTPClient(); 00125 00126 00127 // Overrides from class PChannel. 00133 virtual PBoolean Close(); 00134 00135 00136 // New functions for class. 00144 PBoolean LogIn( 00145 const PString & username, 00146 const PString & password 00147 ); 00148 00157 PBoolean BeginMessage( 00158 const PString & from, 00159 const PString & to, 00160 PBoolean eightBitMIME = false 00161 ); 00162 PBoolean BeginMessage( 00163 const PString & from, 00164 const PStringList & toList, 00165 PBoolean eightBitMIME = false 00166 ); 00167 00173 PBoolean EndMessage(); 00174 00175 00176 protected: 00177 PBoolean OnOpen(); 00178 00179 PBoolean haveHello; 00180 PBoolean extendedHello; 00181 PBoolean eightBitMIME; 00182 PString fromAddress; 00183 PStringList toNames; 00184 PBoolean sendingData; 00185 00186 private: 00187 bool InternalBeginMessage(); 00188 }; 00189 00190 00216 class PSMTPServer : public PSMTP 00217 { 00218 PCLASSINFO(PSMTPServer, PSMTP) 00219 00220 public: 00227 PSMTPServer(); 00228 00229 00230 // New functions for class. 00238 PBoolean ProcessCommand(); 00239 00240 void ServerReset(); 00241 // Reset the state of the SMTP server socket. 00242 00243 enum ForwardResult { 00244 LocalDomain, 00245 WillForward, 00246 CannotForward 00247 }; 00248 // Result of forward check 00249 00256 virtual ForwardResult ForwardDomain( 00257 PCaselessString & userDomain, 00258 PCaselessString & forwardDomainList 00259 ); 00260 00261 enum LookUpResult { 00262 ValidUser, 00263 AmbiguousUser, 00264 UnknownUser, 00265 LookUpError 00266 }; 00267 // Result of user name look up 00268 00276 virtual LookUpResult LookUpName( 00277 const PCaselessString & name, 00278 PString & expandedName 00279 ); 00280 00290 virtual PBoolean HandleMessage( 00291 PCharArray & buffer, 00292 PBoolean starting, 00293 PBoolean completed 00294 00295 ); 00296 00297 00298 protected: 00299 PBoolean OnOpen(); 00300 00301 virtual void OnHELO( 00302 const PCaselessString & remoteHost 00303 ); 00304 // Start connection. 00305 00306 virtual void OnEHLO( 00307 const PCaselessString & remoteHost 00308 ); 00309 // Start extended SMTP connection. 00310 00311 virtual void OnQUIT(); 00312 // close connection and die. 00313 00314 virtual void OnHELP(); 00315 // get help. 00316 00317 virtual void OnNOOP(); 00318 // do nothing 00319 00320 virtual void OnTURN(); 00321 // switch places 00322 00323 virtual void OnRSET(); 00324 // Reset state. 00325 00326 virtual void OnVRFY( 00327 const PCaselessString & name 00328 ); 00329 // Verify address. 00330 00331 virtual void OnEXPN( 00332 const PCaselessString & name 00333 ); 00334 // Expand alias. 00335 00336 virtual void OnRCPT( 00337 const PCaselessString & recipient 00338 ); 00339 // Designate recipient 00340 00341 virtual void OnMAIL( 00342 const PCaselessString & sender 00343 ); 00344 // Designate sender 00345 00346 virtual void OnSEND( 00347 const PCaselessString & sender 00348 ); 00349 // send message to screen 00350 00351 virtual void OnSAML( 00352 const PCaselessString & sender 00353 ); 00354 // send AND mail 00355 00356 virtual void OnSOML( 00357 const PCaselessString & sender 00358 ); 00359 // send OR mail 00360 00361 virtual void OnDATA(); 00362 // Message text. 00363 00370 virtual PBoolean OnUnknown( 00371 const PCaselessString & command 00372 ); 00373 00374 virtual void OnSendMail( 00375 const PCaselessString & sender 00376 ); 00377 // Common code for OnMAIL(), OnSEND(), OnSOML() and OnSAML() funtions. 00378 00390 virtual PBoolean OnTextData(PCharArray & buffer, PBoolean & completed); 00391 00403 virtual PBoolean OnMIMEData(PCharArray & buffer, PBoolean & completed); 00404 00405 00406 // Member variables 00407 PBoolean extendedHello; 00408 PBoolean eightBitMIME; 00409 PString fromAddress; 00410 PString fromPath; 00411 PStringList toNames; 00412 PStringList toDomains; 00413 PINDEX messageBufferSize; 00414 enum { WasMAIL, WasSEND, WasSAML, WasSOML } sendCommand; 00415 StuffState endMIMEDetectState; 00416 }; 00417 00418 00420 // PPOP3 00421 00459 class PPOP3 : public PInternetProtocol 00460 { 00461 PCLASSINFO(PPOP3, PInternetProtocol) 00462 00463 public: 00464 enum Commands { 00465 USER, PASS, QUIT, RSET, NOOP, STATcmd, 00466 LIST, RETR, DELE, APOP, TOP, UIDL, 00467 AUTH, NumCommands 00468 }; 00469 00470 00471 protected: 00472 PPOP3(); 00473 00485 virtual PINDEX ParseResponse( 00486 const PString & line 00487 ); 00488 00489 // Member variables 00490 static const PString & okResponse(); 00491 static const PString & errResponse(); 00492 }; 00493 00494 00522 class PPOP3Client : public PPOP3 00523 { 00524 PCLASSINFO(PPOP3Client, PPOP3) 00525 00526 public: 00533 PPOP3Client(); 00534 00538 ~PPOP3Client(); 00539 00540 00541 // Overrides from class PChannel. 00547 virtual PBoolean Close(); 00548 00549 00550 // New functions for class. 00551 enum LoginOptions 00552 { 00553 AllowUserPass = 1, 00554 00555 UseSASL = 2, 00556 00557 AllowClearTextSASL = 4 00558 }; 00559 00565 PBoolean LogIn( 00566 const PString & username, 00567 const PString & password, 00568 int options = AllowUserPass 00569 ); 00570 00576 int GetMessageCount(); 00577 00584 PUnsignedArray GetMessageSizes(); 00585 00595 PStringArray GetMessageHeaders(); 00596 00597 00598 /* Begin the retrieval of an entire message. The application may then use 00599 the <A>PApplicationSocket::ReadLine()</A> function with the 00600 <CODE>unstuffLine</CODE> parameter set to true. Repeated calls until 00601 its return valus is false will read the message headers and body. 00602 00603 @return 00604 Array of strings continaing message headers. 00605 */ 00606 PBoolean BeginMessage( 00607 PINDEX messageNumber 00611 ); 00612 00618 PBoolean DeleteMessage( 00619 PINDEX messageNumber 00620 /* Number of message to retrieve. This is an integer from 1 to the 00621 maximum number of messages available. 00622 */ 00623 ); 00624 00625 00626 protected: 00627 PBoolean OnOpen(); 00628 00629 // Member variables 00630 PBoolean loggedIn; 00631 PString apopBanner; 00632 }; 00633 00634 00647 class PPOP3Server : public PPOP3 00648 { 00649 PCLASSINFO(PPOP3Server, PPOP3) 00650 00651 public: 00658 PPOP3Server(); 00659 00660 00661 // New functions for class. 00669 PBoolean ProcessCommand(); 00670 00680 virtual PBoolean HandleOpenMailbox( 00681 const PString & username, 00682 const PString & password 00683 ); 00684 00692 virtual void HandleSendMessage( 00693 PINDEX messageNumber, 00694 const PString & id, 00695 PINDEX lines 00696 ); 00697 00705 virtual void HandleDeleteMessage( 00706 PINDEX messageNumber, 00707 const PString & id 00708 ); 00709 00710 00711 protected: 00712 PBoolean OnOpen(); 00713 00714 virtual void OnUSER( 00715 const PString & name 00716 ); 00717 // Specify user name (mailbox). 00718 00719 virtual void OnPASS( 00720 const PString & passwd 00721 ); 00722 // Specify password and log user in. 00723 00724 virtual void OnQUIT(); 00725 // End connection, saving all changes (delete messages). 00726 00727 virtual void OnRSET(); 00728 // Reset connection (undelete messages). 00729 00730 virtual void OnNOOP(); 00731 // Do nothing. 00732 00733 virtual void OnSTAT(); 00734 // Get number of messages in mailbox. 00735 00739 virtual void OnLIST( 00740 PINDEX msg 00741 ); 00742 00743 virtual void OnRETR( 00744 PINDEX msg 00745 ); 00746 // Retrieve a message from mailbox. 00747 00748 virtual void OnDELE( 00749 PINDEX msg 00750 ); 00751 // Delete a message from mailbox. 00752 00753 virtual void OnTOP( 00754 PINDEX msg, 00755 PINDEX count 00756 ); 00757 // Get the message header and top <CODE>count</CODE> lines of message. 00758 00762 virtual void OnUIDL( 00763 PINDEX msg 00764 ); 00765 00772 virtual PBoolean OnUnknown( 00773 const PCaselessString & command 00774 ); 00775 00776 00777 // Member variables 00778 PString username; 00779 PUnsignedArray messageSizes; 00780 PStringArray messageIDs; 00781 PBYTEArray messageDeletions; 00782 }; 00783 00784 00810 class PRFC822Channel : public PIndirectChannel 00811 { 00812 PCLASSINFO(PRFC822Channel, PIndirectChannel); 00813 public: 00814 enum Direction { 00815 Sending, 00816 Receiving 00817 }; 00820 PRFC822Channel( 00821 Direction direction 00822 ); 00823 00826 ~PRFC822Channel(); 00827 00828 00829 // Overrides from class PChannel. 00834 PBoolean Close(); 00835 00844 virtual PBoolean Write( 00845 const void * buf, 00846 PINDEX len 00847 ); 00848 00849 00854 void NewMessage( 00855 Direction direction 00856 ); 00857 00867 PString MultipartMessage(); 00868 00878 PBoolean MultipartMessage( 00879 const PString & boundary 00880 ); 00881 00892 void NextPart( 00893 const PString & boundary 00894 ); 00895 00896 00900 void SetFromAddress( 00901 const PString & fromAddress 00902 ); 00903 00907 void SetToAddress( 00908 const PString & toAddress 00909 ); 00910 00914 void SetCC( 00915 const PString & ccAddress 00916 ); 00917 00921 void SetBCC( 00922 const PString & bccAddress 00923 ); 00924 00928 void SetSubject( 00929 const PString & subject 00930 ); 00931 00939 void SetContentType( 00940 const PString & contentType 00941 ); 00942 00950 void SetContentAttachment( 00951 const PFilePath & filename 00952 ); 00953 00963 void SetTransferEncoding( 00964 const PString & encoding, 00965 PBoolean autoTranslate = true 00966 ); 00967 00968 00972 void SetHeaderField( 00973 const PString & name, 00974 const PString & value 00975 ); 00976 00977 // Common MIME header tags 00978 static const PCaselessString & MimeVersionTag(); 00979 static const PCaselessString & FromTag(); 00980 static const PCaselessString & ToTag(); 00981 static const PCaselessString & CCTag(); 00982 static const PCaselessString & BCCTag(); 00983 static const PCaselessString & SubjectTag(); 00984 static const PCaselessString & DateTag(); 00985 static const PCaselessString & ReturnPathTag(); 00986 static const PCaselessString & ReceivedTag(); 00987 static const PCaselessString & MessageIDTag(); 00988 static const PCaselessString & MailerTag(); 00989 static const PCaselessString & ContentTypeTag() { return PMIMEInfo::ContentTypeTag(); } 00990 static const PCaselessString & ContentDispositionTag() { return PMIMEInfo::ContentDispositionTag(); } 00991 static const PCaselessString & ContentTransferEncodingTag() { return PMIMEInfo::ContentTransferEncodingTag(); } 00992 00997 PBoolean SendWithSMTP( 00998 const PString & hostname 00999 ); 01000 01005 PBoolean SendWithSMTP( 01006 PSMTPClient * smtp 01007 ); 01008 01009 01010 protected: 01011 PBoolean OnOpen(); 01012 01013 PBoolean writeHeaders; 01014 PMIMEInfo headers; 01015 PBoolean writePartHeaders; 01016 PMIMEInfo partHeaders; 01017 PStringList boundaries; 01018 PBase64 * base64; 01019 }; 01020 01021 01022 #endif // PTLIB_INETMAIL_H 01023 01024 01025 // End Of File ///////////////////////////////////////////////////////////////