pub struct Client<T: Read + Write> { /* 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> Client<T>
impl<T: Read + Write> Client<T>
Sourcepub fn new(stream: T) -> Client<T>
pub fn new(stream: T) -> Client<T>
Creates a new client over the given stream.
For an example of how to use this method to provide a pure-Rust TLS integration, see the rustls.rs in the examples/ directory.
This method primarily exists for writing tests that mock the underlying transport, but can also be used to support IMAP over custom tunnels.
Note: In case you do need to use Client::new
over imap::connect
, you will need to
listen for the IMAP protocol server greeting before authenticating:
let mut client = Client::new(tls);
client.read_greeting().unwrap();
let session = client.login(username, password).unwrap();
Sourcepub fn login<U: AsRef<str>, P: AsRef<str>>(
self,
username: U,
password: P,
) -> Result<Session<T>, (Error, Client<T>)>
pub 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 client = imap::connect(
("imap.example.org", 993),
"imap.example.org",
&tls_connector).unwrap();
match client.login("user", "pass") {
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;
}
}
Sourcepub fn authenticate<A: Authenticator, S: AsRef<str>>(
self,
auth_type: S,
authenticator: &A,
) -> Result<Session<T>, (Error, Client<T>)>
pub 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.
extern crate imap;
extern crate native_tls;
use native_tls::TlsConnector;
struct OAuth2 {
user: String,
access_token: String,
}
impl imap::Authenticator for OAuth2 {
type Response = String;
fn process(&self, _: &[u8]) -> Self::Response {
format!(
"user={}\x01auth=Bearer {}\x01\x01",
self.user, self.access_token
)
}
}
fn main() {
let auth = OAuth2 {
user: String::from("me@example.com"),
access_token: String::from("<access_token>"),
};
let domain = "imap.example.com";
let tls = TlsConnector::builder().build().unwrap();
let client = imap::connect((domain, 993), domain, &tls).unwrap();
match client.authenticate("XOAUTH2", &auth) {
Ok(session) => {
// you are successfully authenticated!
},
Err((e, orig_client)) => {
eprintln!("error authenticating: {}", e);
// prompt user and try again with orig_client here
return;
}
};
}