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