Entw.: Mail's verschicken mit IE und PHP

Um Mail's aus einem Programm heraus verschicken zu können, ist der Zugriff auf einem dezidierten SMTP-Mailserver notwendig. Besitzt man keinen direktem Zugriff auf einem solchen SMTP-Mailserver, so kann man den SMTP-Service eines Hosting-Anbieters nutzen. Dazu stellen die Hosting-Anbieter die PHP-Standardprogrammiersprache zur Verfügung, mit deren Hilfe der SMTP-Server des Anbieters angesprochen werden kann. Ist aufgrund der IT-Struktur eines Unternehmens eine HTTP-Tunnelung nicht möglich und verwendet dieses Unternehmen nur den Internet Exploxer als Standardbrowser, so kann der Internet Exploxer zur Kommunikation mit den PHP-Server verwendet werden.

Folgende Delphi-Methode zeigt diese IE-Tunnelung zum Erzeugen einer Mail mit Anhang.

unit uMail;
 
interface
 
procedure SendMailWithAttachment(const oWebBrowser: TWebBrowser;
              const sURLstring: string;
              const FromAddr, FromName,
                    ToAddr,   CCAddr,   BCCAddr,
                    Subject,  HtmlBody: String;
	      const arFileNames, arFileValues: array of string);
 
implementation
 
procedure SendMailWithAttachment(const oWebBrowser: TWebBrowser;
              const sURLstring: string;
              const FromAddr, FromName,
                    ToAddr,   CCAddr,   BCCAddr,
                    Subject,  HtmlBody: String;
	      const arFileNames, arFileValues: array of string);
var
 l_sName, l_sValue, l_sBoundary: string;
 l_sStrData, l_sFileData: AnsiString;
 l_oleFlags: OleVariant;
 l_olePostData: OleVariant;
 l_oleHeaders:  OleVariant;
 lng, idx, l_iLowBound, l_iHighBound, n: Integer;
 ms: TMemoryStream;
 ss: TStringStream;
 bs: TBytesStream;
begin
 if Length(arFileNames) <> Length(arFileValues) then
   raise EMailException.Create('SendMailWithAttachment: Dateinamen und Dateiwerte muessen die gleiche Anzahl besitzen.') ;
 //
 l_oleURL := 'about:blank';
 l_oleFlags := NavNoHistory or NavNoReadFromCache or NavNoWriteToCache or NavAllowAutosearch;
 oWebBrowser.Navigate2(l_oleURL, l_oleFlags) ;
 while oWebBrowser.ReadyState < READYSTATE_INTERACTIVE do
   Application.ProcessMessages;
 //
 l_sBoundary := '---------------------------123456789';
 //
 l_sStrData := '';
 l_sStrData := l_sStrData + '--' + l_sBoundary + #13#10 + 'Content-Disposition: form-data; name="FromAddr"' + #13#10#13#10 + FromAddr + #13#10;
 l_sStrData := l_sStrData + '--' + l_sBoundary + #13#10 + 'Content-Disposition: form-data; name="FromName"' + #13#10#13#10 + FromName + #13#10;
 l_sStrData := l_sStrData + '--' + l_sBoundary + #13#10 + 'Content-Disposition: form-data; name="ToAddr"' + #13#10#13#10 + ToAddr + #13#10;
 
 if Length(CCAddr) > 0 then begin
   l_sStrData := l_sStrData + '--' + l_sBoundary + #13#10 + 'Content-Disposition: form-data; name="CCAddr"' + #13#10#13#10 + CCAddr + #13#10;
 end;
 if Length(BCCAddr) > 0 then begin
   l_sStrData := l_sStrData + '--' + l_sBoundary + #13#10 + 'Content-Disposition: form-data; name="BCCAddr"' + #13#10#13#10 + BCCAddr + #13#10;
 end;
 l_sStrData := l_sStrData + '--' + l_sBoundary + #13#10 + 'Content-Disposition: form-data; name="Subject"'  + #13#10#13#10 + Subject + #13#10;
 l_sStrData := l_sStrData + '--' + l_sBoundary + #13#10 + 'Content-Disposition: form-data; name="HtmlBody"' + #13#10#13#10 + HtmlBody + #13#10;
 //
 for idx := Low(arFileNames) to High(arFileNames) do begin
   l_sName := arFileNames[idx];
   l_sValue := arFileValues[idx];
   l_sStrData := l_sStrData + '--' + l_sBoundary + #13#10 + 'Content-Disposition: form-data; name="' + l_sName + '"; filename="' + l_sValue + '"' + #13#10;
   if l_sValue = '' then begin
     l_sStrData := l_sStrData + 'Content-Transfer-Encoding: binary'#13#10#13#10;
   end
   else begin
     if (CompareText(ExtractFileExt(l_sValue), '.JPG')  = 0) or
        (CompareText(ExtractFileExt(l_sValue), '.JPEG') = 0) then begin
       l_sStrData := l_sStrData + 'Content-Type: image/pjpeg'#13#10#13#10;
     end
     else if (CompareText(ExtractFileExt(l_sValue), '.PNG') = 0) then begin
       l_sStrData := l_sStrData + 'Content-Type: image/x-png'#13#10#13#10;
     end
     else if (CompareText(ExtractFileExt(l_sValue), '.PDF') = 0) then begin
       l_sStrData := l_sStrData + 'Content-Type: application/pdf'#13#10#13#10;
     end
     else if (CompareText(ExtractFileExt(l_sValue), '.XLS') = 0) then begin
       l_sStrData := l_sStrData + 'Content-Type: application/vnd.ms-excel'#13#10#13#10;
     end
     else if (CompareText(ExtractFileExt(l_sValue), '.HTML') = 0) then begin
       l_sStrData := l_sStrData + 'Content-Type: text/html'#13#10#13#10;
     end
     else if (CompareText(ExtractFileExt(l_sValue), '.TXT') = 0) then begin
       l_sStrData := l_sStrData + 'Content-Type: text/plain'#13#10#13#10;
     end
     else begin
       raise EMailException.Create('SendMailWithAttachment: Typ des Anhangs unbekannt.') ;
     end;
     //
     ms := TMemoryStream.Create;
     try
       ms.LoadFromFile(l_sValue) ;
       ss := TStringStream.Create('') ;
       try
         ss.CopyFrom(ms, ms.Size) ;
         l_sStrData := l_sStrData + ss.DataString + #13#10;
       finally
         ss.Free;
       end;
     finally
       ms.Free;
     end;
   end;
   l_sStrData := l_sStrData + '--' + l_sBoundary + '--'#13#10;
 end;
 //--
 l_sStrData := l_sStrData + #0;
 lng := Length(l_sStrData);
 l_olePostData := VarArrayCreate([0, lng - 1], varByte) ;
 //
 l_iLowBound  := VarArrayLowBound(l_olePostData, 1);
 l_iHighBound := VarArrayHighBound(l_olePostData, 1);
 for idx := l_iLowBound to l_iHighBound do
   l_olePostData[idx] := 0;
 //
 for idx := l_iLowBound to l_iHighBound do begin
   l_olePostData[idx] := Ord(l_sStrData[idx+1]) ;
 end;
 l_oleFlags   := NavNoHistory or NavNoReadFromCache or NavNoWriteToCache or NavAllowAutosearch;
 l_oleHeaders := 'Content-Type: multipart/form-data; boundary=' + l_sBoundary + #13#10;
 oWebBrowser.Navigate2(sURLstring, l_oleFlags, EmptyParam, l_olePostData, l_oleHeaders);
end;
 
end.

Es sind immer Massnahmen notwendig, den nicht authorisierten Mail-Versand zu verhindern. Dazu gibt es in der einschlägigen Literatur viele mögliche Lösungen.


PHP-ScriptPHP-Script


Das nebenstehende PHP-Skriptgerüst zeigt den Umgang mit den übertragenden Daten auf der PHP-Serverseite.