PHP in PHP mail functie
Ik zou graag willen dat mijn email subs hun email adres te zien krijgen als ze een mail van ons krijgen.
Maar ik krijg een white space te zien als ik het script uitvoer.
Ik verzend het met Mime versie 1.0, Content type text/html en Charset is iso-8859-1.
En gebruik zoals altijd een flat file database.
Output:
php code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$message = '
<html>
<head>
<title></title>
</head>
<body>
<p>Dear <?php echo ($email);?>, </p>
<p>rest van de content</p>
</body>
</html>
';
$emails = file('MUgWgJJE9m7FHh4TFrLHf6YzE.txt', FILE_IGNORE_NEW_LINES);
$x = 1;
foreach ($emails as $email) {
$mail_sent = @mail($email, $subject, $message, $headers, '-f [email protected]');
echo $mail_sent ?
$x . '. Mail send to: ' . $email . ' | ' . '<b><font color=green> Successfully Sended!</font><font color=lime> ✓ </font></b>' . '<br/>' :
$x . '. Mail send to: ' . $email . ' | ' . '<b><font color=red> Error 02931: Contact To Fix Issue</font></b>' . '<br/>';
$x++;
}
<html>
<head>
<title></title>
</head>
<body>
<p>Dear <?php echo ($email);?>, </p>
<p>rest van de content</p>
</body>
</html>
';
$emails = file('MUgWgJJE9m7FHh4TFrLHf6YzE.txt', FILE_IGNORE_NEW_LINES);
$x = 1;
foreach ($emails as $email) {
$mail_sent = @mail($email, $subject, $message, $headers, '-f [email protected]');
echo $mail_sent ?
$x . '. Mail send to: ' . $email . ' | ' . '<b><font color=green> Successfully Sended!</font><font color=lime> ✓ </font></b>' . '<br/>' :
$x . '. Mail send to: ' . $email . ' | ' . '<b><font color=red> Error 02931: Contact To Fix Issue</font></b>' . '<br/>';
$x++;
}
Wat doe ik verkeerd en hoe fix ik dit?
Gewijzigd op 18/07/2018 16:10:43 door Lorenzho Dealorde
Je kan dus gewoon in je string die in je $message zit gewoon je variabele gebruiken.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php // deze regels staat er even bij voor de kleurtjes:
$message = '
<html>
<head>
<title></title>
</head>
<body>
<p>Dear '.$email.', </p>
<p>rest van de content</p>
</body>
</html>
';
// hieronder sluit ik PHP even af.
?>
$message = '
<html>
<head>
<title></title>
</head>
<body>
<p>Dear '.$email.', </p>
<p>rest van de content</p>
</body>
</html>
';
// hieronder sluit ik PHP even af.
?>
Gewijzigd op 18/07/2018 16:12:41 door - Ariën -
Quote:
Je kan immers ook geen huis in een huis bouwen ;-)
Ik begrijp het, dacht omdat het in een nieuw html tag zat dat ik dan opnieuw php tags moest gebruiken :P.
bedankt voor de uitleg. test gedaan en werk super nu.
Gewijzigd op 18/07/2018 16:26:24 door Lorenzho Dealorde
Mooi zo :-)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
ob_start(); // vang alle output op
?><html>
<head>
<title></title>
</head>
<body>
<p>Dear<?php echo $htmlSafeName; ?>,</p>
<p>rest van de content</p>
</body>
</html><?php
$mailBody = ob_get_clean(); // schrijf het resultaat weg naar $mailBody
?>
ob_start(); // vang alle output op
?><html>
<head>
<title></title>
</head>
<body>
<p>Dear<?php echo $htmlSafeName; ?>,</p>
<p>rest van de content</p>
</body>
</html><?php
$mailBody = ob_get_clean(); // schrijf het resultaat weg naar $mailBody
?>
Daarnaast, je werkt hier nog steeds in de HTML context, OUTPUT dient dus zodanig ge-escaped te worden dat deze onschadelijk is binnen de genoemde context, $htmlSafeName zou dus HTML-safe gemaakt moeten worden, bijvoorbeeld door htmlspecialchars() toe te passen op de username. Je wilt namelijk iemand geen javascript exploit of wat dan ook mailen.
En dan zou je ook nog voor een flat file / template aanpak kunnen kiezen met placeholders, bijvoorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<html>
<head>
<title></title>
</head>
<body>
<p>Dear [name],</p>
<p>rest van de content</p>
</body>
</html>
<head>
<title></title>
</head>
<body>
<p>Dear [name],</p>
<p>rest van de content</p>
</body>
</html>
Waarbij je [name] met (HTML-safe) equivalenten vervangt via str_replace() bij het afdraaien van de foreach-loop.
Gewijzigd op 18/07/2018 19:05:57 door Thomas van den Heuvel
Ik krijg nog steeds white space i.p.v. het email adres van mijn client.
En een error
Mijn hele code
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
// Turn off output buffering
ini_set('output_buffering', 'on');
// Turn off PHP output compression
ini_set('zlib.output_compression', false);
//Flush (send) the output buffer and turn off output buffering
//ob_end_flush();
while (@ob_end_flush());
// Implicitly flush the buffer(s)
ini_set('implicit_flush', true);
ob_implicit_flush(true);
flush();
/// Now start the program output
$subject = 'Subject hier';
$headers = "From: Bedrijfnaam <[email protected]>\n" .
"Reply-To: Bedrijfnaam <[email protected]>\n" .
"MIME-Version: 1.0\n" . "Content-Type: text/html; charset=iso-8859-1";
$message = '
<html>
<head>
<title></title>
</head>
<body>
<p>Dear '.$email.', </p>
<p>rest van de content</p>
</body>
</html>
';
$emails = file('MUgWgJJE9m7FHh4TFrLHf6YzE.txt', FILE_IGNORE_NEW_LINES);
$x = 1;
foreach ($emails as $email) {
$mail_sent = @mail($email, $subject, $message, $headers, '-f [email protected]');
echo $mail_sent ?
$x . '. Mail send to: ' . $email . ' | ' . '<b><font color=green> Successfully Sended!</font><font color=lime> ✓ </font></b>' . '<br/>' :
$x . '. Mail send to: ' . $email . ' | ' . '<b><font color=red> Error 02931: Contact To Fix Issue</font></b>' . '<br/>';
$x++;
}
ob_end_flush();
?>
// Turn off output buffering
ini_set('output_buffering', 'on');
// Turn off PHP output compression
ini_set('zlib.output_compression', false);
//Flush (send) the output buffer and turn off output buffering
//ob_end_flush();
while (@ob_end_flush());
// Implicitly flush the buffer(s)
ini_set('implicit_flush', true);
ob_implicit_flush(true);
flush();
/// Now start the program output
$subject = 'Subject hier';
$headers = "From: Bedrijfnaam <[email protected]>\n" .
"Reply-To: Bedrijfnaam <[email protected]>\n" .
"MIME-Version: 1.0\n" . "Content-Type: text/html; charset=iso-8859-1";
$message = '
<html>
<head>
<title></title>
</head>
<body>
<p>Dear '.$email.', </p>
<p>rest van de content</p>
</body>
</html>
';
$emails = file('MUgWgJJE9m7FHh4TFrLHf6YzE.txt', FILE_IGNORE_NEW_LINES);
$x = 1;
foreach ($emails as $email) {
$mail_sent = @mail($email, $subject, $message, $headers, '-f [email protected]');
echo $mail_sent ?
$x . '. Mail send to: ' . $email . ' | ' . '<b><font color=green> Successfully Sended!</font><font color=lime> ✓ </font></b>' . '<br/>' :
$x . '. Mail send to: ' . $email . ' | ' . '<b><font color=red> Error 02931: Contact To Fix Issue</font></b>' . '<br/>';
$x++;
}
ob_end_flush();
?>
Gewijzigd op 18/07/2018 19:24:30 door Lorenzho Dealorde
Het enige wat je hoeft te bufferen is de HTML-tekst die je op wilt vangen om in een mailtje te zetten. Hiertoe zet je expliciet de buffering aan met ob_start() en beëindig je deze / vang je deze op met ob_get_clean(). Meer hoef je niet te doen.
En als je deze wilt personaliseren, zal de inhoud die per mail verschilt in elke stap van de foreach-mail ingesteld moeten worden. Nu staat $email (die van regel 32) nergens ingesteld? En deze verschilt ook niet per verzonden bericht (en wordt ook overschreven in regel 41).
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$address= file('MUgWgJJE9m7FHh4TFrLHf6YzE.txt', FILE_IGNORE_NEW_LINES);
foreach ($address as $clientmail) {
}
$message = '
<html>
<head>
<title></title>
</head>
<body>
<p>Dear '.$clientmail.', </p>
<p>rest van de content</p>
</body>
</html>
';
foreach ($address as $clientmail) {
}
$message = '
<html>
<head>
<title></title>
</head>
<body>
<p>Dear '.$clientmail.', </p>
<p>rest van de content</p>
</body>
</html>
';
Gewijzigd op 18/07/2018 20:34:38 door Lorenzho Dealorde
Dat doet inderdaad niks, nada en noppes.
Deel het probleem eens op in stukken.
Introduceer hulpfuncties die dit opsplitst in deeltaken.
Laat voor nu het hele e-mail gedoe achterwege want dit compliceert de boel alleen maar.
Bijvoorbeeld als volgt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
// https://www.phphulp.nl/php/forum/topic/php-in-php-mail-functie/102301
// voor ontwikkeling
error_reporting(E_ALL);
ini_set('display_errors', 'stdout');
ini_set('display_startup_errors', true);
function escape($in) {
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
// maak template, even met beperkte HTML
ob_start();
?><p>Hello [name],</p>
<p>How does today find you?</p>
<p>Greetings,</p>
<p>[signature]</p><?php
$template = ob_get_clean();
// voor het invullen van de vakjes op een veilige manier
function assign($template, $vars) {
$copy = $template;
foreach ($vars as $key => $value) {
$copy = str_replace('['.$key.']', escape($value), $copy);
}
return $copy;
}
// test cases
$data = array(
array(
'name' => '<b>evil html</b>',
'signature' => 'BOfH',
),
array(
'name' => 'World',
'signature' => 'Hennie',
),
// et cetera
);
// test output
foreach ($data as $row) {
$copy = assign($template, $row);
echo $copy;
echo '<hr>';
}
?>[end]
// https://www.phphulp.nl/php/forum/topic/php-in-php-mail-functie/102301
// voor ontwikkeling
error_reporting(E_ALL);
ini_set('display_errors', 'stdout');
ini_set('display_startup_errors', true);
function escape($in) {
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
// maak template, even met beperkte HTML
ob_start();
?><p>Hello [name],</p>
<p>How does today find you?</p>
<p>Greetings,</p>
<p>[signature]</p><?php
$template = ob_get_clean();
// voor het invullen van de vakjes op een veilige manier
function assign($template, $vars) {
$copy = $template;
foreach ($vars as $key => $value) {
$copy = str_replace('['.$key.']', escape($value), $copy);
}
return $copy;
}
// test cases
$data = array(
array(
'name' => '<b>evil html</b>',
'signature' => 'BOfH',
),
array(
'name' => 'World',
'signature' => 'Hennie',
),
// et cetera
);
// test output
foreach ($data as $row) {
$copy = assign($template, $row);
echo $copy;
echo '<hr>';
}
?>[end]