v. 2 [2006-09-13]

nerd 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
subjectchar(100)
bildtextchar(100)
textchar(200)
anlantdatatime
bildmediumtext
is_bildenum('ja','nej')
tb_antalposter 

Namn

Datatyp

nyckel (primary key)int
tabelltinyint
antalposterint
  
  
  
  

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 - 2017 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.

GNU General Public License version 2.0