No description
Find a file
Jon Gjengset 1eab9c8375
Refine Travis CI build and add rustfmt/clippy
This patch modifies the Travis build pipeline to include multiple
[build stages](https://docs.travis-ci.com/user/build-stages/). CI now
progresses in the following steps:

 - First, `cargo check` is run on `stable` only.
   If it fails, the build is considered failed.
   This is so that we can fail fast for obviously botched commits.
 - Then, unit and doc tests are run for all targets.
   If any non-nightly tests fail, the build fails.
 - Then, integration tests with
   [GreenMail](http://www.icegreen.com/greenmail/) are run on Linux for
   all Rust targets. We can't run them on macOS because it doesn't
   support the Docker service.
   If any non-nightly tests fail, the build fails.
 - Then, `rustfmt` and `clippy` are both run on *beta* and on nightly.
   We use beta instead of stable to try to give ourselves some headroom
   for changes coming down the pike. The lints are only run on Linux,
   because the platform shouldn't matter.
   If any beta lints fail, the build fails.
 - And finally, we generate a coverage report on nightly on Linux.
   This can only run on nightly because tarpaulin requires nightly.
   It's only run on Linux, because we want to include integration tests.
   Note that the coverage stage has its own cache
   (`CACHE_NAME=coverage`) because the only thing it caches is cargo
   tarpaulin (the rust/cargo cache is cleaned before exit).

Fixes #48.
2018-11-24 14:17:29 -05:00
examples Clippy clean 2018-11-22 14:27:07 -05:00
src Make crate compile on Rust 1.26.2+ 2018-11-24 14:17:15 -05:00
tests Make sure tests get run by coverage 2018-11-22 20:56:41 -05:00
.gitignore Initial Commit 2015-04-15 16:23:58 -04:00
.travis.yml Refine Travis CI build and add rustfmt/clippy 2018-11-24 14:17:29 -05:00
appveyor.yml Don't run integration tests on appveyor 2018-11-22 20:56:41 -05:00
Cargo.toml Merge branch 'integration-testing' 2018-11-23 13:55:57 -05:00
LICENSE-APACHE Relicense as Apache 2.0 / MIT 2016-01-10 17:34:19 -05:00
LICENSE-MIT Relicense as Apache 2.0 / MIT 2016-01-10 17:34:19 -05:00
README.md Add testing instructions to README 2018-11-22 20:56:42 -05:00
README.tpl Add testing instructions to README 2018-11-22 20:56:42 -05:00

imap

Crate Version Documentation Crate License Build Status Build Status Coverage Status

This crate lets you connect to and interact with servers that implement the IMAP protocol (RFC 3501 and various extensions). After authenticating with the server, IMAP lets you list, fetch, and search for e-mails, as well as monitor mailboxes for changes.

To connect, use the [connect] function. This gives you an unauthenticated [Client]. You can then use [Client::login] or [Client::authenticate] to perform username/password or challenge/response authentication respectively. This in turn gives you an authenticated [Session], which lets you access the mailboxes at the server.

The documentation within this crate borrows heavily from the various RFCs, but should not be considered a complete reference. If anything is unclear, follow the links to the RFCs embedded in the documentation for the various types and methods and read the raw text there!

Below is a basic client example. See the examples/ directory for more.

extern crate imap;
extern crate native_tls;

fn fetch_inbox_top() -> imap::error::Result<Option<String>> {
    let domain = "imap.example.com";
    let tls = native_tls::TlsConnector::builder().build().unwrap();

    // we pass in the domain twice to check that the server's TLS
    // certificate is valid for the domain we're connecting to.
    let client = imap::connect((domain, 993), domain, &tls).unwrap();

    // the client we have here is unauthenticated.
    // to do anything useful with the e-mails, we need to log in
    let mut imap_session = client
        .login("me@example.com", "password")
        .map_err(|e| e.0)?;

    // we want to fetch the first email in the INBOX mailbox
    imap_session.select("INBOX")?;

    // fetch message number 1 in this mailbox, along with its RFC822 field.
    // RFC 822 dictates the format of the body of e-mails
    let messages = imap_session.fetch("1", "RFC822")?;
    let message = if let Some(m) = messages.iter().next() {
        m
    } else {
        return Ok(None);
    };

    // extract the message's body
    let body = message.body().expect("message did not have a body!");
    let body = std::str::from_utf8(body)
        .expect("message was not valid utf-8")
        .to_string();

    // be nice to the server and log out
    imap_session.logout()?;

    Ok(Some(body))
}

Running the test suite

To run the integration tests, you need to have GreenMail running. The easiest way to do that is with Docker:

$ docker pull greenmail/standalone:1.5.8
$ docker run -t -i -e GREENMAIL_OPTS='-Dgreenmail.setup.test.all -Dgreenmail.hostname=0.0.0.0 -Dgreenmail.auth.disabled -Dgreenmail.verbose' -p 3025:3025 -p 3110:3110 -p 3143:3143 -p 3465:3465 -p 3993:3993 -p 3995:3995 greenmail/standalone:1.5.8

License

Licensed under either of

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.