/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 2010-2019 Free Software Foundation, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General
Public License along with this library. If not, see
. */
#ifndef _MAILUTILS_IMAP_H
#define _MAILUTILS_IMAP_H
#include
#include
#include
#include
#include
#ifdef __cplusplus
extern "C" {
#endif
#define MU_IMAP_DEFAULT_PORT 143
#define MU_IMAP_DEFAULT_SSL_PORT 993
typedef struct _mu_imap *mu_imap_t;
enum mu_imap_session_state
{
MU_IMAP_SESSION_INIT, /* Initial state (disconnected) */
MU_IMAP_SESSION_NONAUTH, /* Non-Authenticated State */
MU_IMAP_SESSION_AUTH, /* Authenticated State */
MU_IMAP_SESSION_SELECTED /* Selected State */
};
int mu_imap_create (mu_imap_t *pimap);
void mu_imap_destroy (mu_imap_t *pimap);
int mu_imap_connect (mu_imap_t imap);
int mu_imap_disconnect (mu_imap_t imap);
int mu_imap_iserror (mu_imap_t imap);
void mu_imap_clearerr (mu_imap_t imap);
int mu_imap_capability (mu_imap_t imap, int reread, mu_iterator_t *piter);
int mu_imap_capability_test (mu_imap_t imap, const char *name,
const char **pret);
int mu_imap_starttls (mu_imap_t imap);
int mu_imap_login (mu_imap_t imap, const char *user, const char *pass);
int mu_imap_login_secret (mu_imap_t imap, const char *user,
mu_secret_t secret);
int mu_imap_logout (mu_imap_t imap);
int mu_imap_id (mu_imap_t imap, char **idenv, mu_assoc_t *passoc);
int mu_imap_noop (mu_imap_t imap);
int mu_imap_check (mu_imap_t imap);
int mu_imap_fetch (mu_imap_t imap, int uid, mu_msgset_t msgset,
const char *items);
int mu_imap_store (mu_imap_t imap, int uid, mu_msgset_t msgset,
const char *items);
#define MU_IMAP_STORE_SET 0
#define MU_IMAP_STORE_ADD 1
#define MU_IMAP_STORE_CLR 2
#define MU_IMAP_STORE_SILENT 0x10
#define MU_IMAP_STORE_OPMASK 0xf
int mu_imap_store_flags (mu_imap_t imap, int uid, mu_msgset_t msgset,
int op, int flags);
int mu_imap_delete (mu_imap_t imap, const char *mailbox);
int mu_imap_rename (mu_imap_t imap, const char *mailbox,
const char *new_mailbox);
int mu_imap_copy (mu_imap_t imap, int uid, mu_msgset_t msgset,
const char *mailbox);
int mu_imap_close (mu_imap_t imap);
int mu_imap_unselect (mu_imap_t imap);
int mu_imap_expunge (mu_imap_t imap);
int mu_imap_mailbox_create (mu_imap_t imap, const char *mailbox);
int mu_imap_append_stream_size (mu_imap_t imap, const char *mailbox, int flags,
struct tm *tm, struct mu_timezone *tz,
mu_stream_t stream, mu_off_t size);
int mu_imap_append_stream (mu_imap_t imap, const char *mailbox, int flags,
struct tm *tm, struct mu_timezone *tz,
mu_stream_t stream);
int mu_imap_append_message (mu_imap_t imap, const char *mailbox, int flags,
struct tm *tm, struct mu_timezone *tz,
mu_message_t msg);
int mu_imap_genlist (mu_imap_t imap, int lsub,
const char *refname, const char *mboxname,
mu_list_t retlist);
int mu_imap_genlist_new (mu_imap_t imap, int lsub,
const char *refname, const char *mboxname,
mu_list_t *plist);
int mu_imap_list (mu_imap_t imap, const char *refname, const char *mboxname,
mu_list_t retlist);
int mu_imap_list_new (mu_imap_t imap, const char *refname,
const char *mboxname, mu_list_t *plist);
int mu_imap_lsub (mu_imap_t imap, const char *refname, const char *mboxname,
mu_list_t retlist);
int mu_imap_lsub_new (mu_imap_t imap, const char *refname,
const char *mboxname, mu_list_t *plist);
int mu_imap_subscribe (mu_imap_t imap, const char *mailbox);
int mu_imap_unsubscribe (mu_imap_t imap, const char *mailbox);
int mu_imap_set_carrier (mu_imap_t imap, mu_stream_t carrier);
int mu_imap_get_carrier (mu_imap_t imap, mu_stream_t *pcarrier);
#define MU_IMAP_TRACE_CLR 0
#define MU_IMAP_TRACE_SET 1
#define MU_IMAP_TRACE_QRY 2
int mu_imap_trace (mu_imap_t imap, int op);
int mu_imap_trace_mask (mu_imap_t imap, int op, int lev);
enum mu_imap_response mu_imap_response (mu_imap_t imap);
int mu_imap_response_code (mu_imap_t imap);
int mu_imap_strerror (mu_imap_t imap, const char **pstr);
int mu_imap_session_state (mu_imap_t imap);
int mu_imap_session_state_str (int state, const char **pstr);
int mu_imap_tag (mu_imap_t imap, const char **pseq);
int mu_imap_search (mu_imap_t imap, int uid, const char *expr,
mu_msgset_t *msgset);
#define MU_IMAP_STAT_DEFINED_FLAGS 0x01
#define MU_IMAP_STAT_PERMANENT_FLAGS 0x02
#define MU_IMAP_STAT_MESSAGE_COUNT 0x04
#define MU_IMAP_STAT_RECENT_COUNT 0x08
#define MU_IMAP_STAT_FIRST_UNSEEN 0x10
#define MU_IMAP_STAT_UIDNEXT 0x20
#define MU_IMAP_STAT_UIDVALIDITY 0x40
struct mu_imap_stat
{
int flags; /* Bitmap of what fields are filled */
int defined_flags; /* Flags defined for this mailbox */
int permanent_flags; /* Flags that can be changed permanently */
size_t message_count; /* Number of messages */
size_t recent_count; /* Number of recent messages */
size_t first_unseen; /* Sequence number of the first unseen message */
size_t uidnext; /* The next unique identifier value. */
unsigned long uidvalidity; /* The unique identifier validity value. */
};
int mu_imap_select (mu_imap_t imap, const char *mbox, int writable,
struct mu_imap_stat *ps);
int mu_imap_status (mu_imap_t imap, const char *mbox, struct mu_imap_stat *ps);
extern struct mu_kwd _mu_imap_status_name_table[];
/* The following five callbacks correspond to members of struct
mu_imap_stat and take a pointer to struct mu_imap_stat as their
PDAT argument. SDAT is always 0. */
#define MU_IMAP_CB_PERMANENT_FLAGS 0
#define MU_IMAP_CB_MESSAGE_COUNT 1
#define MU_IMAP_CB_RECENT_COUNT 2
#define MU_IMAP_CB_FIRST_UNSEEN 3
#define MU_IMAP_CB_UIDNEXT 4
#define MU_IMAP_CB_UIDVALIDITY 5
/* The following callbacks correspond to unsolicited server responses and
take two arguments: a response code (see MU_IMAP_RESPONSE, below) in
SDAT, and human-readable text string as returned by the server in PDAT.
The latter can be NULL. */
#define MU_IMAP_CB_OK 6
#define MU_IMAP_CB_NO 7
#define MU_IMAP_CB_BAD 8
#define MU_IMAP_CB_BYE 9
#define MU_IMAP_CB_PREAUTH 10
/* These corresponde to the tagged server responses. The calling convention
is the same as above. */
#define MU_IMAP_CB_TAGGED_OK 11
#define MU_IMAP_CB_TAGGED_NO 12
#define MU_IMAP_CB_TAGGED_BAD 13
/* FETCH callback. Arguments: SDAT - message sequence number, PDAT - a
list (mu_list_t) of union mu_imap_fetch_response (see below). */
#define MU_IMAP_CB_FETCH 14
#define _MU_IMAP_CB_MAX 15
typedef void (*mu_imap_callback_t) (void *, int code, size_t sdat, void *pdat);
void mu_imap_callback (mu_imap_t imap, int code, size_t sdat, void *pdat);
void mu_imap_register_callback_function (mu_imap_t imap, int code,
mu_imap_callback_t callback,
void *data);
#define MU_IMAP_RESPONSE_UNKNOWN 0
#define MU_IMAP_RESPONSE_ALERT 1
#define MU_IMAP_RESPONSE_BADCHARSET 2
#define MU_IMAP_RESPONSE_CAPABILITY 3
#define MU_IMAP_RESPONSE_PARSE 4
#define MU_IMAP_RESPONSE_PERMANENTFLAGS 5
#define MU_IMAP_RESPONSE_READ_ONLY 6
#define MU_IMAP_RESPONSE_READ_WRITE 7
#define MU_IMAP_RESPONSE_TRYCREATE 8
#define MU_IMAP_RESPONSE_UIDNEXT 9
#define MU_IMAP_RESPONSE_UIDVALIDITY 10
#define MU_IMAP_RESPONSE_UNSEEN 11
extern struct mu_kwd mu_imap_response_codes[];
/* FETCH Response Codes */
/* BODY[]<> */
#define MU_IMAP_FETCH_BODY 0
/* BODY & BODYSTRUCTURE */
#define MU_IMAP_FETCH_BODYSTRUCTURE 1
/* ENVELOPE */
#define MU_IMAP_FETCH_ENVELOPE 2
/* FLAGS */
#define MU_IMAP_FETCH_FLAGS 3
/* INTERNALDATE */
#define MU_IMAP_FETCH_INTERNALDATE 4
/* RFC822.SIZE */
#define MU_IMAP_FETCH_RFC822_SIZE 5
/* UID */
#define MU_IMAP_FETCH_UID 6
struct mu_imap_fetch_body
{
int type;
size_t *partv;
size_t partc;
char *section;
mu_list_t fields;
char *text;
};
struct mu_imap_fetch_bodystructure
{
int type;
struct mu_bodystructure *bs;
};
struct mu_imap_fetch_envelope
{
int type;
struct mu_imapenvelope *imapenvelope;
};
struct mu_imap_fetch_flags
{
int type;
int flags;
};
struct mu_imap_fetch_internaldate
{
int type;
struct tm tm;
struct mu_timezone tz;
};
struct mu_imap_fetch_rfc822_size
{
int type;
size_t size;
};
struct mu_imap_fetch_uid
{
int type;
size_t uid;
};
union mu_imap_fetch_response
{
int type;
struct mu_imap_fetch_body body;
struct mu_imap_fetch_bodystructure bodystructure;
struct mu_imap_fetch_envelope envelope;
struct mu_imap_fetch_flags flags;
struct mu_imap_fetch_internaldate internaldate;
struct mu_imap_fetch_rfc822_size rfc822_size;
struct mu_imap_fetch_uid uid;
};
#ifdef __cplusplus
}
#endif
#endif /* _MAILUTILS_IMAP_H */