Ik probeer PHPmailer aan de praat te krijgen, maar het wil net lukken.
Op de server heb ik de volgende bestanden gezet in dezelfde dir. :
1. class.phpmailer.php
2. class.smtp.php
3. nieuwsbriefmail.html
4. test.php
Test.php bestaat uit de volgende code:
<?php
$body = "nieuwsbriefmail.html";
require("class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsSMTP(); // telling the class to use SMTP
$mail->SMTPAuth = true; // enable SMTP authentication
$mail->SMTPSecure = "tls"; //sets the prefix to the server
$mail->Host = "smtp.gmail.com"; // SMTP server
$mail->Port = 587; //set the SMTP port for the GMAIL server
$mail->Username = "*******@gmail.com"; // SMTP server username
$mail->Password = "*******"; // SMTP server password
$mail->IsSendmail(); // tell the class to use Sendmail
$mail->AddReplyTo("****@gmail.com","mijn naam");
$mail->From = "*****@gmail.com";
$mail->FromName = "www.*******.nl";
$to = "******@home.nl";
$mail->AddAddress($to);
$mail->Subject = "First PHPMailer Message";
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
$mail->WordWrap = 80; // set word wrap
$mail->MsgHTML($body);
$mail->IsHTML(true); // send as HTML
$mail->Send();
if(!$mail->Send()) {
echo 'Message was not sent.';
echo 'Mailer error: ' . $mail->ErrorInfo;
} else {
echo 'Message has been sent.';
}
?>
alles is op de plaats van **** correct ingevuld.
echter krijg ik al meteen een foutmelding op /usr/sbin/sendmail
Kent hij blijkbaar niet???
Ben ook bezig geweest om class.phpmailer.php te vervangen door class.smtp.php
Daar krijg ik een http-fout 500.
Wat doe ik nou eigenlijk fout?
Moet ik in die 2 class-bestanden ook nog iets invullen of veranderen?
Wie kan mij verder helpen?
Zoekende op internet kom ik niet verder.
Zou dit graag werkende krijgen want ik ben al eeen keer afgesloten geweest omdat ik een keer WorldCast heb geprobeerd en daar ging het helemaal mis mee.
Die leek niet te werken maar ondertussen verstuurde ik wel 1000 mails zonder er erg in te hebben.
probeer eens op de commandline te telnetten naar de poorten die je wilt gebruiken..
Smtp werkt standaard op poort 25, en als standaard alternatief voor providers die poort 25 blokkeren kan je vaak over 587 connecten.
typ dit eens op de commandline:
telnet smtp.gmail.com 25
of
telnet smtp.gmail.com 587
dan weet je in ieder geval of je een verbinding kan maken met de server daar.
@Jeroeb:
de eerste telnet gaf als antwoord:
220 mx.google.com ESMTP v8sm6551........
en de tweede mogelijkheid gaf een soortgelijk antwoord retour.
@Peter:
de mogelijkheid tot html-verenden moet vanaf een site draaien.
deze staan bij vevida.nl en/of mijndomein.nl
ik heb dus 2 keuze mogelijkheden om te testen.
Verder ben ik o.a. dit nog tegen gekomen: http://www.webhostingtalk.com/showthread.php?t=416467
de eerste mogelijkheid geeft een 500-fout
de MIME-versie verstuurd daadwerkelijk een mail, echter gewoon in tekst en geen HTML
Alleen ben ik helemaal van PHPmailer afgestapt.
Ben de gehele dag aan het snuffelen geweest op internet en flink aan het testen geweest.
Momenteel ben ik zover dat ik een werkend script heb. Hoera!
De code:
<?php
$adresArray = array(
"Piet" => "[email protected]",
"pja" => "[email protected]",
"ikke" => "[email protected]",
"test" => "[email protected]",
//etc
);
//define the receiver of the email
$cc = '';
$to = '[email protected]';
//define the subject of the email
$subject = 'Test email';
//create a boundary string. It must be unique
//so we use the MD5 algorithm to generate a random hash
$random_hash = md5(date('r', time()));
//define the headers we want passed. Note that they are separated with \r\n
$headers = "From: [email protected]\r\nReply-To: [email protected]";
//add boundary string and mime type specification
$headers .= "\r\nContent-Type: multipart/alternative; boundary=\"PHP-alt-".$random_hash."\"";
foreach($adresArray AS $name => $adres) {
$cc .= $name .' <'. $adres .'>, ';
}
$headers .= "Bcc: ". $cc ."\r\n";
//define the body of the message.
ob_start(); //Turn on output buffering
?>
--PHP-alt-<?php echo $random_hash; ?>
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Indien u deze mail niet goed ontvangt, ga dan naar de website.
--PHP-alt-<?php echo $random_hash; ?>
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl-nl" lang="nl-nl" dir="ltr" >
<head>
DE HTML-pagina.
</body>
</html>
--PHP-alt-<?php echo $random_hash; ?>--
<?
//copy current buffer contents into $message variable and delete current output buffer
$message = ob_get_clean();
//send the email
$mail_sent = @mail( $to, $subject, $message, $headers );
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed"
echo $mail_sent ? "Mail verzonden." : "Mail failed";
?>
Er zal hier en daar heus wel iets niet echt fraai uitzien, ben tenslotte maar een beginner.
Maar het werkt, alleen de return-path gaat niet naar het ingevulde maar naar de recycler van de server(?) [email protected] de vuilnisbak zo te zien.
Verder wil ik de pagina beveiligen met een inlog.
Ook al gevonden:
<?php
session_start();
//----------------------------------------
// Verander de gegevens hieronder:
// De gebruikersnaam voor de Admin
$gebruikersnaam = "NAAM";
// Het wachtwoord voor de Admin
$wachtwoord = "WACHTWOORD";
// Jouw website naam
$jouwWebsiteNaam = "www.website.nl";
// Jouw e-mailadres
$jouwEmail = "BEKEND";
// De locatie van het databestand
$dataBestand = "niet meer nodig";
// Hierna hoef je niks meer te veranderen!
//----------------------------------------
?>
<html>
<head>
<title>Nieuwsbrief Versturen</title>
</head>
<body>
<center>
<font face="Arial" size=2>
<h3>Nieuwsbrief Versturen</h3>
<br>
<?php
if($gebruikersnaam == $_POST['gebruikersnaam'] && $wachtwoord == $_POST['wachtwoord'] && $_SERVER['REQUEST_METHOD'] == 'POST' ) {
$nieuwsbriefBestand = file($dataBestand);
$nieuwsbriefBestandLengte = count($nieuwsbriefBestand);
$groepenTeller = 0;
for($i = 0; $i < ($nieuwsbriefBestandLengte+50); $i+=50) {
$groep = null;
$groepenTeller++;
for($a = $i; $a < ($i+50); $a++) {
if($nieuwsbriefBestand[$a]) {
$groep .= chop($nieuwsbriefBestand[$a]).",";
}
}
if($groep) { $groepen[] = $groep; }
}
if($html) {
$opmaak = "Content-type: text/html; charset=iso-8859-1\r\n";
}
if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['bericht']) && !empty($_POST['onderwerp'])) {
for($g = 0; $g < count($groepen); $g++) {
$to = $jouwEmail;
$subject = stripslashes($_POST['onderwerp']);
$message = stripslashes($_POST['bericht']);
//CC header voor controle
//ter controle of de mail wel naar de juiste wordt verzonden letop dit is echt alleen om te testen
//$headers = 'Cc:'."$groepen[$g]". "\r\n";
// einde controle
$headers = 'Bcc:'."$groepen[$g]". "\r\n";
$headers .= 'From:'."$jouwWebsiteNaam"."<$jouwEmail>". "\r\n";
mail($to, $subject, $message, $headers);
}
echo("<b>De nieuwsbrief is succesvol verstuurd!</b><br><br><hr><br>");
}
?>
<form action="" method="post">
Onderwerp:<br><input type="text" name="onderwerp" size=20><br><br>
Bericht:<br><textarea cols=40 rows=20 name="bericht"></textarea><br><br>
<input type='checkbox' name='html'> HTML gebruiken<br><br>
<input type='hidden' name='wachtwoord' value='<?php echo $wachtwoord; ?>'>
<input type='hidden' name='gebruikersnaam' value='<?php echo $gebruikersnaam; ?>'>
<input type="submit" value="Verstuur">
</form>
</center>
<br><br>
<?php
echo("Er zijn $nieuwsbriefBestandLengte mensen lid van de nieuwsbrief:<br><br>");
for($g = 0; $g < count($groepen); $g++) {
echo("$groepen[$g]<br>\n");
}
}
else {
echo "<form method='post'>\n";
echo "Gebruikersnaam: <input type=text name='gebruikersnaam'><br>\n";
echo "Wachtwoord: <input type=password name='wachtwoord'><br>\n";
echo "<br><input type='Submit' value='Login'>\n";
echo "</form></center>";
}
?>
<br>
</font>
</center>
</body>
</html>
alleen daar gaat mijn kennis de mist in om de tweede code te strippen en het nodige in de eerste code te plaatsen.
Een script wat dus niet echt voldoet aan de benodigde controles en validaties en de script logica is ook ver te zoeken.
- empty is een zinloze functie
- stripslashes over $_POST moet niet gekker worden, duid erop dat het een en ander niet goed geconfigureerd staat
- ob functies in principe uit den boze
- php variabelen buiten quotes
enz enz
@Noppes:
ik moest even zoeken waar je het over had :-)
Het gaat voornamelijk over dat de beveiling van de onderste code (rest kan weg) in de eerste code komt die er boven staat.