Struct async_imap::Client

source ·
pub struct Client<T: Read + Write + Unpin + Debug> { /* private fields */ }
Expand description

An (unauthenticated) handle to talk to an IMAP server. This is what you get when first connecting. A succesfull call to Client::login or Client::authenticate will return a Session instance that provides the usual IMAP methods.

Implementations§

source§

impl<T: Read + Write + Unpin + Debug + Send> Client<T>

source

pub fn new(stream: T) -> Client<T>

Creates a new client over the given stream.

This method primarily exists for writing tests that mock the underlying transport, but can also be used to support IMAP over custom tunnels.

source

pub fn into_inner(self) -> T

Convert this Client into the raw underlying stream.

source

pub async fn login<U: AsRef<str>, P: AsRef<str>>( self, username: U, password: P ) -> Result<Session<T>, (Error, Client<T>)>

Log in to the IMAP server. Upon success a Session instance is returned; on error the original Client instance is returned in addition to the error. This is because login takes ownership of self, so in order to try again (e.g. after prompting the user for credetials), ownership of the original Client needs to be transferred back to the caller.


let tls = async_native_tls::TlsConnector::new();
let client = async_imap::connect(
    ("imap.example.org", 993),
    "imap.example.org",
    tls
).await?;

match client.login("user", "pass").await {
    Ok(s) => {
        // you are successfully authenticated!
    },
    Err((e, orig_client)) => {
        eprintln!("error logging in: {}", e);
        // prompt user and try again with orig_client here
        return Err(e);
    }
}
source

pub async fn authenticate<A: Authenticator, S: AsRef<str>>( self, auth_type: S, authenticator: A ) -> Result<Session<T>, (Error, Client<T>)>

Authenticate with the server using the given custom authenticator to handle the server’s challenge.

struct OAuth2 {
    user: String,
    access_token: String,
}

impl async_imap::Authenticator for &OAuth2 {
    type Response = String;
    fn process(&mut self, _: &[u8]) -> Self::Response {
        format!(
            "user={}\x01auth=Bearer {}\x01\x01",
            self.user, self.access_token
        )
    }
}


    let auth = OAuth2 {
        user: String::from("me@example.com"),
        access_token: String::from("<access_token>"),
    };

    let domain = "imap.example.com";
    let tls = async_native_tls::TlsConnector::new();
    let client = async_imap::connect((domain, 993), domain, tls).await?;
    match client.authenticate("XOAUTH2", &auth).await {
        Ok(session) => {
            // you are successfully authenticated!
        },
        Err((err, orig_client)) => {
            eprintln!("error authenticating: {}", err);
            // prompt user and try again with orig_client here
            return Err(err);
        }
    };

Methods from Deref<Target = Connection<T>>§

source

pub async fn read_response(&mut self) -> Option<Result<ResponseData>>

Read the next response on the connection.

source

pub async fn run_command_and_check_ok( &mut self, command: &str, unsolicited: Option<Sender<UnsolicitedResponse>> ) -> Result<()>

Execute a command and check that the next response is a matching done.

Trait Implementations§

source§

impl<T: Debug + Read + Write + Unpin + Debug> Debug for Client<T>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<T: Read + Write + Unpin + Debug> Deref for Client<T>

§

type Target = Connection<T>

The resulting type after dereferencing.
source§

fn deref(&self) -> &Connection<T>

Dereferences the value.
source§

impl<T: Read + Write + Unpin + Debug> DerefMut for Client<T>

source§

fn deref_mut(&mut self) -> &mut Connection<T>

Mutably dereferences the value.
source§

impl<T: Read + Write + Unpin + Debug> Unpin for Client<T>

Auto Trait Implementations§

§

impl<T> RefUnwindSafe for Client<T>
where T: RefUnwindSafe,

§

impl<T> Send for Client<T>
where T: Send,

§

impl<T> Sync for Client<T>
where T: Sync,

§

impl<T> UnwindSafe for Client<T>
where T: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more