Fetching emails from Gmail using (mainly) the Rust standard library
我想使用Rust来获取我的GMail电子邮件。
我目前正在使用rust-openssl库和标准库中的
我遇到的问题很简单:以下代码在
尽管如此,当对另一个URL执行HTTP请求时,它仍然可以完美地工作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | extern crate openssl; use std::io::{IoResult, TcpStream}; use openssl::ssl::{SslContext, Sslv23, SslStream, SslVerifyPeer}; pub struct GmailSocket { _stream: SslStream<TcpStream> } impl GmailSocket { pub fn connect() -> IoResult<GmailSocket> { let tcpstream = try!(TcpStream::connect("imap.gmail.com", 993)); let mut sslcontext = SslContext::new(Sslv23); match sslcontext.set_CA_file("./cert.pem") { None => {}, Some(e) => fail!("{}", e) } sslcontext.set_verify(SslVerifyPeer, None); let sslstream = SslStream::new(&sslcontext, tcpstream); Ok(GmailSocket {_stream: sslstream}) } pub fn login(&mut self, username: &str, password: &str) -> IoResult<bool> { let req = format!("L01 LOGIN {:s} {:s} ", username, password); try!(self._stream.write_str(req.as_slice())); println!("0"); match try!(self._stream.read_to_string()) { res => println!("{}", res) } println!("1"); Ok(true) } } fn main() { let mut gmail_socket = match GmailSocket::connect() { Ok(s) => s, Err(e) => fail!("{}", e) }; gmail_socket.login("[email protected]","password"); } |
问题是否出自SSL认证文件,IMAP请求的格式,代码或自身使用的方法? OAuth是否必须执行此类任务?
此外,
1 2 | openssl req -x509 -nodes -days 365 \ -newkey rsa:1024 -keyout cert.pem -out cert.pem |
由于此练习的主要目的是教育性的活动,因此我想避免使用rust-http。
我会调查imap板条箱。
我认为您的问题来自遵循特定协议的IMAP请求的格式。
使用imap板条箱,您可以轻松地通过SSL连接到收件箱,如下所示:
1 2 3 4 5 6 7 8 | fn connect_to_email() -> IMAPStream { match IMAPStream::connect("imap.gmail.com", 993, Some(SslContext::new(SslMethod::Sslv23).unwrap())) { Ok(s) => s, Err(e) => panic!("connect to email {}", e), } } |
然后,要实际获取电子邮件,您可以选择一个文件夹,然后获取适当的文本:
1 2 3 | imap_socket.select("INBOX") imap_socket.fetch(str_num,"BODY[TEXT]") imap_socket.fetch(str_num,"BODY[HEADER]") |
其中