summaryrefslogtreecommitdiffstats
path: root/libmail/smtp.H
diff options
context:
space:
mode:
Diffstat (limited to 'libmail/smtp.H')
-rw-r--r--libmail/smtp.H239
1 files changed, 239 insertions, 0 deletions
diff --git a/libmail/smtp.H b/libmail/smtp.H
new file mode 100644
index 0000000..80adfe6
--- /dev/null
+++ b/libmail/smtp.H
@@ -0,0 +1,239 @@
+/*
+** Copyright 2002-2008, Double Precision Inc.
+**
+** See COPYING for distribution information.
+*/
+#ifndef libmail_smtp_H
+#define libmail_smtp_H
+
+#include "libmail_config.h"
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#include "mail.H"
+#include <sys/types.h>
+
+#include "smtpinfo.H"
+#include "logininfo.H"
+#include "fd.H"
+#include <stdio.h>
+#include <time.h>
+#include <list>
+#include <string>
+#include <set>
+#include <queue>
+#include <vector>
+
+LIBMAIL_START
+
+///////////////////////////////////////////////////////////////////////////
+//
+// An SMTP implementation
+//
+
+class smtp : public fd, public loginInfo::callbackTarget {
+
+private:
+ void resumed();
+ void handler(std::vector<pollfd> &fds, int &timeout);
+
+ std::set<std::string> capabilities;
+
+ bool orderlyShutdown;
+
+ loginInfo smtpLoginInfo;
+
+ int socketRead(const std::string &readbuffer);
+
+ void disconnect(const char *reason);
+
+ std::list<std::string> smtpResponse;
+ // SMTP server response being accumulated.
+
+ void (smtp::*responseHandler)(int numCode,
+ std::string multilineResponse);
+ // Handler called when an SMTP response is received in entirety
+
+ void installHandler(void (smtp::*)(int numCode,
+ std::string multilineResponse));
+ // Install next handler.
+
+ time_t responseTimeout;
+ // SMTP timeout
+
+ void error(std::string); /* Login failed */
+ void success(std::string); /* Login succeeded */
+
+ void howdy(const char *); /* send ehlo/helo */
+
+ void greetingResponse(int, std::string);
+ void ehloResponse(int, std::string);
+ void heloResponse(int, std::string);
+ void auth_external_response(int, std::string);
+ void quitResponse(int, std::string);
+
+ int hmac_method_index;
+ /* Next HMAC authentication hash function to try */
+
+ void authenticate_hmac();
+ void hmacResponse(int, std::string);
+
+ void starttls();
+ void starttlsResponse(int, std::string);
+
+ void authenticate_login();
+
+ void begin_auth();
+ void begin_auth_nonexternal();
+
+ void loginInfoCallback(std::string str);
+ void loginInfoCallbackCancel();
+
+
+ void loginUseridResponse(int, std::string);
+ void loginPasswdResponse(int, std::string);
+ void loginResponse(int, std::string);
+
+ void authenticated();
+
+ bool ready2send; /* Fully logged in */
+
+ struct messageQueueInfo {
+ FILE *message;
+ mail::smtpInfo messageInfo;
+ mail::callback *callback;
+ bool flag8bit;
+ };
+
+ std::queue<messageQueueInfo> sendQueue;
+ /* Queue of messages waiting to go out */
+
+ bool fatalError; // Fatal connection error occured
+ time_t pingTimeout; // When idling, ping occasionally
+
+ // Custom WriteBuffer that spits out the whole message
+
+ class Blast : public fd::WriteBuffer {
+
+ bool eofSent;
+ public:
+ smtp *mySmtp;
+
+ char lastChar;
+
+ size_t bytesTotal;
+ size_t bytesDone;
+
+ Blast(smtp *smtpArg);
+ ~Blast();
+
+ bool fillWriteBuffer();
+ };
+
+ Blast *myBlaster;
+
+public:
+ friend class Blast;
+
+ smtp(std::string url, std::string passwd,
+ std::vector<std::string> &certificates,
+ mail::callback &callback,
+ mail::callback::disconnect &disconnectCallback,
+ loginCallback *loginCallbackFunc);
+
+ smtp(const smtp &); // UNDEFINED
+ smtp &operator=(const smtp &); // UNDEFINED
+
+ ~smtp();
+
+ void logout(mail::callback &callback);
+ void checkNewMail(mail::callback &callback);
+ bool hasCapability(std::string capability);
+ std::string getCapability(std::string capability);
+
+ mail::folder *folderFromString(std::string);
+
+ void readTopLevelFolders(mail::callback::folderList &callback1,
+ mail::callback &callback2);
+
+ void findFolder(std::string folder,
+ class mail::callback::folderList &callback1,
+ class mail::callback &callback2);
+ std::string translatePath(std::string path);
+
+ mail::folder *getSendFolder(const mail::smtpInfo &info,
+ const mail::folder *folder,
+ std::string &errmsg);
+
+
+ void readMessageAttributes(const std::vector<size_t> &messages,
+ MessageAttributes attributes,
+ mail::callback::message &callback);
+
+ void readMessageContent(const std::vector<size_t> &messages,
+ bool peek,
+ enum mail::readMode readType,
+ mail::callback::message &callback);
+
+ void readMessageContent(size_t messageNum,
+ bool peek,
+ const mimestruct &msginfo,
+ enum mail::readMode readType,
+ mail::callback::message &callback);
+
+ void readMessageContentDecoded(size_t messageNum,
+ bool peek,
+ const mimestruct &msginfo,
+ mail::callback::message &callback);
+
+ size_t getFolderIndexSize();
+ mail::messageInfo getFolderIndexInfo(size_t);
+
+ void saveFolderIndexInfo(size_t,
+ const mail::messageInfo &,
+ mail::callback &);
+
+ void updateFolderIndexFlags(const std::vector<size_t> &messages,
+ bool doFlip,
+ bool enableDisable,
+ const mail::messageInfo &flags,
+ mail::callback &callback);
+
+ void updateFolderIndexInfo(mail::callback &);
+ void removeMessages(const std::vector<size_t> &messages,
+ callback &cb);
+
+ void copyMessagesTo(const std::vector<size_t> &messages,
+ mail::folder *copyTo,
+ mail::callback &callback);
+
+ void searchMessages(const searchParams &searchInfo,
+ searchCallback &callback);
+
+
+ void send(FILE *tmpfile, mail::smtpInfo &info,
+ mail::callback *callback,
+ bool flag8bit);
+
+private:
+ void startNextMessage();
+ void messageProcessed(int, std::string);
+
+ void rsetResponse(int, std::string);
+ bool validString(std::string s);
+
+ std::string pipelineError;
+ unsigned pipelineCount; // Count pipelined replies received
+ unsigned rcptCount; // RCPT TO count.
+ std::string pipelineCmd; // Command that got rejected.
+
+ void pipelinedResponse(int, std::string);
+ void mailfromResponse(int, std::string);
+
+ void dataResponse(int, std::string);
+ void data2Response(int, std::string);
+};
+
+LIBMAIL_END
+
+#endif