Sample code for 30+ languages & platforms
Tcl

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 Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

# 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.
set mailman [new_CkMailMan]

# 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).
set sshHostname "sftp.example.com"
set sshPort 22

# Connect to an SSH server and establish the SSH tunnel:
set success [CkMailMan_SshOpenTunnel $mailman $sshHostname $sshPort]
if {$success == 0} then {
    puts [CkMailMan_lastErrorText $mailman]
    delete_CkMailMan $mailman
    exit
}

# 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.
set success [CkMailMan_SshAuthenticatePw $mailman "ssh_login" "ssh_password"]
if {$success == 0} then {
    puts [CkMailMan_lastErrorText $mailman]
    delete_CkMailMan $mailman
    exit
}

# 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
CkMailMan_put_MailHost $mailman "mail.my-pop3-server.com"

# Set the POP3 settings for your POP3 server:
CkMailMan_put_PopUsername $mailman "pop3_login"
CkMailMan_put_PopPassword $mailman "pop3_password"
CkMailMan_put_MailPort $mailman 995
CkMailMan_put_PopSsl $mailman 1

# Connect to the POP3 server through the already-established SSH tunnel:
set success [CkMailMan_Pop3BeginSession $mailman]
if {$success == 0} then {
    puts [CkMailMan_lastErrorText $mailman]
    delete_CkMailMan $mailman
    exit
}

# 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.
puts [CkMailMan_lastErrorText $mailman]

# How many messages are in the POP3 inbox?
set numToDownload [CkMailMan_GetMailboxCount $mailman]
if {$numToDownload > 5} then {
    set numToDownload 5
}

if {$numToDownload == 0} then {
    puts "No messages in the POP3 inbox."
    delete_CkMailMan $mailman
    exit
}

# Download a max of 5 messages

set email [new_CkEmail]

for {set i 1} {$i <= $numToDownload} {incr i} {
    set success [CkMailMan_FetchOne $mailman 0 0 $i $email]
    if {$success == 0} then {
        puts [CkMailMan_lastErrorText $mailman]
        delete_CkMailMan $mailman
        delete_CkEmail $email
        exit
    }

    puts [CkEmail_from $email]
    puts [CkEmail_subject $email]
    puts "----"
}

# Close the connection with the POP3 server, leaving the SSH tunnel open for subsequent POP3 connections.
set success [CkMailMan_Pop3EndSession $mailman]
if {$success == 0} then {
    puts [CkMailMan_lastErrorText $mailman]
    delete_CkMailMan $mailman
    delete_CkEmail $email
    exit
}

# Try connecting to a different POP3 server through the same aleady setup SSH tunnel:
# Set the POP3 server's hostname
CkMailMan_put_MailHost $mailman "mail.my-pop3-server2.com"

# Set the POP3 settings for your POP3 server:
CkMailMan_put_PopUsername $mailman "pop3_login2"
CkMailMan_put_PopPassword $mailman "pop3_password2"
CkMailMan_put_MailPort $mailman 110
CkMailMan_put_PopSsl $mailman 0

set success [CkMailMan_Pop3BeginSession $mailman]
if {$success == 0} then {
    puts [CkMailMan_lastErrorText $mailman]
    delete_CkMailMan $mailman
    delete_CkEmail $email
    exit
}

# Review the LastErrorText to see that the connection was made via the SSH tunnel:
puts [CkMailMan_lastErrorText $mailman]

set success [CkMailMan_Pop3EndSession $mailman]
if {$success == 0} then {
    puts [CkMailMan_lastErrorText $mailman]
    delete_CkMailMan $mailman
    delete_CkEmail $email
    exit
}

# Close the SSH tunnel.
set success [CkMailMan_SshCloseTunnel $mailman]
if {$success == 0} then {
    puts [CkMailMan_lastErrorText $mailman]
    delete_CkMailMan $mailman
    delete_CkEmail $email
    exit
}


delete_CkMailMan $mailman
delete_CkEmail $email