PHP: PEAR mail help

43,503

Solution 1

I asked the same question over here, and found a real solution (instead of masking errors). Read the answer to the question below for more details, but basically just follow the three edits below.

How to not call a function statically in php?


Find php/pear/Mail.php, go to line 74 and change:

function &factory($driver, $params = array())

to

static function &factory($driver, $params = array())

Also in php/pear/Mail.php go to line 253 and change:

$addresses = Mail_RFC822::parseAddressList($recipients, 'localhost', false);

to

$Mail_RFC822 = new Mail_RFC822();
$addresses = $Mail_RFC822->parseAddressList($recipients, 'localhost', false);

Find php/pear/PEAR.php, go to line 250 and change:

function isError($data, $code = null)

to

static function isError($data, $code = null)

Thanks for Amal for showing how to fix this!

Solution 2

The strict errors do not prevent the code from working.

Just set the error reporting setting to E_ALL & ~E_STRICT and they will magically disappear.

Solution 3

@require_once "Mail.php";
$headers = array ('From' => $from,'To' => $to,'Subject' => $subject);
$smtp = @Mail::factory('smtp', array ('host' => $host,'port' => $port,'auth' => true,
        'username' => $UName,'password' => $UPass));

$mail = @$smtp->send($to, $headers, $body);

if (@PEAR::isError($mail))
{   echo("<p>".$mail->getMessage()."</p>"); }
else
{   echo("<p>Message successfully sent!</p>");  }

Look: I used the @ sign before some of the variables and methods. And with this way you can send email using php5. This is an old aproach, but should work. Though you might be asked about enabling ssl in configuration but that's a piece of cake. Enjoy. And, of course alernate but latest and great technique is using SwiftMailer .

Solution 4

As of PHP 5, calling a non-static method of another class from within the non-static method of another class ist verboten under E_STRICT. When the PEAR_Mail package was authored, this was a somewhat obscure meta-programming hack in PHP. Thus PEAR_Mail is notorious for this.

The method PEAR::isError() probably should have been a static method, but it's not and assumes an instance context with lots of $this thrown around. PEAR_Mail calls it statically within its own instance context, so PHP infers the value of $this... Which is all kinds of Bad News.

PEAR_Mail::factory() should be defined as static but isn't for reasons known only to the original authors. It will ALWAYS generate that "non-static method" warning message until the code is patched.

Note: PEAR_Mail hasn't been touched since 2010. Please don't use it...! For alternatives, use the Google, Luke!

Share:
43,503
iamjonesy
Author by

iamjonesy

Lead dev at Appointedd. Based in Edinburgh, Scotland. A few of my sites: http://findr.fm http://defaqto.io http://masquerade.eu01.aws.af.cm

Updated on March 07, 2020

Comments

  • iamjonesy
    iamjonesy about 4 years

    I'm trying out the mail pear package. It successfully sends an email but give me the following error:

    Strict Standards: Non-static method Mail::factory() should not be called statically, assuming $this from incompatible context in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\ClientPortal\classes\SupportTickets.php on line 356
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Mail\smtp.php on line 365
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 386
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 391
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 398
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 441
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 230
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 445
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Mail\smtp.php on line 376
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 526
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 230
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 529
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 532
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 441
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically,  assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 230
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 445
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 550
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 694
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 230
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 698
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 706
    
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 230
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 1017
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 415
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\PHP\PEAR\Net\SMTP.php on line 230
    
    
    Strict Standards: Non-static method PEAR::isError() should not be called statically, assuming $this from incompatible context in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\ClientPortal\classes\SupportTickets.php on line 364
    Message successfully sent!
    

    Here's my code:

    function submitTicket(){
    
         $from = "Billy Jones <[email protected]>";
         $to = "helpdesk <[email protected]>";
         $subject = "Email Test!";
         $body = "email test body";
    
         $host = "***";
         $username = "***";
         $password = "**********";
    
         $headers = array ('From' => $from,
           'To' => $to,
           'Subject' => $subject);
         $smtp = Mail::factory('smtp',
           array ('host' => $host,
             'auth' => true,
             'username' => $username,
             'password' => $password));
    
         $mail = $smtp->send($to, $headers, $body);
    
         if (PEAR::isError($mail)) {
           echo("<p>" . $mail->getMessage() . "</p>");
          } else {
           echo("<p>Message successfully sent!</p>");
          }
    
    }
    

    Can some one help me out here?