Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] Foreach loop stopt na succesvol verzenden PEAR-mail

Pagina: 1
Acties:

  • devloomax
  • Registratie: Juli 2011
  • Laatst online: 15-04 19:57
Mijn script voert normaalgezien een loop uit om mails met bijlage te versturen, aan de hand van het aantal bijlages dat er zijn. Deze worden dan telkens via PEAR verstuurd. Nu stopt mijn code echter altijd met het uitvoeren van de loop als de mail succesvol is verstuurd. Wat doe ik verkeerd? De loop bleef wel doorwerken gebruikmakende van de standaard php-mailfunctie maar moet het werkende krijgen met PEAR.

PHP: filename
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
52
53
 foreach ($seats as $sid)
                        {
                            $filename = UPLOAD_PATH.'tickets/p_'.$_POST['id'].'_'.$sid.'.pdf';
                            # Send to CLIENT
                            $Email->sendAttachment($client_email, $subject, $message, $admin_email, $admin_email, basename($filename), $filename, 'application/pdf');


function sendAttachment($to, $subject, $body, $from, $replyTo, $filename, $filepath, $filemime=null)
    {
    
include('Mail.php');

    $content = chunk_split(base64_encode(@file_get_contents($filepath)));
        $uid = md5(uniqid(rand(), true));

    $headers = array ('From' => $replyTo,'To' => $to, 'Subject' => $subject,'MIME-Version' => "1.0", 'Content-Type' => 'multipart/mixed; boundary="PHP-mixed-'.$uid.'"');
        
        $message = "--PHP-mixed-".$uid.$this->eol;
        $message .= 'Content-Type: multipart/alternative; boundary="PHP-alt-'.$uid.'"'.$this->eol.$this->eol; 
    
        $message .= "--PHP-alt-".$uid.$this->eol;
        $message .= "Content-type: ".$this->contentType."; charset=".$this->charset.$this->eol;
        $message .= "Content-Transfer-Encoding: ".$this->getContentTransferEncoding().$this->eol.$this->eol;
        
        $message .= $body.$this->eol.$this->eol;
        
        $message .= "--PHP-alt-".$uid."--".$this->eol.$this->eol; 
        
        $message .= "--PHP-mixed-".$uid.$this->eol; 
        $message .= 'Content-Type: '.(!empty($filemime) ? $filemime : 'application/octet-stream').'; name="'.$filename.'"'.$this->eol;
        $message .= "Content-Transfer-Encoding: base64".$this->eol;
        $message .= 'Content-Disposition: attachment; filename="'.$filename.'"'.$this->eol.$this->eol;
        
        $message .= $content.$this->eol;
        $message .= "--PHP-mixed-".$uid."--".$this->eol;

    $host =     "ssl://smtp.gmail.com";
    $port =     "465";
    $username = "ticketing@mdware.org";
    $password = "********";

    $smtp = Mail::factory('smtp',
      array (
            'host' => $host,
            'port' => $port,
            'auth' => true,
            'username' => $username,
            'password' => $password));

$mail = $smtp->send($to, $headers, $message);
}

                        }

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 21-11 14:12
Je include die file en definieert die functie in de foreach loop, dus dat gaat de eerste keer goed schijnbaar, maar daarna crasht ie omdat de functie al bestaat waarschijnlijk.
Zet die include en functie eens boven je loop.

En ipv pear mail zou je eens naar swiftmailer kunnen kijken, iets moderner.

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 22-11 18:52

Sebazzz

3dp

PHP:
1
error_reporting(E_ALL);

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


  • PatrickH89
  • Registratie: November 2009
  • Laatst online: 22-11 17:47
Barryvdh schreef op zaterdag 18 januari 2014 @ 10:01:
Je include die file en definieert die functie in de foreach loop, dus dat gaat de eerste keer goed schijnbaar, maar daarna crasht ie omdat de functie al bestaat waarschijnlijk.
Zet die include en functie eens boven je loop.

En ipv pear mail zou je eens naar swiftmailer kunnen kijken, iets moderner.
In het ergste geval zou een include_once ook kunnen, maar een include hoort zoals gezegd zeker niet in een functie.
PHP:
1
error_reporting(-1);


Strict errors zijn vaak ook interessant.

[ Voor 17% gewijzigd door PatrickH89 op 18-01-2014 11:34 ]


  • Cartman!
  • Registratie: April 2000
  • Niet online
PEAR is best wel antiek ondertussen ook, er zijn veel betere alternatieven als (al genoemd): Swiftmailer, Zend\Mail of PHPMailer.

Verder gewoon een kwestie van leren debuggen :)

  • cytherea
  • Registratie: Oktober 2003
  • Laatst online: 25-09 10:57
Ook nooit @ gebruiken voor een functieaanroep, als er wat fout gaat kom je er nooit achter. Debugging is echt ellende dan. Beter nette foutafhandeling schrijven en alles loggen.

Kijk ook even naar $_POST['id'] in die $filename concatenatie, dat is een klassiek securityrisk. Maak er op zijn minst een int van met een expliciete cast of een regex.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Barryvdh schreef op zaterdag 18 januari 2014 @ 10:01:
Zet die include en functie eens boven je loop.
En als je er echt op staat dat dat de juiste plek is: include_once (of liever, in dit geval: require_once) gebruiken in plaats van include. Maar zeer waarschijnlijk is de opzet van je Mail.php en dus de meervoudige include daarvan niet goed in deze situatie.

[ Voor 16% gewijzigd door NMe op 18-01-2014 15:03 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • devloomax
  • Registratie: Juli 2011
  • Laatst online: 15-04 19:57
Bedankt voor al de reacties!
Jullie stellen enkele andere emailtoepassingen voor, welke is de snelste in het afhandelen van SMTP-verkeer?
Want merk wel dat de PEAR-SMTP-implementatie vele keren trager is dan de standaard php-mail-fucntie (die ik echter niet kan gebruiken, aangezien microsoftmailboxen die steevast als spam markeren).

  • PatrickH89
  • Registratie: November 2009
  • Laatst online: 22-11 17:47
devloomax schreef op zaterdag 18 januari 2014 @ 15:36:
Bedankt voor al de reacties!
Jullie stellen enkele andere emailtoepassingen voor, welke is de snelste in het afhandelen van SMTP-verkeer?
Want merk wel dat de PEAR-SMTP-implementatie vele keren trager is dan de standaard php-mail-fucntie (die ik echter niet kan gebruiken, aangezien microsoftmailboxen die steevast als spam markeren).
In principe zou je de standaard mail functie best kunnen gebruiken als je de juiste headers zou zetten, maar het is sowieso beter om een library te gebruiken die dat allemaal voor zijn rekening neemt. Ik weet niet welke het snelste is, want ik heb nooit één van de bekende libraries gebenchmarked.

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 21-11 14:12
Ik weet niet of de php implementaties veel schelen, maar SMTP is sowieso langzamer dan mail() volgens mij, maar ook betrouwbaarder. En eigenlijk zou je mails niet direct moeten versturen, maar in de achtergrond (maar dat is weer wat lastiger)
Ik gebruikt altijd SwiftMailer, http://swiftmailer.org/
Daar kan je ook verschillende methodes van transport (mail(), smtp etc) kiezen, maar dat kan met PHPMailer vast ook gewoon.

Edit: Je kan natuurlijk ook een 3rd party service gebruiken met een API, zoals Mandrill of Amazon SES (http://aws.amazon.com/ses/), dat kan betrouwbaarder zijn.

[ Voor 16% gewijzigd door Barryvdh op 18-01-2014 16:09 ]


  • devloomax
  • Registratie: Juli 2011
  • Laatst online: 15-04 19:57
Ja een mens zou er een cron-job van kunne maken bijvoorbeeld maar daar heb ik nog nooit mee gewerkt...

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Wat denk je daar dan precies mee op te schieten?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1