Matthew Hipkin
CGI mailform using FreePascal
Download: http://www.matthewhipkin.co.uk/programs/mailform-example.zip
The first in a series of examples using FreePascal in a CGI environment.
A simple mail form that extracts the POSTed variables and sends an e-mail to the specified address.
Compile for the server OS, upload to cgi-bin directory and enjoy.
program mailform; {$mode objfpc}{$H+} // Requires synapse libraries from http://www.ararat.cz/synapse/doku.php/start uses Classes, smtpsend, synacode; { Compile command line: fpc mailform.pas -Fupath/to/synapse -omailform.cgi } type TArray = array of AnsiString; const TARGETMAIL = 'me@myaddress.com'; TARGETHOST = '127.0.0.1'; // Most hosting will have an SMTP server, TARGETPORT = '25'; // so no need to connect elsewhere var postVar: AnsiString; postItems: TArray; c: Char; x: integer; name: String; email: String; message: TStrings; lTmp: String; rTmp: AnsiString; s: TSMTPSend; // explode function from http://www.jasonwhite.co.uk/delphi-explode-function-like-php-explode/ function explode(cDelimiter, sValue : string; iCount : integer) : TArray; var s : string; i,p : integer; begin s := sValue; i := 0; while length(s) > 0 do begin inc(i); SetLength(result, i); p := pos(cDelimiter,s); if ( p > 0 ) and ( ( i < iCount ) OR ( iCount = 0) ) then begin result[i - 1] := copy(s,0,p-1); s := copy(s,p + length(cDelimiter),length(s)); end else begin result[i - 1] := s; s := ''; end; end; end; begin // Process post variables postVar := ''; while not eof(input) do begin read(c); postVar := postVar + c; end; // Output content type header writeln('Content-Type:text/html',#10#13); // Output HTML writeln('<!DOCTYPE html>'); writeln('<html>'); writeln('<head>'); writeln(' <title>Mail form example</title>'); writeln('</head>'); writeln('<body>'); // If postVar isn't empty then the form has been submitted. if postVar <> '' then begin // Create objects s := TSMTPSend.Create; message := TStringList.Create; // Split post variables into an array postItems := explode('&',postVar,0); // Process array, extract the name, email and message fields for x := 0 to High(postItems) do begin lTmp := Copy(postItems[x],1,Pos('=',postItems[x])-1); rTmp := Copy(postItems[x],Pos('=',postItems[x])+1,Length(postItems[x])); if lTmp = 'name' then name := DecodeURL(rTmp); if lTmp = 'email' then email := DecodeURL(rTmp); if lTmp = 'message' then message.Text := DecodeURL(rTmp); end; // Configure SMTP object s.TargetHost := TARGETHOST; s.TargetPort := TARGETPORT; // Connect to SMTP server if s.Login then begin // Send the message s.MailFrom(name+' <'+email+'>', Length(name+' <'+email+'>')); s.MailTo(TARGETMAIL); s.MailData(message); s.Logout; writeln(' <p>Thank you, your message has been sent.</p>'); end; // Clean up s.Free; message.Free; end else begin // POST variable is empty, display the form writeln(' <form name="mailform" method="post">'); writeln(' <table>'); writeln(' <tr><td>Name</td><td><input type="text" name="name"></td></tr>'); writeln(' <tr><td>E-mail</td><td><input type="text" name="email"></td></tr>'); writeln(' <tr><td colspan="2"><textarea name="message"></textarea></td></tr>'); writeln(' <tr><td colspan="2"><input type="submit" name="submit" value="Send"></td></tr>'); writeln(' </table>'); writeln(' </form>'); end; writeln('</body>'); writeln('</html>'); end.blog comments powered by Disqus