Zend_Mail generateMessage()导致致命错误:在非对象上调用成员函数getContent()

时间:2013-03-19 12:08:58

标签: zend-framework zend-mail

我正在使用Zend_Mail_Transport_Smtp发送电子邮件。发送部分工作正常,但是,我正在努力将电子邮件复制到发送电子邮件帐户的“已发送”文件夹。从Zend_Mail生成消息时,我不断收到Call to a member function getContent() on a non-object.

这是我正在做的事情:

$config = array(
            'auth' => 'login',
            'username' => $from,
            'password' => $password);

$transport = new Zend_Mail_Transport_Smtp('smtp.123-reg.co.uk', $config);
Zend_Mail::setDefaultTransport($transport);
$mail = new Zend_Mail('utf-8');

$mail->addTo('foo@bar.com');
$mail->setSubject('Test');
$mail->setFrom('baz@bar.com', 'Baz');
$mail->setBodyText('This is the email');

$mail->send();

**$message = $mail->generateMessage(); <----- here is the problem**

*This is where I would append the message to the sent folder.*
$mail = new Zend_Mail_Storage_Imap
            array('host' => 'imap.123-reg.co.uk',
            'user' => 'baz@bar.com',
            'password' => 'p'
        ));
$mail->appendMessage($message,'Sent');

我不确定我是否遗漏了任何东西,或者完全错误地做了这件事。任何帮助都会很棒。

2 个答案:

答案 0 :(得分:0)

好的,我找到了解决问题的方法。 Zend_mail是错误/不完整的,因为它实际上并没有从Zend_mail对象创建一个字符串(至少在ZF1中)。

我的解决方案可能不是最优雅的,但至少是它的工作解决方案。我最终使用了Swift Mailer-它非常优雅(它只处理发送电子邮件 - 而不是IMAP的东西)发送电子邮件。使用swift调用toString()方法创建消息后,您就可以使用Zend_mail的appendMessage()。我从http://php.net/manual/en/function.imap-append.php的rixtsa帖子中得到了解决方案。也许ZF2没有这个问题,但是如果你在ZF1上就可以使用这种方法。

 // create the message
        $message = Swift_Message::newInstance()
                ->setSubject('The subject')
                ->setFrom(array('a@b.com'=> 'Alfa Beta'))
                ->setTo(array('recipient1@r.com','recipient2@r.com'))
                ->setBody('The body is here= could be')
                ->addPart('<q>If you want html body use this method/q>', 'text/html')
        ;
   //send the message
        $transport = Swift_SmtpTransport::newInstance('smtp.123-reg.co.uk', 25)
                ->setUsername($user)
                ->setPassword($password)
        ;
    $mailer = Swift_Mailer::newInstance($transport);
    $result = $mailer->send($message);

   // generate the string from the message
   $msg = $message->toString();

   // use the string with Zend_Mail_Storage_Imap's appendMessage()
   $mail = new Zend_Mail_Storage_Imap(
                    array('host' => 'imap.123-reg.co.uk',
                        'user' => $user,
                        'password' => $password
            ));
    $mail->selectFolder('Sent');
    $mail->appendMessage($msg);

我希望有人可以找到一个更好,更优雅的解决方案 - 甚至更好 - 错误得到整理。但就目前而言,经过大量的阅读和搜索后,我最终使用Swift Mailer弥补了这一差距。

答案 1 :(得分:0)

您可以自己构建消息字符串

//...send the e-mail, then copy it on Sent folder using this code:
$mail = new Zend_Mail_Storage_Imap(array(
        'host'     => 'imap.123-reg.co.uk',
        'user'     => 'baz@bar.com',
        'password' => 'p'
));
$mail->appendMessage($transport->header . Zend_Mime::LINEEND . $transport->body,'Sent');