use async_imap::error::{Error, Result};
use async_std::prelude::*;
use async_std::task;
use std::env;
fn main() -> Result<()> {
task::block_on(async {
let args: Vec<String> = env::args().collect();
if args.len() != 4 {
eprintln!("need three arguments: imap-server login password");
Err(Error::Bad("need three arguments".into()))
} else {
let res = fetch_inbox_top(&args[1], &args[2], &args[3]).await?;
println!("**result:\n{}", res.unwrap());
Ok(())
}
})
}
async fn fetch_inbox_top(imap_server: &str, login: &str, password: &str) -> Result<Option<String>> {
let tls = async_native_tls::TlsConnector::new();
let client = async_imap::connect((imap_server, 993), imap_server, tls).await?;
println!("-- connected to {}:{}", imap_server, 993);
let mut imap_session = client.login(login, password).await.map_err(|e| e.0)?;
println!("-- logged in a {}", login);
imap_session.select("INBOX").await?;
println!("-- INBOX selected");
let messages_stream = imap_session.fetch("1", "RFC822").await?;
let messages: Vec<_> = messages_stream.collect::<Result<_>>().await?;
let message = if let Some(m) = messages.first() {
m
} else {
return Ok(None);
};
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();
println!("-- 1 message received, logging out");
imap_session.logout().await?;
Ok(Some(body))
}