PureBasic
PureBasic
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 PureBasic Downloads
IncludeFile "CkEmail.pb"
IncludeFile "CkMailMan.pb"
Procedure ChilkatExample()
success.i = 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.
mailman.i = CkMailMan::ckCreate()
If mailman.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; 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).
sshHostname.s = "sftp.example.com"
sshPort.i = 22
; Connect to an SSH server and establish the SSH tunnel:
success = CkMailMan::ckSshOpenTunnel(mailman,sshHostname,sshPort)
If success = 0
Debug CkMailMan::ckLastErrorText(mailman)
CkMailMan::ckDispose(mailman)
ProcedureReturn
EndIf
; 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.
success = CkMailMan::ckSshAuthenticatePw(mailman,"ssh_login","ssh_password")
If success = 0
Debug CkMailMan::ckLastErrorText(mailman)
CkMailMan::ckDispose(mailman)
ProcedureReturn
EndIf
; 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::setCkMailHost(mailman, "mail.my-pop3-server.com")
; Set the POP3 settings for your POP3 server:
CkMailMan::setCkPopUsername(mailman, "pop3_login")
CkMailMan::setCkPopPassword(mailman, "pop3_password")
CkMailMan::setCkMailPort(mailman, 995)
CkMailMan::setCkPopSsl(mailman, 1)
; Connect to the POP3 server through the already-established SSH tunnel:
success = CkMailMan::ckPop3BeginSession(mailman)
If success = 0
Debug CkMailMan::ckLastErrorText(mailman)
CkMailMan::ckDispose(mailman)
ProcedureReturn
EndIf
; 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.
Debug CkMailMan::ckLastErrorText(mailman)
; How many messages are in the POP3 inbox?
numToDownload.i = CkMailMan::ckGetMailboxCount(mailman)
If numToDownload > 5
numToDownload = 5
EndIf
If numToDownload = 0
Debug "No messages in the POP3 inbox."
CkMailMan::ckDispose(mailman)
ProcedureReturn
EndIf
; Download a max of 5 messages
i.i
email.i = CkEmail::ckCreate()
If email.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
For i = 1 To numToDownload
success = CkMailMan::ckFetchOne(mailman,0,0,i,email)
If success = 0
Debug CkMailMan::ckLastErrorText(mailman)
CkMailMan::ckDispose(mailman)
CkEmail::ckDispose(email)
ProcedureReturn
EndIf
Debug CkEmail::ckFrom(email)
Debug CkEmail::ckSubject(email)
Debug "----"
Next
; Close the connection with the POP3 server, leaving the SSH tunnel open for subsequent POP3 connections.
success = CkMailMan::ckPop3EndSession(mailman)
If success = 0
Debug CkMailMan::ckLastErrorText(mailman)
CkMailMan::ckDispose(mailman)
CkEmail::ckDispose(email)
ProcedureReturn
EndIf
; Try connecting to a different POP3 server through the same aleady setup SSH tunnel:
; Set the POP3 server's hostname
CkMailMan::setCkMailHost(mailman, "mail.my-pop3-server2.com")
; Set the POP3 settings for your POP3 server:
CkMailMan::setCkPopUsername(mailman, "pop3_login2")
CkMailMan::setCkPopPassword(mailman, "pop3_password2")
CkMailMan::setCkMailPort(mailman, 110)
CkMailMan::setCkPopSsl(mailman, 0)
success = CkMailMan::ckPop3BeginSession(mailman)
If success = 0
Debug CkMailMan::ckLastErrorText(mailman)
CkMailMan::ckDispose(mailman)
CkEmail::ckDispose(email)
ProcedureReturn
EndIf
; Review the LastErrorText to see that the connection was made via the SSH tunnel:
Debug CkMailMan::ckLastErrorText(mailman)
success = CkMailMan::ckPop3EndSession(mailman)
If success = 0
Debug CkMailMan::ckLastErrorText(mailman)
CkMailMan::ckDispose(mailman)
CkEmail::ckDispose(email)
ProcedureReturn
EndIf
; Close the SSH tunnel.
success = CkMailMan::ckSshCloseTunnel(mailman)
If success = 0
Debug CkMailMan::ckLastErrorText(mailman)
CkMailMan::ckDispose(mailman)
CkEmail::ckDispose(email)
ProcedureReturn
EndIf
CkMailMan::ckDispose(mailman)
CkEmail::ckDispose(email)
ProcedureReturn
EndProcedure