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