Kirjoittaja Aihe: Apache, PHP, postit lähtemään php-lomakkeesta  (Luettu 1561 kertaa)

ajaaskel

  • Palvelimen ylläpitäjä
  • Käyttäjä
  • Viestejä: 3401
    • Profiili
Testikone pystyyn

Tarvitsin testikoneen jossa Apache PHP: llä.  Tuo on helppo ja nopea pystyttää (Ubuntu/Mint/...) vaikka näin:

Koodia: [Valitse]
sudo apt-get install apache2-mpm-prefork && sudo apt-get install php5
Oletuksena tuo jakelee /var/www kansion sisältöä julkisuuteen mutta ylläpidon mukavuuden takia olen muuttanut jaettavan kansion oman kotihakemistoni alle tähän tyyliin:

Koodia: [Valitse]
sudo service apache2 stop; mkdir -p ~/www; sudo chown $USER:www-data ~/www; sudo chmod 2755 ~/www; sudo cp /var/www/index.html ~/www ; sudo rm /var/www/index.html; sudo rmdir /var/www; sudo ln -s -T  ~/www /var/www; sudo service apache2 start
Laitoin www-hakemiston ryhmäksi "www-data" ja määrittelin hakemisto-oikeuden periytymään (2755)
jolloin webbipalvelin pystyy näyttämään tiedoston vaikka se olisi kopioitu tuonne "root" oikeuksilla.

Oliko se näin helppoa ja aikaakin meni ehkä minuutin verran ?  

No voit toki:

1) tarkastaa että Apache toimii, avaa webbiselain ja kirjoita linkkikenttään
Koodia: [Valitse]
localhostPitäisi näkyä "It works!".

2) tarkastaa että PHP toimii tekemällä editorilla koetiedoston:

Koodia: [Valitse]
gedit ~/www/phptiedot.php
kopioit sinne tämän:

Koodia: [Valitse]
<?php phpinfo(); ?>
ja talletat.  Sitten vain webbiselaimella linkiksi:

Koodia: [Valitse]
localhost/phptiedot.php
niin pitäisi näkyä versiotiedot ja polut PHP: stä.  

Noista poluista tulikin mieleen yksi juttu minkä havaitseminen voi säästää pieneltä ihmettelyltä. PHP5: llä on kaksi erillistä "php.ini" tiedostoa:  
1) Kun ajat jotain php-juttua Apachella se käyttää asetuksia /etc/php5/apache2/php.ini tiedostosta.  
2) Kun ajat päätteessä se käyttää asetuksia /etc/php5/cli/php.ini tiedostosta.  

Sähköpostit ulospäin

Edellä oleva oli oikeastaan johdanto eli tavanomaista tarinaa, sähköpostin lähetys PHP: stä on se varsinainen kiinnostava asia.   Kaikki varmaan heti tietävät ehdottaa/tarjota SMTP: tä tuohon mutta mitä se tarkasti ottaen tarkoittaa käytännössä ?   Jo sanonta "postipalvelimen asennus" karkoittaa innokkaimmatkin apuvoimat lähistöltä kun aikaisemmissa muistoissa on dns-tietueiden määrittely, ym.   lisäpuuha :)  
Katselin hieman uteliaisuudesta asiaa läpi ja tuon ei lainkaan tarvitse olla monimutkaista.  Lähetin huvikseni pelkällä Telnet yhteydellä päätteestä koeviestin postipalvelimelle, hyvin lähti. Samoin pieni koeskripti lähetteli postia ongelmitta.  Täydellisessä postipalvelimessa on paljon turhaa jota emme tarvitse siihen että voimme lähettää sähköpostiviestinä vaikkapa yhteydenottolomakkeeseen syötetyt tiedot omasta PHP-koodistamme.  Riittää että meillä on SMTP-client joka osaa muodostaa yhteyden "oikeaan" postipalvelimeen ja lähettää viestin.  
PHP: lle näyttää olevan ominaista että se oletuksena yrittää Linuxissa käyttää "sendmail" toimintoa postin lähetykseen.  "sendmail" ei useimmilla kuitenkaan ole asennettuna/konffattuna mutta onneksi sitä ei välttämättä tarvitakaan vaan tuohon riittää täysin mikä hyvänsä ohjelma joka osaa pelkästään lähettää viestin ("MTA relay").   Postin lähetys voidaan kääntää PHP: n asetustiedostossa "php.ini" minne halutaan eli aivan muulle ohjelmalle kuin "sendmail".  
Näitä "lähetys pelkästään" -ohjelmia on valmiina paljon, esimerkkeinä ssmtp, msmtp, esmtp,nullmailer, dma.  Kokeilin ensin ssmtp: tä, tuossa on vikoja/ongelmia kentissä joten hylkäsin sen. Seuraavaksi kokeeseen pääsi msmtp.  Harmitti hieman tuon dokumentaatio, sata kilometriä kirjoitettu kaikkea mutta lyhyttä täsmällistä kuvausta perusasetuksista ei saa esiin.  No, selvisihän tuo idea lukemalla joukon muita lähteitä ja alkoi hankaluuksien jälkeen toimia kun tajusin että toisen lähteen dokumentaatiossa on virhe.  msmtp on ihan käyttökelpoinen, en havainnut siinä kuin yhden vähäisen puutteen kenttien käytössä mitä en ole vielä ratkaissut.  Viestit lähtevät ok kun lähettää PHP: n "mail" komennolla.  

msmpt

msmtp asentuu pakettivarastoista:

Koodia: [Valitse]
sudo apt-get install msmtp
Tee sille asetustiedosto:

Koodia: [Valitse]
gksudo gedit /etc/msmtprc
Tässä käyttämäni sisältö:
account default
# Oman operaattorisi smtp-palvelimen nimi host sanan jälkeen
host mail.inet.fi
port 25
# Laita oma osoitteesi tuohon alle from sanan jälkeen
from testailija@pp.inet.fi
# Construct envelope-from addresses of the form "user@oursite.example".
#auto_from on
#maildomain oursite.example
# Use TLS.
#tls on
#tls_trust_file /etc/ssl/certs/ca-certificates.crt
# Syslog logging with facility LOG_MAIL instead of the default LOG_USER.
# syslog LOG_MAIL


Muokkaa molemmat php.ini tiedostot.  Löydät oikean kohdan nopeiten etsimällä sanaa "sendmail". Sinne pitäisi muuttaa yksi rivi lukemaan näin:

sendmail_path = "/usr/bin/msmtp -t"

Ota tuon rivin alussa mahdollisesti oleva puolipiste pois jotta tuo asetus aktivoituu.

Tuon jälkeen pitää Apache uudelleenkäynnistää:

Koodia: [Valitse]
sudo service apache2 restart
Testaus on helppoa tehdä jollain koodin pätkällä joka lähettää viestin, vaikka näin:

Koodia: [Valitse]
<?php
$to 
"minun.osoite_1@pp.inet.fi";
$subject "Koeviesti";
$message "Hei, tässäpä koeviesti php:n kautta.";
$from "minun.osoite_2@pp.inet.fi";
$headers "From:" $from;
$tulos =  mail($to,$subject,$message,$headers);
if (
$tulos) {
echo 
"Onnistui.\n";
}
else {
echo 
"Ei onnistunut, tutki lokitiedostoista tarkemmin.\n";
}
?>

Editoi siihen omat osoitteesi, tallenna tuo vaikka nimelle "koe.php", tiputa palvelimelle ja kokeile webbiselaimella:

Koodia: [Valitse]
localhost/koe.php
Pitäisi testiviestin ilmestyä sähköpostiisi.


Edit
myös "nullmailer" ohjelman pitäisi tehdä sama asia.  Laitoin pikakokeeseen mutta jouduin pieniin hankaluuksiin:  Ohjelma alkoi työntää lokeihin "sensible-mda" virhettä.  Vilkaisin Googlea tuolla virheellä ja luovutin sovinnolla.  Olisi tuonkin varmaan saanut järjestykseen mutta into loppui. Toimihan "msmtp" jo vähällä vaivalla ok joten palasin sen käyttöön.  

Postipalvelimen ominaisuuksista näkee näitä asioita:

Koodia: [Valitse]
msmtp --serverinfo
SMTP server at mail.inet.fi (mail.inet.fi [195.156.147.15]), port 25:
    jenni1.inet.fi ESMTP Service ready
Capabilities:
    SIZE 100000000:
        Maximum message size is 100000000 bytes = 95,37 MiB
    DSN:
        Support for Delivery Status Notifications
    AUTH:
        Supported authentication methods:
        PLAIN CRAM-MD5 DIGEST-MD5 LOGIN

Vastauksen tulemisesta tietää myös että "/etc/msmtprc" tiedoston sisältö on jo osittain toimiva. Toinen tarkastus joka kannattaa tehdä on lähettää testiviesti jolloin smtp-palvelin herjaa jos rakenteessa on virhe (esim. lähettäjän nimi).  Tyhjä viesti lähtee aika yksinkertaisesti kirjoittamalla kohdeosoitteen "msmtp": n perään:
Koodia: [Valitse]
msmtp  oma.nimeni@oma.domain
tuohon vielä Enter ja Ctrl-D perään.  Jos ei virheviestiä näy niin kaikki hyvin ja postin pitäisi kolahtaa tuonne omaan laatikkoosi.

Tässä esimerkki virheestä jos lähettäjän nimi on täysin tekaistu "webbi@pp.inet.fi"  tuolla /etc/msmtprc -tiedostossa:

msmtp: envelope from address webbi@pp.inet.fi not accepted by the server
msmtp: server message: 553 <webbi@pp.inet.fi> unable to verify address
msmtp: could not send mail (account default from /etc/msmtprc)

Myös komentorivi-PHP: llä pitäisi ylempänä olevan "koe.php" viestin lähteä ongelmitta.  Jos komentorivi-PHP: llä lähtee oikein ja Apache: n kautta epäonnistuu niin luultavasti Apache: n uudelleenkäynnistys on unohtunut...tuli huomattua.
« Viimeksi muokattu: 08.03.13 - klo:20.05 kirjoittanut ajaaskel »
Autamme ilolla ja ilmaiseksi omalla ajallamme.  Ethän vaadi, uhoa tai isottele näin saamasi palvelun johdosta.