0

我是新手,我正在尝试创建一个使用 phpmailer 类的静态电子邮件类。

我想做的是......

Email::send('from', 'to', 'subject', 'html message'); // works

但是如果我想添加附件...

Email::send('from', 'to', 'subject', 'html message')->attach('file/blah.txt');

这会引发一个致命错误:Call to undefined method PHPMailer::attach(),我明白为什么,我只是不知道如何让 Email 类执行上述代码,如果可能的话。

下面是我实验过的。

class Email {

    static $attach;

    public static function send($from, $to, $subject, $message)
    {
        $email = new PHPmailer();

        try {

            $email->AddAddress($to);
            $email->SetFrom($from);
            $email->Subject = $subject;
            $email->MsgHTML($message);

            if (self::$attach) $email->AddAttachment(self::$attach);        

            $email->Send();
        }
        catch (phpmailerException $e)
        {
            return $e->errorMessage();
        }
        catch (Exception $e)
        {
            return $e->getMessage();
        }

        return $email;
    }

    public static function attach($attachment)
    {
        self::$attach = $_SERVER['DOCUMENT_ROOT'].$attachment;
    }
}
4

2 回答 2

2

你的 API 没有任何意义。要做你试图用链接做的事情,你需要使用实例,但你也可以使用静态来使界面更像你想要的:

class Email {

    protected $attchements = array();
    protected $mailer;

    public function __construct($from, $to, $subject, $message) {
          $this->mailer = new PHPMailer();

          $this->mailer->AddAddress($to);
          $this->mailer->SetFrom($from);
          $this->mailer->Subject = $subject;
          $this->mailer->MsgHTML($message);

    }

    public static function create($from, $to, $subject, $message) {
        $instance = new Self($from, $to, $subject, $message);
        return $instance;

    }

    public static function createAndSend($from, $to, $subject, $message) {
         $instance = new Self($from, $to, $subject, $message);
         return $instance->send();
    }

    public function send()
    {
       if(!empty($this->attachments)) {
           foreach($this->attachments as $attachment) {
               $this->mailer->AddAttachment($attachment);
           }
       }

       return $this->mailer->send();        
    }

    public function attach($attachment)
    {
        $this->attachments[] = $_SERVER['DOCUMENT_ROOT'].$attachment;
        return $this;
    }
}

因此,您的用法如下所示:

//simple
Email::createAndSend($to, $from, $subject, $message);

// with attachment
Email::create($to, $from, $subject, $message)
   ->attach('fileone.txt')
   ->attach('filetwo.txt')
   ->send();

还应该注意的是,我从我的示例中删除了您的异常处理......你应该整合它......我这样做只是为了保持简短和甜蜜:-)

于 2012-10-18T22:13:38.553 回答
0

流利的指令适用于对象(不同于静态类)。

在您的情况下,只需反转指令:

Email::attach('file/blah.txt');
Email::send('from', 'to', 'subject', 'html message');

但是一个真实的对象可能会更好。

于 2012-10-18T22:11:48.793 回答