Rust Requires Chilkat v11.0.0+
Rust
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
// 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;
}