Lua Requires Chilkat v11.0.0+
Lua
IMAP SSH Tunneling (Port Forwarding)
Demonstrates how to setup and use an SSH tunnel for IMAP.Chilkat Lua Downloads
-- In the following call to loadlib, change the path (./chilkat.dll) to the relative or absolute directory where the chilkat.dll, chilkat.so, or chilkat.dylib is located.
chilkat = assert(package.loadlib("./chilkat.dll", "luaopen_chilkat"))()
print(chilkat._VERSION)
local success = false
-- This example assumes the Chilkat API to have been previously unlocked.
-- See Global Unlock Sample for sample code.
local imap = chilkat.newImap{}
-- 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).
local sshHostname = "www.mysshserver.com"
local sshPort = 22
-- Connect to an SSH server and establish the SSH tunnel:
success = imap:SshOpenTunnel(sshHostname,sshPort)
if success == false then
print(imap:LastErrorText())
end
-- 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 IMAP server, it is
-- for authenticating with the SSH server, which is separate.
success = imap:SshAuthenticatePw("mySshLogin","mySshPassword")
if success == false then
print(imap:LastErrorText())
end
-- OK, the SSH tunnel is setup. The IMAP component may
-- be used exactly the same as usual, except all communications
-- are sent through the SSH tunnel.
-- Connect to an IMAP server via the SSH tunnel.
-- Because the SSH tunnel has been previously setup,
-- this does not establish a direct connection with the IMAP
-- server. It directs the SSH server to establish the connection.
-- In this example, the IMAP server requires SSL/TLS. The TLS connection
-- will be enclosed within the SSH tunnel.
imap:setSsl(true)
imap:setPort(993)
success = imap:Connect("imap.my-imap-server.com")
if success == false then
print(imap:LastErrorText())
end
-- Authenticate with the IMAP server via the SSH tunnel.
success = imap:Login("myLogin","myPassword")
if success == false then
print(imap:LastErrorText())
end
-- Select an IMAP mailbox
success = imap:SelectMailbox("Inbox")
if success == false then
print(imap:LastErrorText())
end
-- How many messages in Inbox?
local msgCount = imap:NumMessages()
if msgCount == 0 then
print("No messages found.")
end
local upperBound = 10
if msgCount < upperBound then
upperBound = msgCount
end
-- Download up to the 1st 10 messages.
local email = chilkat.newEmail{}
local bUid = false
for i = 1, upperBound do
success = imap:FetchEmail(false,i,bUid,email)
if success == false then
print(imap:LastErrorText())
end
print(email:From())
print(email:Subject())
print("----")
end
-- Disconnect from the IMAP server.
-- The SSH tunnel remains open.
success = imap:Disconnect()
if success == false then
print(imap:LastErrorText())
end
-- It is possible to re-use the existing SSH tunnel for the next connection:
success = imap:Connect("imap.my-imap-server2.com")
if success == false then
print(imap:LastErrorText())
end
-- Review the LastErrorText to see that the connection was made via the SSH tunnel:
print(imap:LastErrorText())
success = imap:Disconnect()
if success == false then
print(imap:LastErrorText())
end
-- Finally, close the SSH tunnel.
success = imap:SshCloseTunnel()
if success == false then
print(imap:LastErrorText())
end
print("IMAP SSH tunneling example completed.")