Zend Framework 2 - 使用Zend \ Mail发送表单

时间:2015-06-17 16:27:38

标签: php jquery ajax zend-framework sendmail

所以我正在建立一个联系页面。当然它会有一个表格,需要发送。 我让班级发送电子邮件:

<?php
namespace Site\Mail;

use Zend\Mail\Message;
use Zend\Mail\Transport\Sendmail;

class SendEMail {

    public function SendEMail($to, $from, $subject, $body) {
        $message = new Message();
        $message->addTo($to)
                ->addFrom($from)
                ->setSubject($subject)
                ->setBody($body);
        $transport = new Sendmail();
        try {
            $transport->send($message);
            return true;
        } catch (\Exception $e) {
            return false;
        }
    }
}

?>

在控制器中我有

public function emailAction () {
    $request = $this->getRequest();
    $vm = new ViewModel();
    $vm->setTerminal(true);
    if ($request->isPost()) {
        $to = "some@mail.com";
        $from = $request->getPost("email");
        $subject = "Messaggio inviato da ".$request->getPost("nome")." (tel. ".$request->getPost("phone").")";
        $body = $request->getPost("messaggio");
        $mail = new SendEMail($to, $from, $subject, $body);

        if (!$mail) {
            $vm->setVariables(array(
                "result" => "no"
            ));
            return $vm;
        } else {
        $vm->setVariables(array(
            "result" => "yes"
        ));
        return $vm;
        }
    }
    $vm->setVariables(array(
            "result" => "This script needs POSTDATA."
    ));
    return $vm;
}

我禁用了布局以允许Ajax / Jquery脚本加载它,它就像一个魅力(我会告诉你它虽然我认为它不会导致我的问题)

$(document).on('submit', 'form', function() {
    $.ajax({
        url:$("form").attr("action"),
        method:"POST",
        beforeSend: function() {
            $("form").css("opacity", 0.5);
        },
        complete: function() {
            $("form").css("opacity", 1);
        },
        success: function(responseText) {
            $("body").append("<div id='popupmessage'>"+responseText+"</div>");
        },
        error: function(errorThrown) {
            $("body").append("<div id='popupmessage'>"+errorThrown+"</div>");
        }
    }).always(function() {
        $("#popupmessage").delay(1000).fadeOut(300, function () {
            if($(this).length>0) {
                $(this).remove();
            }
        });
    });
    return false;
});

问题是我的SendEMail()函数看起来总是返回true,即使我在sendmail.ini中设置了错误的设置(我正在使用sendmail)。 我的错是什么?我感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

当我实施我的电子邮件方法时,我无法通过以下方式获得例外:

  

catch(\ Exception $ e){               return false;}

对我来说,获得它并不是那么重要。但是在某些时候我注意到当域不存在或者错误时我得到了一个例外,所以我将异常缩小到了。

} catch (\Zend\Mail\Protocol\Exception\RuntimeException $e) {
            $error = true;
        }

因此,如果这不是您想要的,我会假设进行此更改会为您提供比runtimeException更多的内容,或者您​​可以按照假设返回给您想要的结果的方式保留它

} catch (\Zend\Mail\Protocol\Exception $e) {
                $error = true;
            }

我希望这会有所帮助。祝你好运。

更新

我注意到我正在使用SMTP传输(more details)所以这就是我使用协议Exception的原因。如果你在Zend Library里面检查,你会看到另一个文件夹Zend \ Mail \ Exception。所以在try catch中尝试一下,例如

} catch (\Zend\Mail\Exception $e) {
    $error = true;
 }

如果这不起作用,请尝试缩小异常范围:在文件夹中,您将看到6个异常类在try catch(\ Zend \ Mail \ Exception \ AnExceptionClass)中测试每个异常类

我希望这会有所帮助。