Rust邮件处理库email的使用,高效实现SMTP、IMAP和邮件解析功能

Rust邮件处理库email的使用,高效实现SMTP、IMAP和邮件解析功能

安装

在项目目录中运行以下Cargo命令:

cargo add email

或者在Cargo.toml中添加以下行:

email = "0.0.21"

基本使用示例

SMTP发送邮件示例

use email::email::Email;
use email::smtp::SmtpClient;

fn main() {
    // 创建邮件内容
    let email = Email::builder()
        .from("sender@example.com")
        .to("recipient@example.com")
        .subject("Test Email")
        .text("Hello, this is a test email!")
        .build()
        .unwrap();

    // 创建SMTP客户端
    let mut client = SmtpClient::new("smtp.example.com:587").unwrap();
    
    // 登录SMTP服务器
    client.login("username", "password").unwrap();
    
    // 发送邮件
    client.send(email).unwrap();
}

IMAP接收邮件示例

use email::imap::ImapClient;

fn main() {
    // 连接IMAP服务器
    let mut client = ImapClient::new("imap.example.com:993").unwrap();
    
    // 登录
    client.login("username", "password").unwrap();
    
    // 选择邮箱
    client.select("INBOX").unwrap();
    
    // 获取邮件列表
    let messages = client.fetch("1:*").unwrap();
    
    for message in messages {
        println!("Subject: {}", message.subject().unwrap());
        println!("From: {}", message.from().unwrap());
        println!("Body: {}", message.text().unwrap());
    }
}

邮件解析示例

use email::email::Email;
use std::fs;

fn main() {
    // 读取邮件文件
    let raw_email = fs::read_to_string("email.eml").unwrap();
    
    // 解析邮件
    let email = Email::parse(&raw_email).unwrap();
    
    println!("Subject: {}", email.subject().unwrap());
    println!("From: {}", email.from().unwrap());
    println!("To: {}", email.to().unwrap());
    
    if let Some(text) = email.text() {
        println!("Text Body: {}", text);
    }
    
    if let Some(html) = email.html() {
        println!("HTML Body: {}", html);
    }
    
    // 处理附件
    for attachment in email.attachments() {
        println!("Attachment: {} ({} bytes)", attachment.name(), attachment.size());
        fs::write(attachment.name(), attachment.data()).unwrap();
    }
}

完整示例代码

1. 发送带附件的邮件

use email::email::Email;
use email::smtp::SmtpClient;
use std::fs;

fn main() {
    // 创建邮件内容
    let email = Email::builder()
        .from("sender@example.com")
        .to("recipient@example.com")
        .subject("Email with Attachment")
        .text("Please find attached the document.")
        .attachment(
            "document.pdf", 
            "application/pdf", 
            &fs::read("document.pdf").unwrap()
        )
        .build()
        .unwrap();

    // 发送邮件
    let mut client = SmtpClient::new("smtp.example.com:587").unwrap();
    client.login("username", "password").unwrap();
    client.send(email).unwrap();
}

2. 接收并解析邮件

use email::imap::ImapClient;
use std::fs;

fn main() {
    // 连接IMAP服务器
    let mut client = ImapClient::new("imap.example.com:993").unwrap();
    client.login("username", "password").unwrap();
    client.select("INBOX").unwrap();
    
    // 获取最新5封邮件
    let messages = client.fetch("1:5").unwrap();
    
    for (i, message) in messages.iter().enumerate() {
        println!("Processing email {} of {}", i+1, messages.len());
        
        // 解析邮件
        let parsed = message.parse().unwrap();
        
        // 保存邮件内容
        fs::write(
            format!("email_{}.eml", i+1),
            parsed.raw()
        ).unwrap();
        
        // 保存附件
        for (j, attachment) in parsed.attachments().iter().enumerate() {
            fs::write(
                format!("attachment_{}_{}", i+1, j+1),
                attachment.data()
            ).unwrap();
        }
    }
}

3. 解析复杂的MIME邮件

use email::email::Email;
use email::mime::MimePart;

fn main() {
    // 假设这是包含多个MIME部分的邮件
    let raw_email = "..."; // 完整的邮件内容
    
    let email = Email::parse(raw_email).unwrap();
    
    // 遍历所有MIME部分
    for part in email.mime_parts() {
        match part.content_type() {
            "text/plain" => {
                println!("Text part: {}", part.body().unwrap());
            },
            "text/html" => {
                println!("HTML part: {}", part.body().unwrap());
            },
            ct if ct.starts_with("image/") => {
                println!("Image attachment: {}", part.filename().unwrap());
            },
            ct if ct.starts_with("application/") => {
                println!("Document attachment: {}", part.filename().unwrap());
            },
            _ => println!("Other part: {:?}", part.content_type())
        }
    }
}

这些示例展示了如何使用Rust的email库来处理SMTP发送、IMAP接收以及邮件解析功能。根据实际需求,你可以进一步扩展这些示例代码。


1 回复

Rust邮件处理库email的使用指南

email是一个功能强大的Rust库,提供了SMTP客户端、IMAP客户端和邮件解析功能,可以帮助开发者轻松实现邮件相关功能。

主要功能

  1. SMTP客户端功能
  2. IMAP客户端功能
  3. 邮件解析(MIME)功能
  4. 邮件构建功能

安装

Cargo.toml中添加依赖:

[dependencies]
email = "0.8.1"

基本使用方法

1. 邮件解析

use email::message::Message;

let raw_email = r#"From: sender@example.com
To: recipient@example.com
Subject: Test Email
Content-Type: text/plain; charset=utf-8

This is the email body."#;

let message = Message::parse(raw_email.as_bytes()).unwrap();

println!("From: {}", message.get_from().unwrap());
println!("To: {}", message.get_to().unwrap());
println!("Subject: {}", message.get_subject().unwrap());
println!("Body: {}", message.get_body().unwrap());

2. 构建邮件

use email::message::{Message, Mailbox};

let mut message = Message::new();
message.set_from(Mailbox::new("Sender Name", "sender@example.com"));
message.set_to(vec![Mailbox::new("Recipient Name", "recipient@example.com")]);
message.set_subject("Test Email");
message.set_body("This is the email body.");

let raw_email = message.to_string();
println!("{}", raw_email);

3. SMTP客户端发送邮件

use email::smtp::{SmtpClient, commands::*};
use std::net::TcpStream;

let mut stream = TcpStream::connect("smtp.example.com:25").unwrap();
let mut client = SmtpClient::new(stream);

// SMTP协议交互
client.command(Ehlo::new("localhost")).unwrap();
client.command(Mail::new("sender@example.com")).unwrap();
client.command(Rcpt::new("recipient@example.com")).unwrap();
client.command(Data).unwrap();

// 发送邮件内容
let message = "From: sender@example.com\r\n\
               To: recipient@example.com\r\n\
               Subject: Test\r\n\r\n\
               Hello from Rust!";
client.send_data(message.as_bytes()).unwrap();
client.command(Quit).unwrap();

4. IMAP客户端读取邮件

use email::imap::{ImapClient, commands::*};
use std::net::TcpStream;

let mut stream = TcpStream::connect("imap.example.com:143").unwrap();
let mut client = ImapClient::new(stream);

// IMAP协议交互
client.command(Login {
    username: "user@example.com",
    password: "password"
}).unwrap();

client.command(Select {
    mailbox: "INBOX"
}).unwrap();

// 获取前5封邮件的UID
let response = client.command(Fetch {
    sequence_set: "1:5",
    attributes: "UID"
}).unwrap();

println!("{}", response);

client.command(Logout).unwrap();

高级功能

处理MIME邮件

use email::message::{Message, MimePart};

let raw_email = r#"Content-Type: multipart/mixed; boundary="boundary"

--boundary
Content-Type: text/plain

This is the text part.

--boundary
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="example.txt"

File content here.
--boundary--"#;

let message = Message::parse(raw_email.as_bytes()).unwrap();

if let Some(parts) = message.get_parts() {
    for part in parts {
        println!("Content-Type: {}", part.get_content_type().unwrap());
        if part.is_text() {
            println!("Text content: {}", part.get_body().unwrap());
        } else if part.is_attachment() {
            println!("Attachment: {:?}", part.get_filename());
        }
    }
}

注意事项

  1. 对于生产环境,建议使用TLS加密连接
  2. 处理用户输入时要小心邮件头注入攻击
  3. 大附件处理时要注意内存使用

email库提供了强大而灵活的邮件处理能力,可以满足大多数邮件相关的开发需求。

完整示例demo

下面是一个完整的SMTP发送邮件示例,包含TLS加密连接:

use email::smtp::{SmtpClient, commands::*};
use native_tls::TlsStream;
use std::net::TcpStream;

fn send_email() -> Result<(), Box<dyn std::error::Error>> {
    // 建立TCP连接
    let stream = TcpStream::connect("smtp.example.com:465")?;
    
    // 创建TLS连接
    let connector = native_tls::TlsConnector::new()?;
    let tls_stream = connector.connect("smtp.example.com", stream)?;
    
    // 创建SMTP客户端
    let mut client = SmtpClient::new(TlsStream::from(tls_stream));
    
    // SMTP协议交互
    client.command(Ehlo::new("localhost"))?;
    client.command(Mail::new("sender@example.com"))?;
    client.command(Rcpt::new("recipient@example.com"))?;
    client.command(Data)?;
    
    // 构建邮件内容
    let mut message = email::message::Message::new();
    message.set_from(email::message::Mailbox::new("Sender", "sender@example.com"));
    message.set_to(vec![email::message::Mailbox::new("Recipient", "recipient@example.com")]);
    message.set_subject("Test Email with TLS");
    message.set_body("This is a secure email sent from Rust!");
    
    // 发送邮件
    client.send_data(message.to_string().as_bytes())?;
    client.command(Quit)?;
    
    Ok(())
}

fn main() {
    if let Err(e) = send_email() {
        eprintln!("Failed to send email: {}", e);
    }
}

这个完整示例演示了:

  1. 使用TLS加密的SMTP连接
  2. 构建完整的邮件消息
  3. 处理可能出现的错误
  4. 完整的SMTP协议交互流程

对于IMAP和邮件解析的完整使用,可以参考上面提供的基础示例进行扩展。

回到顶部