/*! \file smtpsocket.h * \brief header file for TCP/IP socket and SMTP communication functions * \author Brecht Sanders * \date 2012-2013 * \copyright GPL */ /* This file is part of libquickmail. libquickmail is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. libquickmail is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with libquickmail. If not, see . */ #ifndef __INCLUDED_SMTPSOCKET_H #define __INCLUDED_SMTPSOCKET_H #ifdef _WIN32 #include #else #include #include #include #include #ifndef SOCKET #define SOCKET int #endif #ifndef INVALID_SOCKET #define INVALID_SOCKET -1 #endif #ifndef SOCKET_ERROR #define SOCKET_ERROR -1 #endif #endif #include #include #define READ_BUFFER_CHUNK_SIZE 128 #define WRITE_BUFFER_CHUNK_SIZE 128 #ifdef __cplusplus extern "C" { #endif /*! \brief connect network socket * \param smtpserver hostname or IP address of server * \param smtpport TCP port to connect to * \param errmsg optional pointer to where error message will be stored (must not be freed by caller) * \return open network socket or INVALID_SOCKET on error */ SOCKET socket_open (const char* smtpserver, unsigned int smtpport, char** errmsg); /*! \brief disconnect network socket * \param sock open network socket */ void socket_close (SOCKET sock); /*! \brief send data to a network socket * \param sock open network socket * \param buf buffer containing data * \param len size of buffer in bytes * \return number of bytes sent */ int socket_send (SOCKET sock, const char* buf, int len); /*! \brief check if data is waiting to be read from network socket * \param sock open network socket * \param timeoutseconds number of seconds to wait (0 to return immediately) * \return nonzero if data is waiting */ int socket_data_waiting (SOCKET sock, int timeoutseconds); /*! \brief read SMTP response from network socket * \param sock open network socket * \return null-terminated string containing received data (must be freed by caller), or NULL */ char* socket_receive_stmp (SOCKET sock); /*! \brief read SMTP response from network socket * \param sock open network socket * \param errmsg optional pointer to where error message will be stored (must be freed by caller) * \return SMTP status code (code >= 400 means error) */ int socket_get_smtp_code (SOCKET sock, char** errmsg); /*! \brief send SMTP command and return status code * \param sock open network socket * \param debuglog file handle to write debugging information to (NULL for no debugging) * \param template printf style formatting template * \return SMTP status code (code >= 400 means error) */ int socket_smtp_command (SOCKET sock, FILE* debuglog, const char* template, ...); #ifdef __cplusplus } #endif #endif //__INCLUDED_SMTPSOCKET_H