summaryrefslogtreecommitdiffabout
path: root/kmicromail/libetpan/smtp/mailsmtp.c
Side-by-side diff
Diffstat (limited to 'kmicromail/libetpan/smtp/mailsmtp.c') (more/less context) (ignore whitespace changes)
-rw-r--r--kmicromail/libetpan/smtp/mailsmtp.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/kmicromail/libetpan/smtp/mailsmtp.c b/kmicromail/libetpan/smtp/mailsmtp.c
index b3be432..3ab1d11 100644
--- a/kmicromail/libetpan/smtp/mailsmtp.c
+++ b/kmicromail/libetpan/smtp/mailsmtp.c
@@ -67,256 +67,258 @@
RFC 2852 : Deliver By SMTP Service Extension
RFC 2920 : SMTP Service Extension for Command Pipelining
RFC 3030 : SMTP Service Extensions for Transmission of Large and Binary MIME
Messages
*/
#define SMTP_STATUS_CONTINUE 0x1000
mailsmtp * mailsmtp_new(size_t progr_rate,
progress_function * progr_fun)
{
mailsmtp * session;
session = malloc(sizeof(* session));
if (session == NULL)
goto err;
session->stream = NULL;
session->progr_rate = progr_rate;
session->progr_fun = progr_fun;
session->response = NULL;
session->line_buffer = mmap_string_new("");
if (session->line_buffer == NULL)
goto free_session;
session->response_buffer = mmap_string_new("");
if (session->response_buffer == NULL)
goto free_line_buffer;
session->esmtp = 0;
session->auth = MAILSMTP_AUTH_NOT_CHECKED;
return session;
free_line_buffer:
mmap_string_free(session->line_buffer);
free_session:
free(session);
err:
return NULL;
}
void mailsmtp_free(mailsmtp * session)
{
if (session->stream)
mailsmtp_quit(session);
mmap_string_free(session->line_buffer);
mmap_string_free(session->response_buffer);
free(session);
}
static int send_command(mailsmtp * f, char * command);
static int read_response(mailsmtp * session);
/* smtp operations */
int mailsmtp_connect(mailsmtp * session, mailstream * s)
{
int code;
session->stream = s;
code = read_response(session);
switch (code) {
case 220:
return MAILSMTP_NO_ERROR;
case 554:
session->stream = NULL;
mailstream_close(s);
return MAILSMTP_ERROR_SERVICE_NOT_AVAILABLE;
default:
session->stream = NULL;
mailstream_close(s);
return MAILSMTP_ERROR_UNEXPECTED_CODE;
}
}
#define SMTP_STRING_SIZE 513
int mailsmtp_quit(mailsmtp * session)
{
char command[SMTP_STRING_SIZE];
int r;
snprintf(command, SMTP_STRING_SIZE, "QUIT\r\n");
r = send_command(session, command);
if (r == -1)
return MAILSMTP_ERROR_STREAM;
r = read_response(session);
if (r == 0)
return MAILSMTP_ERROR_STREAM;
mailstream_close(session->stream);
session->stream = NULL;
return MAILSMTP_NO_ERROR;
}
#define HOSTNAME_SIZE 256
int mailsmtp_helo(mailsmtp * session)
{
int r;
char hostname[HOSTNAME_SIZE];
char command[SMTP_STRING_SIZE];
r = gethostname(hostname, HOSTNAME_SIZE);
if (r < 0)
return MAILSMTP_ERROR_HOSTNAME;
snprintf(command, SMTP_STRING_SIZE, "HELO %s\r\n", hostname);
r = send_command(session, command);
if (r == -1)
return MAILSMTP_ERROR_STREAM;
r = read_response(session);
switch (r) {
case 250:
+ session->esmtp = 0;
+ session->auth = MAILSMTP_AUTH_NOT_CHECKED;
return MAILSMTP_NO_ERROR;
case 504:
return MAILSMTP_ERROR_NOT_IMPLEMENTED;
case 550:
return MAILSMTP_ERROR_ACTION_NOT_TAKEN;
case 0:
return MAILSMTP_ERROR_STREAM;
default:
return MAILSMTP_ERROR_UNEXPECTED_CODE;
}
}
int mailsmtp_mail(mailsmtp * session, const char * from)
{
int r;
char command[SMTP_STRING_SIZE];
snprintf(command, SMTP_STRING_SIZE, "MAIL FROM:<%s>\r\n", from);
r = send_command(session, command);
if (r == -1)
return MAILSMTP_ERROR_STREAM;
r = read_response(session);
switch (r) {
case 250:
return MAILSMTP_NO_ERROR;
case 552:
return MAILSMTP_ERROR_EXCEED_STORAGE_ALLOCATION;
case 451:
return MAILSMTP_ERROR_IN_PROCESSING;
case 452:
return MAILSMTP_ERROR_INSUFFICIENT_SYSTEM_STORAGE;
case 550:
return MAILSMTP_ERROR_MAILBOX_UNAVAILABLE;
case 553:
return MAILSMTP_ERROR_MAILBOX_NAME_NOT_ALLOWED;
case 503:
return MAILSMTP_ERROR_BAD_SEQUENCE_OF_COMMAND;
case 0:
return MAILSMTP_ERROR_STREAM;
default:
return MAILSMTP_ERROR_UNEXPECTED_CODE;
}
}
int mailsmtp_rcpt(mailsmtp * session, const char * to)
{
return mailesmtp_rcpt(session, to, 0, NULL);
}
int mailsmtp_data(mailsmtp * session)
{
int r;
char command[SMTP_STRING_SIZE];
snprintf(command, SMTP_STRING_SIZE, "DATA\r\n");
r = send_command(session, command);
if (r == -1)
return MAILSMTP_ERROR_STREAM;
r = read_response(session);
switch (r) {
case 354:
return MAILSMTP_NO_ERROR;
case 451:
return MAILSMTP_ERROR_IN_PROCESSING;
case 554:
return MAILSMTP_ERROR_TRANSACTION_FAILED;
case 503:
return MAILSMTP_ERROR_BAD_SEQUENCE_OF_COMMAND;
default:
return MAILSMTP_ERROR_UNEXPECTED_CODE;
}
}
static int send_data(mailsmtp * session, const char * message, size_t size);
int mailsmtp_data_message(mailsmtp * session,
const char * message,
size_t size)
{
int r;
r = send_data(session, message, size);
if (r == -1)
return MAILSMTP_ERROR_STREAM;
r = read_response(session);
switch(r) {
case 250:
return MAILSMTP_NO_ERROR;
case 552:
return MAILSMTP_ERROR_EXCEED_STORAGE_ALLOCATION;
case 554:
return MAILSMTP_ERROR_TRANSACTION_FAILED;
case 451:
return MAILSMTP_ERROR_IN_PROCESSING;
case 452:
return MAILSMTP_ERROR_INSUFFICIENT_SYSTEM_STORAGE;
case 0:
return MAILSMTP_ERROR_STREAM;
default:
return MAILSMTP_ERROR_UNEXPECTED_CODE;
}
}