00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 #ifndef _PMAILPROTOCOL
00100 #define _PMAILPROTOCOL
00101
00102 #ifdef P_USE_PRAGMA
00103 #pragma interface
00104 #endif
00105
00106 #include <ptclib/inetprot.h>
00107 #include <ptclib/mime.h>
00108
00109 class PSocket;
00110
00111
00113
00114
00140 class PSMTP : public PInternetProtocol
00141 {
00142 PCLASSINFO(PSMTP, PInternetProtocol)
00143
00144 public:
00145
00146 enum Commands {
00147 HELO, EHLO, QUIT, HELP, NOOP,
00148 TURN, RSET, VRFY, EXPN, RCPT,
00149 MAIL, SEND, SAML, SOML, DATA,
00150 AUTH, NumCommands
00151 };
00152
00153 protected:
00154 PSMTP();
00155
00156 };
00157
00158
00175 class PSMTPClient : public PSMTP
00176 {
00177 PCLASSINFO(PSMTPClient, PSMTP)
00178
00179 public:
00186 PSMTPClient();
00187
00191 ~PSMTPClient();
00192
00193
00194
00200 virtual BOOL Close();
00201
00202
00203
00211 BOOL LogIn(
00212 const PString & username,
00213 const PString & password
00214 );
00215
00224 BOOL BeginMessage(
00225 const PString & from,
00226 const PString & to,
00227 BOOL eightBitMIME = FALSE
00228 );
00229 BOOL BeginMessage(
00230 const PString & from,
00231 const PStringList & toList,
00232 BOOL eightBitMIME = FALSE
00233 );
00234
00240 BOOL EndMessage();
00241
00242
00243 protected:
00244 BOOL OnOpen();
00245
00246 BOOL haveHello;
00247 BOOL extendedHello;
00248 BOOL eightBitMIME;
00249 PString fromAddress;
00250 PStringList toNames;
00251 BOOL sendingData;
00252
00253 private:
00254 BOOL _BeginMessage();
00255 };
00256
00257
00283 class PSMTPServer : public PSMTP
00284 {
00285 PCLASSINFO(PSMTPServer, PSMTP)
00286
00287 public:
00294 PSMTPServer();
00295
00296
00297
00305 BOOL ProcessCommand();
00306
00307 void ServerReset();
00308
00309
00310 enum ForwardResult {
00311 LocalDomain,
00312 WillForward,
00313 CannotForward
00314 };
00315
00316
00323 virtual ForwardResult ForwardDomain(
00324 PCaselessString & userDomain,
00325 PCaselessString & forwardDomainList
00326 );
00327
00328 enum LookUpResult {
00329 ValidUser,
00330 AmbiguousUser,
00331 UnknownUser,
00332 LookUpError
00333 };
00334
00335
00343 virtual LookUpResult LookUpName(
00344 const PCaselessString & name,
00345 PString & expandedName
00346 );
00347
00357 virtual BOOL HandleMessage(
00358 PCharArray & buffer,
00359 BOOL starting,
00360 BOOL completed
00361
00362 );
00363
00364
00365 protected:
00366 BOOL OnOpen();
00367
00368 virtual void OnHELO(
00369 const PCaselessString & remoteHost
00370 );
00371
00372
00373 virtual void OnEHLO(
00374 const PCaselessString & remoteHost
00375 );
00376
00377
00378 virtual void OnQUIT();
00379
00380
00381 virtual void OnHELP();
00382
00383
00384 virtual void OnNOOP();
00385
00386
00387 virtual void OnTURN();
00388
00389
00390 virtual void OnRSET();
00391
00392
00393 virtual void OnVRFY(
00394 const PCaselessString & name
00395 );
00396
00397
00398 virtual void OnEXPN(
00399 const PCaselessString & name
00400 );
00401
00402
00403 virtual void OnRCPT(
00404 const PCaselessString & recipient
00405 );
00406
00407
00408 virtual void OnMAIL(
00409 const PCaselessString & sender
00410 );
00411
00412
00413 virtual void OnSEND(
00414 const PCaselessString & sender
00415 );
00416
00417
00418 virtual void OnSAML(
00419 const PCaselessString & sender
00420 );
00421
00422
00423 virtual void OnSOML(
00424 const PCaselessString & sender
00425 );
00426
00427
00428 virtual void OnDATA();
00429
00430
00437 virtual BOOL OnUnknown(
00438 const PCaselessString & command
00439 );
00440
00441 virtual void OnSendMail(
00442 const PCaselessString & sender
00443 );
00444
00445
00457 virtual BOOL OnTextData(PCharArray & buffer, BOOL & completed);
00458
00470 virtual BOOL OnMIMEData(PCharArray & buffer, BOOL & completed);
00471
00472
00473
00474 BOOL extendedHello;
00475 BOOL eightBitMIME;
00476 PString fromAddress;
00477 PString fromPath;
00478 PStringList toNames;
00479 PStringList toDomains;
00480 PINDEX messageBufferSize;
00481 enum { WasMAIL, WasSEND, WasSAML, WasSOML } sendCommand;
00482 StuffState endMIMEDetectState;
00483 };
00484
00485
00487
00488
00526 class PPOP3 : public PInternetProtocol
00527 {
00528 PCLASSINFO(PPOP3, PInternetProtocol)
00529
00530 public:
00531 enum Commands {
00532 USER, PASS, QUIT, RSET, NOOP, STATcmd,
00533 LIST, RETR, DELE, APOP, TOP, UIDL,
00534 AUTH, NumCommands
00535 };
00536
00537
00538 protected:
00539 PPOP3();
00540
00552 virtual PINDEX ParseResponse(
00553 const PString & line
00554 );
00555
00556
00557 static PString okResponse;
00558 static PString errResponse;
00559 };
00560
00561
00589 class PPOP3Client : public PPOP3
00590 {
00591 PCLASSINFO(PPOP3Client, PPOP3)
00592
00593 public:
00600 PPOP3Client();
00601
00605 ~PPOP3Client();
00606
00607
00608
00614 virtual BOOL Close();
00615
00616
00617
00618 enum LoginOptions
00619 {
00620 AllowUserPass = 1,
00621
00622 UseSASL = 2,
00623
00624 AllowClearTextSASL = 4
00625 };
00626
00632 BOOL LogIn(
00633 const PString & username,
00634 const PString & password,
00635 int options = AllowUserPass
00636 );
00637
00643 int GetMessageCount();
00644
00651 PUnsignedArray GetMessageSizes();
00652
00662 PStringArray GetMessageHeaders();
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673 BOOL BeginMessage(
00674 PINDEX messageNumber
00678 );
00679
00685 BOOL DeleteMessage(
00686 PINDEX messageNumber
00687
00688
00689
00690 );
00691
00692
00693 protected:
00694 BOOL OnOpen();
00695
00696
00697 BOOL loggedIn;
00698 PString apopBanner;
00699 };
00700
00701
00714 class PPOP3Server : public PPOP3
00715 {
00716 PCLASSINFO(PPOP3Server, PPOP3)
00717
00718 public:
00725 PPOP3Server();
00726
00727
00728
00736 BOOL ProcessCommand();
00737
00747 virtual BOOL HandleOpenMailbox(
00748 const PString & username,
00749 const PString & password
00750 );
00751
00759 virtual void HandleSendMessage(
00760 PINDEX messageNumber,
00761 const PString & id,
00762 PINDEX lines
00763 );
00764
00772 virtual void HandleDeleteMessage(
00773 PINDEX messageNumber,
00774 const PString & id
00775 );
00776
00777
00778 protected:
00779 BOOL OnOpen();
00780
00781 virtual void OnUSER(
00782 const PString & name
00783 );
00784
00785
00786 virtual void OnPASS(
00787 const PString & passwd
00788 );
00789
00790
00791 virtual void OnQUIT();
00792
00793
00794 virtual void OnRSET();
00795
00796
00797 virtual void OnNOOP();
00798
00799
00800 virtual void OnSTAT();
00801
00802
00806 virtual void OnLIST(
00807 PINDEX msg
00808 );
00809
00810 virtual void OnRETR(
00811 PINDEX msg
00812 );
00813
00814
00815 virtual void OnDELE(
00816 PINDEX msg
00817 );
00818
00819
00820 virtual void OnTOP(
00821 PINDEX msg,
00822 PINDEX count
00823 );
00824
00825
00829 virtual void OnUIDL(
00830 PINDEX msg
00831 );
00832
00839 virtual BOOL OnUnknown(
00840 const PCaselessString & command
00841 );
00842
00843
00844
00845 PString username;
00846 PUnsignedArray messageSizes;
00847 PStringArray messageIDs;
00848 PBYTEArray messageDeletions;
00849 };
00850
00851
00877 class PRFC822Channel : public PIndirectChannel
00878 {
00879 PCLASSINFO(PRFC822Channel, PIndirectChannel);
00880 public:
00881 enum Direction {
00882 Sending,
00883 Receiving
00884 };
00887 PRFC822Channel(
00888 Direction direction
00889 );
00890
00893 ~PRFC822Channel();
00894
00895
00896
00901 BOOL Close();
00902
00911 virtual BOOL Write(
00912 const void * buf,
00913 PINDEX len
00914 );
00915
00916
00921 void NewMessage(
00922 Direction direction
00923 );
00924
00934 PString MultipartMessage();
00935
00945 BOOL MultipartMessage(
00946 const PString & boundary
00947 );
00948
00959 void NextPart(
00960 const PString & boundary
00961 );
00962
00963
00967 void SetFromAddress(
00968 const PString & fromAddress
00969 );
00970
00974 void SetToAddress(
00975 const PString & toAddress
00976 );
00977
00981 void SetCC(
00982 const PString & ccAddress
00983 );
00984
00988 void SetBCC(
00989 const PString & bccAddress
00990 );
00991
00995 void SetSubject(
00996 const PString & subject
00997 );
00998
01006 void SetContentType(
01007 const PString & contentType
01008 );
01009
01017 void SetContentAttachment(
01018 const PFilePath & filename
01019 );
01020
01030 void SetTransferEncoding(
01031 const PString & encoding,
01032 BOOL autoTranslate = TRUE
01033 );
01034
01035
01039 void SetHeaderField(
01040 const PString & name,
01041 const PString & value
01042 );
01043
01044
01045 static const char MimeVersionTag[];
01046 static const char FromTag[];
01047 static const char ToTag[];
01048 static const char CCTag[];
01049 static const char BCCTag[];
01050 static const char SubjectTag[];
01051 static const char DateTag[];
01052 static const char ReturnPathTag[];
01053 static const char ReceivedTag[];
01054 static const char MessageIDTag[];
01055 static const char MailerTag[];
01056 static const char ContentTypeTag[];
01057 static const char ContentDispositionTag[];
01058 static const char ContentTransferEncodingTag[];
01059
01064 BOOL SendWithSMTP(
01065 const PString & hostname
01066 );
01067
01072 BOOL SendWithSMTP(
01073 PSMTPClient * smtp
01074 );
01075
01076
01077 protected:
01078 BOOL OnOpen();
01079
01080 BOOL writeHeaders;
01081 PMIMEInfo headers;
01082 BOOL writePartHeaders;
01083 PMIMEInfo partHeaders;
01084 PStringList boundaries;
01085 PBase64 * base64;
01086 };
01087
01088
01089 #endif // _PMAILPROTOCOL
01090
01091
01092