Problem med mail() i PHP; mailen kommer inte fram. Serverkofig?

Tråden skapades och har fått 21 svar. Det senaste inlägget skrevs .
1

Hej,

Jag sitter som hastigast och lär mig lite php inför en kurs jag skall ta i höst. Jag har installerat MAMP för att enkelt kunna utveckla lokalt och testa sakerna jag bygger i lugn och ro.

Ett problem har dock dykt upp. Jag har enligt läroboken byggt ett formulär som skall gå att fylla i med ett antal frågor. När användaren sedan klickar på submit-knappen skall dels en konfirmationssida visas där ens svar redovisas, men scriptet skall även skicka ett mail till mig med informationen som användaren knapprade in. Och här är problemet: konfirmationssidan visas som den skall, men inget mail anländer. Inget felmeddelande, ingenting.

Koden för scriptet ser ut som följer:

<html>
	<head>
		<title>Aliens abducted me - Report an Abduction</title>
	</head>
	
	<body>
		<h2>Aliens abducted me - Report an abduction</h2>
		
		<?php
			/* stoppa in all data från formuläret i variablar */
			$name = $_POST['firstname'].' '.$_POST['lastname'];
			$when_it_happened = $_POST['whenithappened'];
			$how_long = $_POST['howlong'];
			$how_many = $_POST['howmany'];
			$alien_description = $_POST['aliendescription'];
			$what_they_did = $_POST['whattheydid'];
			$fang_spotted = $_POST['fangspotted'];
			$other = $_POST['other'];
			$email = $_POST['email'];
			
			/* redogör för hur mailet skall se ut, och vart det skall skickas */
			$to = 'min@email.com';
			$subject = 'Ett litet testmail';
			$msg = "$name was abducted $when_it_happened and was gone for $how_long.\n" .
				"Number of aliens: $how_many\n" .
				"Alien description: $alien_description\n" .
				"What they did: $what_they_did\n" .
				"Fang spotted? $fang_spotted\n" .
				"Other comments: $other";
			/* skickar mailet */
			mail($to, $subject, $msg, '$from:' . $email);
			
			/* skriver ut konfirmationssidan efter att användaren har skickat formuläret */
			echo 'Thanks <a href="mailto:' . $email . '">' . $name . '</a> for submitting the form.<br />';
			echo 'You were abducted ' . $when_it_happened;
			echo ' and were gone for ' . $how_long . '<br />';
			echo 'Describe them: ' . $alien_description . '<br />';
			echo 'How many were there? ' . $how_many . '<br />';
			echo 'What did they do to you? ' . $what_they_did . '<br />';
			echo 'Was Fang there? ' . $fang_spotted . '<br />';
			echo 'Your email address is '.$email.'<br />';
			echo '<br />';
			echo 'Do you have anything else to add? '.$other;
		?>
	</body>
</html>

Alla $_POST är fält i formuläret som finns på en intilliggande html-sida.

Eftersom inget felmeddelande kommer upp, och scriptet körs utan något klagande så borde det inte finnas något fel i det, men likt förbannat får jag inga mail (min@email.com är såklart utbytt mot min mailadress). Boken jag läser (Head first PHP & MySQL) tipsar om att om inga mail går fram KAN det bero på att PHP-installationen man använder inte vet hur den skall skicka mail, och kan behövas konfigureras. Därefter hänvisas man till php.net, där jag inte lyckas klura ut vad mitt problem är, därav min undran här.

När jag kollar phpinfo() på min lokala installation (PHP5 via MAMP) så specar den sendmail_path till "/usr/sbin/sendmail -t -i", SMTP till "localhost" och smtp_port till "25"; om det sedan är rätt har jag inte tillräckligt med kunskap för att kunna avgöra; någon kanske kan upplysa mig? "sendmail_from" har inget värde, men det deklarerar jag ju i scriptet ovan, så det bör väl inte spela in?

Är tacksam för hjälp, är inne i litet av ett flow där jag fattar allt och har ingen lust att gå vidare i boken innan jag är 100% säker på att jag gjort rätt hittills. Har jag missat att delge någon fundamental information som ni kan tänkas behöva för att kunna hjälpa mig får ni skälla på mig; en eventuell miss är av ren och skär okunskap i sådant fall.

Tack på förhand för hjälpen!

Jag har testat att lägga upp scriptet på ett One-konto jag har, och nu verkar det fungera där iaf, (efter att jag fixat till "mail($to, $subject, $msg, 'From:' . $email);", men det verkar fortfarande inte gå att skicka via min lokala installation, vilket vore trevligt att få att funka. Några idéer ang. serverkonfig'en?

Din serverkonfig är beroende av din bredbandsleverantör, som kan ha spärrat port 25. Det finns massa diskussioner om detta. Kan något annat program med ett mailkonto inställt exakt lika maila från samma dator?

Hur gick det med detta?

Ursprungligen av Taz_1999:

Hur gick det med detta?

Hej igen, häcken full med jobb, så jag har inte hunnit pilla så mycket mer med detta. Kommer nog sitta en del imorgon och plita och dona.

Ursprungligen av Taz_1999:

Din serverkonfig är beroende av din bredbandsleverantör, som kan ha spärrat port 25. Det finns massa diskussioner om detta. Kan något annat program med ett mailkonto inställt exakt lika maila från samma dator?

Sista frågan är jag nog fel person att svara på; jag kan lungt erkänna att när det kommer till PHP och konfigurering av servrar så är jag fullständigt grön (med hopp om att lära sig så klart).
Hur gör jag för att ändra något av värderna som jag får upp med phpinfo() (t.e.x. om jag vill ändra SMTP-porten)? Är det via terminalen man får gå in?

Ursprungligen av Robo-X:

Först och främst. Kör du mac behövs inte MAMP. Apache, PHP, Python, RoR kommer alla förinstallerade på Macen. Det enda man behöver installera extra är MySQL. Det kan man hämta lätt från mysql.com.

Detta visste jag; anledningen till att jag ändå laddade ner MAMP var att jag har noll koll på terminalen och ville komma igång med php-boken. Tanken är väl att sätta mig ned imorrn och bekanta mig lite med hur jag får igång pryttlarna utan MAMP; det känns som jag ändå bör lära mig detta för framtiden och Terminalen skall ju vara människans bästa vän var det någon som sa

Ursprungligen av Robo-X:

Vad gäller skicka email så måste man ställa in postfix.

Får jag vara så jobbig att jag frågar hur detta görs, och kanske framförallt, vad postfix är?

Ursprungligen av Robo-X:

Om du vill skicka email för att testa kan man skicka det med sendmail till ditt användarnamn@localhost det brukar fungera utan att man behöver göra några inställningar. Mailet kan du läsa i Terminalen genom att skriva mail.

Testade detta, och det fungerade ju bra! I värsta fall så kan jag använda mig av detta, då det iaf. visar om koden spottar ur sig ett mail eller inte.

  • Medlem
  • International user
  • 2009-07-04 14:48

Först och främst. Kör du mac behövs inte MAMP. Apache, PHP, Python, RoR kommer alla förinstallerade på Macen. Det enda man behöver installera extra är MySQL. Det kan man hämta lätt från mysql.com.

Vad gäller skicka email så måste man ställa in postfix. Om du vill skicka email för att testa kan man skicka det med sendmail till ditt användarnamn@localhost det brukar fungera utan att man behöver göra några inställningar. Mailet kan du läsa i Terminalen genom att skriva mail.

//Rob

  • Oregistrerad
  • 2009-07-04 18:38

Det blir lite jobbigt för dig att använda mail() då den är beroende av sendmail, och du måste cofigurera sendmail att använda en smtp server (relay) istället för att låta sendmail skicka ut mailet på stora stygga internet.

En MYCKET bättre lösning, om det är ok för din kurs dvs. är att använda PHPMailer som är en php class du kan ladda hem. Mycket enkel att använda och där kan du ställa in att du vill använda din SMTP server du har för din bredbandsleverantör (Detta lär du redan veta om du använder Apple mail på din dator och sitter på en vanlig bredbandsleverantör)

Toppen; gav mig på att dra igång Apache och installera PHP & MySQL på burken idag. Nu får jag inte phpMyAdmin att fungera med den installationen, och nånstans längs vägen har mySQL-databasen som jag använde tillsammans med MAMP blivit korrupt, för den går inte att ansluta till längre heller... Så nu kan jag helt plötsligt inte göra någonting.

Detta är anledningen till att jag använt mig av MAMP tidigare; jag är totalt grön på att konfigurera MySQL/PHP etc. via Terminalen etc, och dokumentationen som följer med phpMyAdmin är verkligen inte skriven för någon novis...

Hur gör jag (alt: vad behöver jag visa för att någon skall kunna ge mig vägledning)?

  • Medlem
  • International user
  • 2009-07-05 16:57

Först måste du se till att mysql är igång. Skriv i terminalen mysql... står det mysql > på prompten så fungerar mysql.

Det andra som man ska göra är att ställa in lösenordet och användarnamn på mysql installationen. Får du kolla i dokumentationen hur man gör det.

För det tredje måste du ställa i phpMyAdmin config filen. Den heter config.inc.php och ska ligga i samma mapp som phpMyAdmin. Där måste du ställa in

$cfg['Servers'][$i]['user'] = 'dinmysqlanvändare';
$cfg['Servers'][$i]['password'] = 'dinmysqllösenord';

Gör filen skrivbar för alla. (Egentligen räcker det att ändra ägaren till _www men det vet du kanske inte hur man gör).

Sen ska allt fungera.

//Rob

Ursprungligen av Robo-X:

Först måste du se till att mysql är igång. Skriv i terminalen mysql... står det mysql > på prompten så fungerar mysql.

MySQL är uppe och igång, som man kan se både i dess prefPane och i Terminalen. Dock kan man se att de tabeller som just nu ligger i databasen skiljer sig från de som skall finnas enligt guiden på MySQL.com (punkt 7); är det ett problem att jag saknar en "mysql"-databas, utan istället sitter med en "information-schema"-dito? Jag har utgått från att mysql_install_db kördes i samband med att jag installerade pkg-filen, eftersom det antydes här att installeraren kör den samtidigt.

Ursprungligen av Robo-X:

Det andra som man ska göra är att ställa in lösenordet och användarnamn på mysql installationen. Får du kolla i dokumentationen hur man gör det.

Vidare har jag försökt gå vidare till sektionen i manualen där de går igenom hur man säter lösenordet på de initiala användarkontona, men direkt refererar de till "mysql"-databasen, och visar sen hur man kommer åt den och lägger till lösenorden etc. Detta borde väl innebära att mysql_install_db ändå inte har körts ordentligt right?

EDIT: Men när jag tittar i findern så verkar det finnas en "mysql"-databas i alla fall...??

Ursprungligen av Robo-X:

För det tredje måste du ställa i phpMyAdmin config filen. Den heter config.inc.php och ska ligga i samma mapp som phpMyAdmin. Där måste du ställa in

$cfg['Servers'][$i]['user'] = 'dinmysqlanvändare';
$cfg['Servers'][$i]['password'] = 'dinmysqllösenord';

Gör filen skrivbar för alla. (Egentligen räcker det att ändra ägaren till _www men det vet du kanske inte hur man gör).

Sen ska allt fungera.

//Rob

Jag vill bara understryka hur extremt tacksam jag är för att någon tar sig tid att hjälpa mig; det är verkligen guld värt!

Senast redigerat 2009-07-05 19:07

Onlinemanualen säger följande:

Citat:

The Mac OS X PKG of MySQL installs itself into /usr/local/mysql-VERSION and also installs a symbolic link, /usr/local/mysql, that points to the new location. If a directory named /usr/local/mysql exists, it is renamed to /usr/local/mysql.bak first. Additionally, the installer creates the grant tables in the mysql database by executing mysql_install_db.

Först tänkte jag att pkg-installationen på något sätt, av någon anledning, inte hade lyckats med att köra mysql_install_db, varpå jag försökte mig på att köra den manuellt. Dock gick inte detta heller, för tydligen så finns inte ens mysql_install_db i min bin-mapp...

Suck. Stor chans att man kan ta sig igenom guiderna om inte ens filerna stämmer överrens med vad som följer med installationen.

  • Medlem
  • International user
  • 2009-07-06 09:14

OK jag tror inte att jag körde mysql_install_db när jag installerade mysql. Prova att konfigurera phpmyadmin och kolla om mysgl datan är redan installerat.

//Rob

Ursprungligen av Robo-X:

OK jag tror inte att jag körde mysql_install_db när jag installerade mysql. Prova att konfigurera phpmyadmin och kolla om mysgl datan är redan installerat.

//Rob

Då kommer vi till nästa problem; jag kommer inte åt att tillägna lösenord till användarnamnen, och därmed kan jag inte använda dem för att logga in på phpmyadmin och konfigurera därifrån. Det är en riktig catch 22.

Vad jag har förstått så ligger användarnamn & lösenord (de senare efter att man själv lagt till dom) lagrade i databasen mysql och häri ligger mitt problem; när jag listar mina tillgängliga databaser i terminalen så finns mysql inte med (däremot finns den med som en låst fil i findern av någon anledning...).

Det känns som en riktig soppa kan jag lova.

  • Medlem
  • International user
  • 2009-07-06 09:49

Allt som du har installerat med mamp kan du glömma. Det sparades i en annan mysql databank. I din nya får du ställa in allt eller har du installerat din gamla databas?

Vad får du om du skriver i terminalen

mysql -u root

Här står lite mer info om vad du behöver.

http://dev.mysql.com/doc/refman/5.1/en/default-privileges.html

//Rob

Robo-X försöker hjälpa till, men tyvärr så räknar han med att du kan mera än vad du säger dig kunna. Så de råd du får från Robo-X är liksom ovanför din nivå, så jag tycker att du skall göra så här:

Återgå till MAMP. Fördelen med MAMP är just att lösenord är inlagda, de står i klartext på en webbsida inuti MAMP. Det finns start och stopp-knappar, det finns genvägar till PHPMyAdmin-sida, portnummer är tydligt inställda och allt i MAMP påverkar inte något av vad som är inställt i din dator i övrigt. Att få igång MySQL, PHP, Apache mm är alltså just nu ovanför vad du vet och förstår, vilket jag ser av dina svar och frågor.

I det här fallet, att jobba med PHP/MySQL-utveckling för en kurs, och du stöter på ett problem som har med mail att göra, så är det verkligen att gå över ån efter vatten för att även kunna skicka mail, genom att få igång och konfigurera postfix, mysql, php och apache. Även om en del av dem redan medföljer Mac OS X. Så skippa alla de råden, återgå till MAMP.

För att göra inställningar vad gäller PHP när du använder MAMP så ändrar du i en fil som heter php.ini. Du kan öppna programmappen, öppna MAMP-mappen, söka på php.ini i sökrutan, markera MAMP-mappen och filnamns-sökning, så hittar du två stycken. Ändra i den som ligger här:

MAMP > conf > php5 > php.ini

Det är den filen som innehåller det du ser när du kör phpinfo-kommandot.

Robo-X: Jag är enormt tacksam för den tid du har lagt ned på att svara på mina ibland köttiga frågor. Jag tror dock att Taz1999 slår huvudet på spiken här ovanför; jag är nog antagligen för grön inom flera områden (terminalen/unix-kommandon, server-konfigurering och what have you) för att jag skall kunna linda mitt huvud runt detta just nu.

För att jag skall kunna få något gjort med boken, och hinna komma in i matchen tills kursen startar i höst, så kör jag nog på med MAMP, för nu. Jag får nog anledning att återkomma till detta framöver, och skall då se till att vara lite inläst på ämnet så att jag kan få något konstruktivt gjort av alla hjälpsamma direktiv och tips som jag fått (från dig och från Taz_1999 & studiox). Ledsen att jag inte kunde wrappa huvudet runt det denna gång. att maila till användarnamn@localhost och sen kolla mailen via terminalen fungerar för att kontrollera att mailen går iväg, vilket var grundproblemet. Tack igen för din tid!

Taz_1999:
Jag skall, något förgrymmad över mina tillkortakommanden på området, återgå till MAMP och slicka mina sår lite. Jag får nog anledning till att återkomma till detta, och då j**lar skall jag vara med på noterna!

Vad jag gissade var felet i din ursprungliga fråga var att din bredbandsleverantör har en spärr på port nr 25. Det är ganska vanligt med virus på PC-sidan och dessa tar över datorer och skickar mail, just på port 25. Så därför har de flesta leverantörer av bredband infört en spärr, ingen kan skicka epost på port 25 ut på resten av internet, eftersom det beteendet är "likt" en dator övertagen av virus som skickar en massa spam. Man kan bara skicka epost på ett annat portnummer (olika för olika leverantörer) om man som utgående mailserver har bredbandsleverantörens mailserver.

Vad MAMP och PHP inuti MAMP alltså gör när du kör din PHP-kod är att försöka skicka epost, på port 25 ut på resten av internet. Ett beteende som är likt "min dator över övertagen av virus", vilket alltså bredbandsleverantören spärrar.

Du berättade att när du kör samma kod som ligger på ditt webbhotell, så funkar det. Det gör det därför att därborta är det OK att den webbservern "snackar" med webbhotellets mailserver och skickar mail. Din dator och ditt bredband och eventuella spärrar är alltså inte involverat. Mailet skapas och skickas på webbhotellet.

Som jag sade, detta problem, med att port 25 är spärrat hos de flesta bredbandsleverantörer har vi diskuterat kanske 50 gånger här på 99.se. Vad jag menar med att berätta det är att du skall använda sökrutan uppe till höger och söka till exempel på spärr port och se vad du hittar då.

För att testa om det är en spärr på port 25 så skall du låta PHP skapa och skicka ett mail med exakt samma uppgifter du har i ditt epostprogram, som ju antagligen kan skicka epost? Om PHP använder samma så skall mailet komma fram. Ur bredbandsleverantörens synvinkel så ser de ingen skilland på om ditt epostprogram kontaktar deras utgående mailserver på rätt port, eller om PHP gör det.

Med så långt?

  • Oregistrerad
  • 2009-07-08 16:47
Ursprungligen av Taz_1999:

Vad jag gissade var felet i din ursprungliga fråga var att din bredbandsleverantör har en spärr på port nr 25. Det är ganska vanligt med virus på PC-sidan och dessa tar över datorer och skickar mail, just på port 25. Så därför har de flesta leverantörer av bredband infört en spärr, ingen kan skicka epost på port 25 ut på resten av internet, eftersom det beteendet är "likt" en dator övertagen av virus som skickar en massa spam. Man kan bara skicka epost på ett annat portnummer (olika för olika leverantörer) om man som utgående mailserver har bredbandsleverantörens mailserver.

Vilket jag också gav en väldigt enkel lösning på som garanterat fungerat "out of the box" och den enda som behövdes läggas till i koden är 2-3 rader kod som inkluderar en klass och sen initieringen av klassen. klart.

Php's egen mail() funktion är skräp och desto tidigare man lär sig att INTE använda den desto bättre.

  • Medlem
  • 2009-07-09 10:29
Ursprungligen av Taz_1999:

Vad jag gissade var felet i din ursprungliga fråga var att din bredbandsleverantör har en spärr på port nr 25. Det är ganska vanligt med virus på PC-sidan och dessa tar över datorer och skickar mail, just på port 25. Så därför har de flesta leverantörer av bredband infört en spärr, ingen kan skicka epost på port 25 ut på resten av internet, eftersom det beteendet är "likt" en dator övertagen av virus som skickar en massa spam. Man kan bara skicka epost på ett annat portnummer (olika för olika leverantörer) om man som utgående mailserver har bredbandsleverantörens mailserver.

Vad MAMP och PHP inuti MAMP alltså gör när du kör din PHP-kod är att försöka skicka epost, på port 25 ut på resten av internet. Ett beteende som är likt "min dator över övertagen av virus", vilket alltså bredbandsleverantören spärrar.

All mailtrafik mellan mailservrar går på port 25, att denna port skulle vara specifikt för virus är fel.

Dock så spärrar många leverantörer av privata bredbandsanslutningar just utgående port 25, förrutom till sina egna servrar. Detta för att förhindra att virus och spam skickas från enskillda servrar eller datorer inom deras nät.

För att kunna skicka mail hos dessa leverantörer så måste man antingen skicka via deras server eller via en utomstående server på annan port än 25.
När mailet väl är levererat till den utgående servern kommer den dock att levereras till mottagarens server via port 25.

/P

Ursprungligen av Taz_1999:

Med så långt?

Jajjemen! Är med på noterna; både från dig och Perka. Har förstått problematiken och de olika sätt på vilket man kan gå runt problemet. Skall fortsätta enligt uppläggningen i boken och utgår från att saker och ting kommer klarna än mer när jag kommit djupare ned i ämnet. Man måste ju börja i någon ände.

Tack för alla inlägg och synpunkter; de sparas i bakfickan min för framtida referenser.

@studiox: Den lösning du gav är tekniskt korrekt och enkel men bara om man alltså redan kan det hela. Vilket ju inte var fallet i denna tråd.

@Perka: Ok, jag kanske uttryckte mig lite otydligt som att bara virus skickar mail via på port 25, det är alltså inte sant. Alla mail går på port 25, de som ditt epostprogram skickar men även de epost som går via PHP inifrån MAMP och även de som skickas av datorer övertagna av virus.

  • Oregistrerad
  • 2009-07-09 12:15
Ursprungligen av Taz_1999:

@studiox: Den lösning du gav är tekniskt korrekt och enkel men bara om man alltså redan kan det hela. Vilket ju inte var fallet i denna tråd.

Kan man inte skriva in sin bredbandsoperatörs SMTP server (Vilket man redan har gjort i mail) så kanske man inte borde hålla på med programmering i överhuvudtaget, även om man vill lära sig.

1
Bevaka tråden