Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

POP3 over Multiple Hop SSH

Demonstrates how to read POP3 email (using TCP or TLS) tunneled through mulitple-hop SSH. The scheme looks like this:
Application => ServerSSH1 => ServerSSH2 => POP3Server

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.MailMan,
  Chilkat.Email,
  Chilkat.Ssh;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  ssh1: TSsh;
  ssh2: TSsh;
  mailman: TMailMan;
  numMessages: Integer;
  email: TEmail;
  i: Integer;

begin
  success := False;

  //  This example requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  ssh1 := TSsh.Create;

  //  Connect directly to the 1st SSH server.
  success := ssh1.Connect('serverssh1.com',22);
  if (success = False) then
    begin
      WriteLn(ssh1.LastErrorText);
      Exit;
    end;

  //  Authenticate using login/password:
  success := ssh1.AuthenticatePw('ssh1Login','ssh1Password');
  if (success = False) then
    begin
      WriteLn(ssh1.LastErrorText);
      Exit;
    end;

  //  Connect through the 1st SSH connection to reach a 2nd SSH server.
  //  Note: Any number of SSH connections may be simultaneously tunneled through a single
  //  existing SSH connection.
  ssh2 := TSsh.Create;
  success := ssh2.ConnectThroughSsh(ssh1,'serverssh2.com',22);
  if (success = False) then
    begin
      WriteLn(ssh2.LastErrorText);
      Exit;
    end;

  //  Authenticate with ssh2...
  success := ssh2.AuthenticatePw('ssh2Login','ssh2Password');
  if (success = False) then
    begin
      WriteLn(ssh2.LastErrorText);
      Exit;
    end;

  mailman := TMailMan.Create;

  //  Tell the mailman object to connect to the POP3 server though the ssh2 tunnel (which itself is routed through ssh1).
  //  The connection looks like this:  Application => ServerSSH1 => ServerSSH2 => POP3Server
  success := mailman.UseSsh(ssh2);
  if (success = False) then
    begin
      WriteLn(mailman.LastErrorText);
      Exit;
    end;

  //  Set the POP3 server's hostname
  mailman.MailHost := 'pop.example.com';

  //  Set the POP3 login/password.
  mailman.PopUsername := 'myLogin';
  mailman.PopPassword := 'myPassword';

  //  Establish the POP3 connection through the ssh2 tunnel.
  success := mailman.Pop3BeginSession();
  if (success = False) then
    begin
      WriteLn(mailman.LastErrorText);
      Exit;
    end;

  //  Get the number of messages in the mailbox.
  numMessages := mailman.GetMailboxCount();

  email := TEmail.Create;
  i := 1;
  while i <= numMessages do
    begin
      //  Fetch by the message number (not by the UIDL)
      success := mailman.FetchOne(False,0,i,email);
      if (success = False) then
        begin
          WriteLn(mailman.LastErrorText);
          Exit;
        end;

      WriteLn(email.From + ': ' + email.Subject + #10);

      i := i + 1;
    end;

  //  Close the connection with the POP3 server.  (This closes the tunnel through ssh2)
  //  The connection with ssh2 is still alive, and may be used for more connections.
  success := mailman.Pop3EndSession();

  //  Close the connection with ssh2.  (This closes the the tunnel through ssh1.)
  //  The connection with ssh1 is still alive, and may be used for more connections.

  ssh2.Disconnect();

  ssh1.Disconnect();


  ssh1.Free;
  ssh2.Free;
  mailman.Free;
  email.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.