webForumDet fria alternativet

send mail och textarea = fail

20 svar · 1 388 visningar · startad av saturday

saturdayMedlem sedan jan. 2007133 inlägg
#1

Hej!

Är tyvärr inte så vass på php. Är gammal ASP programmerare men vill nu ta tag i phpn...

Jag försöker bygga en send mail funktion, som jag tycker beter sig skitskumt:

<?
	$mail = $_POST['mail'];
	$name = $_POST['name'];
	$subject2 = $_POST['subject'];
	$text = str_replace("\r\n", "<br />", $_POST['text']);
	
    $to = "min@mail.com";
    $from = $mail;
    $subject = "Meddelande: " .$subject2;

    //begin of HTML message
    $message = <<<EOF
	<html>
		<body bgcolor="#DCEEFC">
    	        $text
		</body>
	</html>
EOF;
   //end of message
    $headers  = "From: $from\r\n";
    $headers .= "Content-type: text/html\r\n";

    
	if(mail($to, $subject, $message, $headers)){
	echo "Meddelandet skickat!";
} 
else{ 
	echo "Någonting gick fel";
}
?>

Jag plockar alltså upp ett formulär och skickar som HTML-format. Så långt så väl.

Allt fungerar finfint, tills dess att jag använder enter/return/brake/radbryt i textarean ($_POST['text']).
Som ni ser försöker jag byta ut mot <br /> taggar, men det hjälper föga.
Har förstås provat utan str_replace också, det var så jag upptäckte felet från början. Innan jag började försöka byta ut tecknen.

Meddelandet skickas alltså om jag bara skriver en singelrad i textarean av formuläret, men så fort jag gör ett radbryt så går det inte att skicka... Någon som ser varför?

Nate.AMedlem sedan mars 2006296 inlägg
#2

Hej!

php har en egen funktion för det, nl2br(); Jag vet inte om den är bättre på något sätt men enklare i alla fall. :)

http://php.net/manual/en/function.nl2br.php

$text = nl2br($_POST['text']);
Nate.AMedlem sedan mars 2006296 inlägg
#3

öhm, ignorera min trötta hjärna som inte läste ditt inlägg ordentligt.... :r

saturdayMedlem sedan jan. 2007133 inlägg
#4

Nate.A skrev:

Hej!

php har en egen funktion för det, nl2br(); Jag vet inte om den är bättre på något sätt men enklare i alla fall. :)

http://php.net/manual/en/function.nl2br.php

$text = nl2br($_POST['text']);

Har prövat den med. :(

MickeA.comMedlem sedan feb. 20034 441 inlägg
#5

saturday skrev:

Meddelandet skickas alltså om jag bara skriver en singelrad i textarean av formuläret, men så fort jag gör ett radbryt så går det inte att skicka... Någon som ser varför?

Vad innebär "går inte att skicka"? Får du några felmeddelanden? Var tar det stopp?

Du borde hur som helst byta till funktionen nl2br(). Sen borde du nog köra:

$body = <<<EOT
   {$text}
EOT;

Alltså { och } runt ditt variabelnamn.

Danne VMedlem sedan aug. 20068 090 inlägg
#6

saturday skrev:

men så fort jag gör ett radbryt så går det inte att skicka... Någon som ser varför?

Har ingen aning om problemet, men reagerade på ordvalet. Vad menar du med "radbryt"? Menar du att du skriver ett meddelande som automatiskt blir fler rader, eller menar du att du gör en "carriage return", dvs trycker på "enter"?

Om formulär verkar vilja skickas när man trycker "enter" under tiden man skriver meddelandet så beror det ofta på att man satt form-taggarna på fel plats runt formuläret. Sitter dom där dom ska?

saturdayMedlem sedan jan. 2007133 inlägg
#7

MickeA.com skrev:

Vad innebär "går inte att skicka"? Får du några felmeddelanden? Var tar det stopp?

Du borde hur som helst byta till funktionen nl2br(). Sen borde du nog köra:

$body = <<<EOT
   {$text}
EOT;

Alltså { och } runt ditt variabelnamn.

Jag kör ett formulär, ajax och php (Jquery är igång också).

Allt ser ut så här...

Formulär:

<div id="response"></div>
                            <form id="formail" action="" method ="post">
                                <input type="text" value="Ditt namn" class="formtext" name="name" id="name" />
                                <input type="text" value="Din epostadress" class="formtext" name="mail" id="mail" />
                                <input type="text" value="Ämne" class="formtext" name="subject" id="subject" />
                                <textarea class="formtext" rows="8" cols="50" name="text" id="text">Meddelande</textarea><br />
                                <div style="background: #000; position: relative; top: -1px; text-align: right; padding: 0 2px 2px 0">
                                    <input type="image" src="img/send.gif" class="submit" alt="Submit" id="sendmail" name="sendmail" />
                                </div>
                        	</form>

Ajax:

 $(document).ready(function(){
	$("#sendmail").click(function(){
		var valid = '';
		var isr = ' måste fyllas i.';
		var name = $("#name").val();
		var mail = $("#mail").val();
		var subject = $("#subject").val();
		var text = $("#text").val();
		if (name.length<1) {
			valid += '<br />Name'+isr;
		}
		if (!mail.match(/^([a-z0-9._-]+@[a-z0-9._-]+\.[a-z]{2,4}$)/i)) {
			valid += '<br />Epostadress'+isr;
		}
		if (subject.length<1) {
			valid += '<br />Ämne'+isr;
		}
		if (text.length<1) {
			valid += '<br />Text'+isr;
		}
		if (valid!='') {
			$("#response").fadeIn("slow");
			$("#response").html("Error:"+valid);
		}
		else {
			var datastr ='name=' + name + '&mail=' + mail + '&subject=' + subject + '&text=' + text;
			$("#response").css("display", "block");
			$("#response").html("Skickar meddelande... ");
			$("#response").fadeIn("slow");
			setTimeout("send('"+datastr+"')",2000);
		}
		return false;
	});
});
function send(datastr){
	$.ajax({	
		type: "POST",
		url: "global/mail.php",
		data: datastr,
		cache: false,
		success: function(html){
		$("#response").fadeIn("slow");
		$("#response").html(html);
		setTimeout('$("#response").fadeOut("slow")',2000);
	}
	});
}

Php-filen:

<?
	$mail = $_POST['mail'];
	$name = $_POST['name'];
	$subject2 = $_POST['subject'];
	$text = nl2br($_POST['text']);
	
    $to = "min@mail.com";
    $from = $mail;
    $subject = "Meddelande från Lajka: " .$subject2;

    //begin of HTML message
    $message = <<<EOF
	<html>
		<body bgcolor="#DCEEFC">
    	{$text}
		</body>
	</html>
EOF;
   //end of message
    $headers  = "From: $from\r\n";
    $headers .= "Content-type: text/html\r\n";

    
	if(mail($to, $subject, $message, $headers)){
	echo "Meddelandet skickat!";
} 
else{ 
	echo "Någonting gick fel";
}
?>

Vad som händer är att om jag bara skriver en rad i <textarea> så kommer först:
Meddelandet skickas...

Sedan:
Meddelandet skickat!

Och meddelandet har skickats, det dyker upp i inkorgen.

Men så fort jag har radbryt fastnar den på "Meddelandet skickas..."

saturdayMedlem sedan jan. 2007133 inlägg
#8

Danne V skrev:

Har ingen aning om problemet, men reagerade på ordvalet. Vad menar du med "radbryt"? Menar du att du skriver ett meddelande som automatiskt blir fler rader, eller menar du att du gör en "carriage return", dvs trycker på "enter"?

Om formulär verkar vilja skickas när man trycker "enter" under tiden man skriver meddelandet så beror det ofta på att man satt form-taggarna på fel plats runt formuläret. Sitter dom där dom ska?

Det är på carriage return. Kör jag en rad som automatiskt blir flera rader på grund av längd, så fungerar det att skicka.

Du kan testa formuläret och se koden här (Det är vid botten på sidan):
https://www.linusfofgren.com/lajka/index.php

Nate.AMedlem sedan mars 2006296 inlägg
#9

Kan det ha med det här att göra?

PHP imposes a limit of 70 characters for each line in the text of an email message. This means that you have to insert the line feed character "\n" to break an email message into multiple lines if the message is more than 70 characters long.

$text = wordwrap(nl2br($_POST['text']), 70);
saturdayMedlem sedan jan. 2007133 inlägg
#10

Nate.A skrev:

Kan det ha med det här att göra?

$text = wordwrap(nl2br($_POST['text']), 70);
<?
	$mail = $_POST['mail'];
	$name = $_POST['name'];
	$subject2 = $_POST['subject'];
	$text = wordwrap(nl2br($_POST|['text']), 70);
	
    $to = "joakim.borg.1978@gmail.com";
    $from = $mail;
    $subject = "Meddelande från Lajka: " .$subject2;

    //begin of HTML message
    $message = <<<EOF
	<html>
		<body bgcolor="#DCEEFC">
    	{$text}
		</body>
	</html>
EOF;
   //end of message
    $headers  = "From: $from\r\n";
    $headers .= "Content-type: text/html\r\n";

    
	if(mail($to, $subject, $message, $headers)){
	echo "Meddelandet skickat!";
} 
else{ 
	echo "Någonting gick fel";
}
?>

Denna rad med wordwrap skapar error enligt mitt Dreamweaver. Och jag är tveksam. För oavsett om jag kör ett tecken + enter så pajar det.

Däremot gick det super att skicka en rad med så här mycket tecken utan wordwrap-koden:
"sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf sfhgdg dfdfdf dfdf dfdfdf dfdf ddf "

Ps. Enter skickar inte meddelandet utan skapar ett radbryt i textfältet.

Nate.AMedlem sedan mars 2006296 inlägg
#11

Det var jag som skrev fel först, trodde jag var snabb nog att ändra. Se reviderad kodsträng i mitt förra inlägg :) Lite slarvig så här innan morgonkaffet verkat.
Edit: Du/jag fick med ett extra tecken vid post variabeln

saturdayMedlem sedan jan. 2007133 inlägg
#12

Nate.A skrev:

Det var jag som skrev fel först, trodde jag var snabb nog att ändra. Se reviderad kodsträng i mitt förra inlägg :) Lite slarvig så här innan morgonkaffet verkat.
Edit: Du/jag fick med ett extra tecken vid post variabeln

Hehe, jepp, hittade det och din rad fungerar nu utan att den raden blir error, men fixar ej problemet jag har med radbryt, det kvarstår. Fortsatt går det att skicka meddelanden så länge man inte skapar egna radbryt.

saturdayMedlem sedan jan. 2007133 inlägg
#13

Håller uppsikt över tråden idag. Skulle ingen finna min lösning får jag börja bryta ned scriptet och testa mig fram helt enkelt. Först ta bort ajaxen och se så att felet inte sitter där och sedan kanske försöka finna en annan send HTML mail funktion för PHP. Om det är något i php-scriptet som ballar ur.

saturdayMedlem sedan jan. 2007133 inlägg
#14

MickeA.com skrev:

Vad innebär "går inte att skicka"? Får du några felmeddelanden? Var tar det stopp?

Du borde hur som helst byta till funktionen nl2br(). Sen borde du nog köra:

$body = <<<EOT
   {$text}
EOT;

Alltså { och } runt ditt variabelnamn.

Har lagt till detta; {$text}, se ovan. Men det hjälpte ej.
För att se exakt hur den beteer sig gå till https://www.linuslofgren.com/lajka/index.php.
Tryck på kontakt eller scrolla längst ned på sidan. Fyll i meddelandet, skriv en enkelrad i "meddelande", exempel:
--
Hej
--
... och skicka så ser du att det går iväg.

Pröva sedan ett radbryt, exempel:
--
Hej

Hej då
--
Och pröva att skicka det. Då fastnar scriptet vid "Meddelande skickas..."

PHP koden ser ut så här:

<?
	$mail = $_POST['mail'];
	$name = $_POST['name'];
	$subject2 = $_POST['subject'];
	$text = wordwrap(nl2br($_POST|['text']), 70);
	
    $to = "joakim.borg.1978@gmail.com";
    $from = $mail;
    $subject = "Meddelande från Lajka: " .$subject2;

    //begin of HTML message
    $message = <<<EOF
	<html>
		<body bgcolor="#DCEEFC">
    	{$text}
		</body>
	</html>
EOF;
   //end of message
    $headers  = "From: $from\r\n";
    $headers .= "Content-type: text/html\r\n";

    
	if(mail($to, $subject, $message, $headers)){
	echo "Meddelandet skickat!";
} 
else{ 
	echo "Någonting gick fel";
}
?>
@ndersMedlem sedan juni 200032 969 inlägg
#15

Du får ett "unterminated string constant"-fel i ajax.js på setTimeout-raden (rad 30). Du får se till att ta bort radbrytningarna också. nl2br() behåller \n i strängarna - och lägger till <br /> före. Prova att ta bort radbrytningarna efter nl2br().

saturdayMedlem sedan jan. 2007133 inlägg
#16

@nders skrev:

Du får ett "unterminated string constant"-fel i ajax.js på setTimeout-raden (rad 30). Du får se till att ta bort radbrytningarna också. nl2br() behåller \n i strängarna - och lägger till <br /> före. Prova att ta bort radbrytningarna efter nl2br().

Ok, så du menar att jag ska byta ut tecknen innan jag kör in meddelandet i ajax-scriptet så att taggarna redan är utbytta där? Låter logiskt tror jag, ska bara se hur jag fixar det.

@ndersMedlem sedan juni 200032 969 inlägg
#17

Du kan ju prova att bara lägga det på samma ställe som du kör nl2br().

Kolla exempel 2 här: http://php.net/manual/en/function.str-replace.php

MickeA.comMedlem sedan feb. 20034 441 inlägg
#18

Känns som att du är lite ute och cyklar, om du ändå kör jQuery/Ajax, varför använder du dig inte av $(form).serialize() ?

Då slipper du bygga en querystring av all data, och den encodas rätt vid postningen. Du skulle spara in många rader kod på det.

MickeA.comMedlem sedan feb. 20034 441 inlägg
#19

Men det ovan menar jag såhär:

<form id="myFrm" action="#" method="post">
<input type="text" name="subject" />
<textarea name="msg" cols="15" rows="10"></textarea>
<input type="submit" value="Skicka" />
</form>

Och längst ner på din html-sida:

$(document).ready(function(){
	$('#myFrm').submit(function(e){
		e.preventDefault();
		// t.ex. visa laddningsmeddelande här
		$.ajax({
			url: "skickamail.php",
			type: "POST",
			data: $(this).serialize(),
			dataType: "json",
			success: function(data){
				// behandla output från php
			}
		});
	});
});
saturdayMedlem sedan jan. 2007133 inlägg
#20

Ok, tack för svaren! Ska sätta mig ikväll och testa mig fram lite. :)

262 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
122 ms — hämta forumlista (db)
128 ms — hämta statistik (db)
131 ms — hämta tråd, inlägg och bilagor (db)