Sample code for 30+ languages & platforms
Rust Requires Chilkat v11.0.0+

POP3 SSH Tunneling (Port Forwarding)

Demonstrates how to connect to a POP3 server through an SSH tunnel. Reads a POP3 mailbox and display the FROM and SUBJECT header fields of each email.

Chilkat Rust Downloads

Rust

// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.

// The mailman object is used for receiving (POP3) 
// and sending (SMTP) email.
let mailman = chilkat::MailMan::new();

// The SSH hostname may be a hostname or an 
// IP address, such as "192.168.1.108".
// The port is typically 22 (the standard port for SSH).
let ssh_hostname = "sftp.example.com".to_string();
let ssh_port = 22;

// Connect to an SSH server and establish the SSH tunnel:
if mailman.ssh_open_tunnel(&ssh_hostname, ssh_port).is_err() {
    println!("{}", mailman.last_error_text());
    return;
}

// Authenticate with the SSH server via a login/password
// or with a public key.
// This example demonstrates SSH password authentication.
// Note: This is not authenticating with the POP3 server, it is
// for authenticating with the SSH server, which is separate.
if mailman.ssh_authenticate_pw("ssh_login", "ssh_password").is_err() {
    println!("{}", mailman.last_error_text());
    return;
}

// OK, the SSH tunnel is setup.  The mailman may
// be used exactly the same as usual, except all communications
// are now sent through the SSH tunnel.

// The SSH tunnel may be kept open for any number of 
// POP3 connections.  

// Set the POP3 server's hostname
mailman.set_mail_host("mail.my-pop3-server.com");

// Set the POP3 settings for your POP3 server:
mailman.set_pop_username("pop3_login");
mailman.set_pop_password("pop3_password");
mailman.set_mail_port(995);
mailman.set_pop_ssl(true);

// Connect to the POP3 server through the already-established SSH tunnel:
if mailman.pop3_begin_session().is_err() {
    println!("{}", mailman.last_error_text());
    return;
}

// A visual inspection of the LastErrorText after
// a successful POP3 connection will confirm the SSH tunneling.
// Note: If the POP3 connection uses SSL/TLS, then the SSL/TLS 
// secure channel will be wrapped within the SSH tunnel.
println!("{}", mailman.last_error_text());

// How many messages are in the POP3 inbox?
let mut num_to_download = mailman.get_mailbox_count();
if num_to_download > 5 {
    num_to_download = 5;
}

if num_to_download == 0 {
    println!("No messages in the POP3 inbox.");
    return;
}

// Download a max of 5 messages
let email = chilkat::Email::new();
for i in 1..=num_to_download {
    if mailman.fetch_one(false, 0, i, &email).is_err() {
        println!("{}", mailman.last_error_text());
        return;
    }

    println!("{}", email.from());
    println!("{}", email.subject());
    println!("----");
}

// Close the connection with the POP3 server, leaving the SSH tunnel open for subsequent POP3 connections.
if mailman.pop3_end_session().is_err() {
    println!("{}", mailman.last_error_text());
    return;
}

// Try connecting to a different POP3 server through the same aleady setup SSH tunnel:
// Set the POP3 server's hostname
mailman.set_mail_host("mail.my-pop3-server2.com");

// Set the POP3 settings for your POP3 server:
mailman.set_pop_username("pop3_login2");
mailman.set_pop_password("pop3_password2");
mailman.set_mail_port(110);
mailman.set_pop_ssl(false);

if mailman.pop3_begin_session().is_err() {
    println!("{}", mailman.last_error_text());
    return;
}

// Review the LastErrorText to see that the connection was made via the SSH tunnel:
println!("{}", mailman.last_error_text());

if mailman.pop3_end_session().is_err() {
    println!("{}", mailman.last_error_text());
    return;
}

// Close the SSH tunnel.
if mailman.ssh_close_tunnel().is_err() {
    println!("{}", mailman.last_error_text());
    return;
}