v. 2 [2006-09-13] Förutsättningar Jag har använt Sendmail, PHP och MySQL. Du måste kunna komma åt inställningarna för Sendmail. Kunna köra någon databas och servern måste ha PHP installerat. PHP skall vara kompilerat för CLI, 'Command Line Interface'. Är det kompilerat för CGI gör man på ett annat sätt. Det tar jag inte upp här. (Det liknar hur man gör med till exempel Perl) För att ta reda på hur PHP är kompilerat kör du: $>php -v Står det sedan något som liknar: PHP (cli) (built: May 8 2006 23:54:39) Är allt OK. Inställningar på servern Sendmail Du lägger till ett e-postalias i filen '/etc/mail/aliases' tst: " /usr/local/bin/php /path_to_script/mitt_script.php" Apostroferna skall vara med. Du skapar ett e-postalias 'tst', all post till 'tst@my_domain.com' kommer nu med hjälp av ' ' (pipe) tecknet att skickas till skriptet 'mitt_script.php'. sedan måste du köra: $>newaliases För att generera en databasfil ('aliases.db') från textfilen 'aliases'. Glöm inte att starta om sendmail efteråt. (Slackware: '/etc/rc.d/rc.sendmail restart'). PHP 'mitt_script.php' måste vara körbart, detta åstadkommer du med kommandot: $>chmod 755 mitt_script.php lägg om möjligt skriptet i en katalog som inte andra kommer åt. Inte i 'public_html' där det kan nås av hela världen.
Skriptet Överst i 'mitt_script.php' skall det stå: #!/usr/local/bin/php Detta för att tala om vilket program som skall köra skriptet. (Pröva med "$>whereis php" för att kolla var php finns i din distrubition) Innanför <?php och?> skriver du själva skriptet. // För PHP > 5 (OBS! har du äldre php så får du skriva lite annorlunda) $fd = fopen("php://stdin", "r"); //Öppnar en ström för läsning $alltx = stream_get_contents($fd); //hela e-postbrevet hamnar i '$alltx' $allt=utf8_decode($alltx); //jag får min e-post kodad enligt UTF-8 //Nu skall den dekodas innan den hamnar i databasen fclose($fd) //Strömmen stängs Sedan söker jag efter markörer i texten för att hitta det som är intressant, i detta fall själva bilden: $bild_start = strpos($alltx,"/9j"); //Första positionen för '/9j' $bild_slut = strpos($alltx,"/9k"); //Första positionen för '/9k' $bild = trim(substr($alltx,$bild_start-1,($bild_slut-$bild_start+4))); //Bilden börjar och slutar med detta, så däremellan ligger bilden //Observera att här används '$allt' inte '$alltx', bilden är //inte kodad med UTF-8 //trim() tar bort oönskade radbrytningar i början och i slutet Nu har vi fångat bilden i en variabel '$bild', nu skall den hamna i en databas. Du gör på samma sätt med annat som du vill ha med, tillexempel 'subject', 'bildtext' mm. Bilden, som består av en massa tecken, är kodad med 'Base64'. Det innebär att ett talsystem med basen 64 används för att lagra informationen. Vi använder ju normalt basen 10. Tryckbara ASCII tecken används vid kodningen. Problemet är att Microsoft Internet Explorer inte klarar detta. Man måste använda en modernare webbläsare, till exempel Firefox eller Opera. kolla ett exempel
För att alla webbläsare skall klara av det här kan man ta hjälp av PHP echo "<img src=\"bild.php?img=".$rad['nyckel']."\" border=\"0\" alt=\"\" />"; //Här låter man 'bild.php' ladda in bilden. img får värdet av aktuell nyckel. //På så sätt laddas rätt bild. I filen 'bild.php' ser det ut så här: <?php // open database connection $connection = mysql_connect("localhost", "user", "password") or die ("Error 1 get_photos: ".mysql_error()); mysql_select_db("phone_mail"); $img = $_REQUEST['img']; //Hämtas variabeln från index2.php' // Här kommer besked om vilken bild som efterfrågas. $sql = "SELECT bild FROM tb_phone WHERE nyckel='$img'" or die ("Error 2 get_photos: ".mysql_error()); $result = mysql_query("$sql") or die ("Error 3 get_photos: ".mysql_error()); if ($rad=mysql_fetch_assoc($result)) { $encodeddata = $rad['bild']; } mysql_close($connection); echo base64_decode($encodeddata); // 'echo' till <img> taggen där begäran gjordes.?> Jag vill kunna formatera utskriften på skärmen, när bilderna visas. Därför har jag lagt in lite egna markörer när jag skickar från telefonen: I texten (på telefonen) skriver jag: <rubrik> </rubrik> <bildtext> </bildtext> <text> </text>
På detta sätt får jag en bra formatering. Detta sparas som en mall. Det gör det lätt när man skall skicka igen. Det är också lätt att hitta dessa markörer. Enda nackdelen är om man vill kunna skicka text som ser precis så här ut. $subject_start = strpos($allt,"<rubrik>"); $subject_slut = strpos($allt,"</rubrik>"); $subject = trim(substr($allt,$subject_start+8,($subject_slut- $subject_start-8))); sv_bokstavar(&$subject); //trim() tar bort oönskade radbrytningar i början och i slutet Sedan är det bara att leta reda på det som finns mellan taggarna med 'stpos()' och 'substr()'. function sv_bokstavar($str) { $str=str_replace("=c3=a5","å",$str); $str=str_replace("=c3=a4","ä",$str); $str=str_replace("=c3=b6","ö",$str); $str=str_replace("=c3=85","å",$str); $str=str_replace("=c3=84","ä",$str); $str=str_replace("=c3=96","ö",$str); } Av någon anledning, som jag inte förstår fungerar inte UTF-8 kodningen när jag skickar en bild från mobiltelefonen. Därför denna 'workaround'. Om jag bara skickar text och ingen bild fungerar det som det skall utan denna funktion. Databaser Jag har använt en databas med två tabeller, en tabell med bilden och texten. En annan tabell som håller reda på hur många bilder som finns. OBS! Använd 'mediumtext' för bilden, så att den får plats. tb_phone Namn Datatyp nyckel (primary key) int subject char(100) bildtext char(100) text char(200) anlant datatime bild mediumtext is_bild enum('ja','nej') tb_antalposter Namn Datatyp nyckel (primary key) int tabell tinyint antalposter int Ladda ner alla_filer.zip alla_filer.tar.gz tele_mail.php (skriptet som läser in e-posten) bild.php (skriptet som läser in bilden från db) index2.php (vanliga användarfilen) admin.php (administration, du kan ändra och ta bort) denna info i pdf-format
Licens 2006 Ingemar Ceicer Licensierat under GNU General Public License This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. http://www.gnu.org/licenses/gpl.txt