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-Script
Das nebenstehende PHP-Skriptgerüst zeigt den Umgang mit den übertragenden Daten auf der PHP-Serverseite.
Copyright © 10.11.2012 hadv.de. All Rights Reserved.