Search code examples
phpzend-frameworkframeworksemail

Email contact form not sending and gives an error Zend Framework 2


I have inherited a website for a client which was built using zend framework 2. I have figured out how to move it to my host which is great, however one issue remains and that is the email contact form. When sending an email via the contact form I get the following error. I suspect its a config area but having not used this system before I wondered if anyone could point me in the right direction of fixing this error.

Website

contact form page

Cheers

An error occurred. Exception: \n #0 /homepages/43/d387176596/htdocs/zAJSL/vendor/zendframework/zendframework/library/Zend/Mail/Protocol/Smtp.php(149): Zend\Mail\Protocol\AbstractProtocol->_connect('tcp://auth.smtp...') #1 /homepages/43/d387176596/htdocs/zAJSL/vendor/zendframework/zendframework/library/Zend/Mail/Transport/Smtp.php(340): Zend\Mail\Protocol\Smtp->connect() #2 /homepages/43/d387176596/htdocs/zAJSL/vendor/zendframework/zendframework/library/Zend/Mail/Transport/Smtp.php(326): Zend\Mail\Transport\Smtp->connect() #3 /homepages/43/d387176596/htdocs/zAJSL/vendor/zendframework/zendframework/library/Zend/Mail/Transport/Smtp.php(337): Zend\Mail\Transport\Smtp->lazyLoadConnection() #4 /homepages/43/d387176596/htdocs/zAJSL/vendor/zendframework/zendframework/library/Zend/Mail/Transport/Smtp.php(204): Zend\Mail\Transport\Smtp->connect() #5 /homepages/43/d387176596/htdocs/zAJSL/vendor/acelaya/zf2-acmailer/src/Service/MailService.php(88): Zend\Mail\Transport\Smtp->send(Object(Zend\Mail\Message)) #6 /homepages/43/d387176596/htdocs/zAJSL/module/W7Contact/src/W7Contact/Model/Model.php(99): AcMailer\Service\MailService->send() #7 /homepages/43/d387176596/htdocs/zAJSL/module/W7Contact/src/W7Contact/Controller/IndexController.php(117): W7Contact\Model\Model->sendContactEmail(Array) #8 /homepages/43/d387176596/htdocs/zAJSL/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/AbstractActionController.php(83): W7Contact\Controller\IndexController->indexAction() #9 [internal function]: Zend\Mvc\Controller\AbstractActionController->onDispatch(Object(Zend\Mvc\MvcEvent)) #10 /homepages/43/d387176596/htdocs/zAJSL/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(468): call_user_func(Array, Object(Zend\Mvc\MvcEvent)) #11 /homepages/43/d387176596/htdocs/zAJSL/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(207): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure)) #12 /homepages/43/d387176596/htdocs/zAJSL/vendor/zendframework/zendframework/library/Zend/Mvc/Controller/AbstractController.php(116): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure)) #13 /homepages/43/d387176596/htdocs/zAJSL/vendor/zendframework/zendframework/library/Zend/Mvc/DispatchListener.php(113): Zend\Mvc\Controller\AbstractController->dispatch(Object(Zend\Http\PhpEnvironment\Request), Object(Zend\Http\PhpEnvironment\Response)) #14 [internal function]: Zend\Mvc\DispatchListener->onDispatch(Object(Zend\Mvc\MvcEvent)) #15 /homepages/43/d387176596/htdocs/zAJSL/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(468): call_user_func(Array, Object(Zend\Mvc\MvcEvent)) #16 /homepages/43/d387176596/htdocs/zAJSL/vendor/zendframework/zendframework/library/Zend/EventManager/EventManager.php(207): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure)) #17 /homepages/43/d387176596/htdocs/zAJSL/vendor/zendframework/zendframework/library/Zend/Mvc/Application.php(313): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure)) #18 /homepages/43/d387176596/htdocs/zAJSL/public/index.php(40): Zend\Mvc\Application->run() #19 {main}

Update 19-MAR-17

I found the config here:

/vendor/acelaya/zf2-acmailer/config

There 2 files there

module.config.php & mail.global.php.dist

The mail.global.php.dist seems to have some config options which I tried but doesn't appear to help. I need to set it up to use the following imap settings:

Setting IMAP
Incoming Server imap.1and1.co.uk
Port with SSL enabled 993
Outgoing Server (SMTP) auth.smtp.1and1.co.uk
Outgoing port with TLS enabled 587
Outgoing server requires authentication
(user name and password)? Yes

Here is the file

<?php
return array(

    'mail_options' => array(

        /***********
         * ADAPTER *
         ***********/

        /*
         * The mail adapter to be used.
         * You can define any class implementing Zend\Mail\Transport\TransportInterface,
         * either the class fully qualified name or the instance to be used.
         * For standard mail transports, you can use aliases,
         *      - sendmail  => Zend\Mail\Transport\Sendmail
         *      - smtp      => Zend\Mail\Transport\Smtp
         *      - file      => Zend\Mail\Transport\File
         *      - null      => Zend\Mail\Transport\Null
         * Default value is Zend\Mail\Transport\Sendmail
         */
        //'mail_adapter' => 'Zend\Mail\Transport\Sendmail',

        /*
         * A service name which will return a Zend\Mail\Transport\TransportInterface instance to be used as the
         * transport object.
         * If this is set to something other than null, the 'mail_adapter' option will be ignored
         * Default value is null
         *
         * Note: Many configuration options are useful for standard transport objects only.
         * The mail_dapater_service is useful to configure your own transport object with custom options
         */
        //'mail_adapter_service' => null,

        /************************
         * COMMON CONFIGURATION *
         ************************/

        /*
         * From email address of the email.
         * It would be used as SMTP username if mail_adapter is set to Zend\Mail\Transport\Smtp
         * and no smtp_user is provided
         * Default value is an empty string
         */
        //'from' => '',

        /*
         * From name to be displayed instead of from address.
         * Default value is an empty string
         */
        //'from_name' => '',

        /*
         * Destination addresses of sent emails. It can be an email address as string or an array of email addresses.
         * Default value is an empty array.
         */
        //'to' => array(),

        /*
         * Copy destination addresses of sent emails.
         * It can be an email address as string or an array of email addresses.
         * Default value is an empty array
         */
        //'cc' => array(),

        /*
         * Hidden copy destination addresses of sent emails.
         * It can be an email address as string or an array of email addresses.
         * Default value is an empty array
         */
        //'bcc' => array(),

        /*
         * Email subject.
         * Default value is an empty string
         */
        //'subject' => '',

        /*
         * Email body. Can be a string or hardcoded HTML.
         * If a more complex value is needed it will have to be done in the code.
         * Default value is an empty string.
         */
        //'body' => '',

        /*
         * The charset to be set to the body when setting an HTML string body.
         * It will be ignored if the body is a plain text string.
         * Default value is 'utf-8'.
         */
        //'body_charset' => 'utf-8',

        /*
         * Defines information to create the email body from a view partial.
         * It defines template path and template params.
         * The path will be resolved by a view resolver, so you need to place mail templates inside a view
         * folder of one of your modules or customize your template map and template path stack.
         * Params will be a group of key-value pairs.
         * It has a use_template property which tells if template should be used automatically,
         * ignoring anything defined at 'body' option. It is false by default.
         *
         * The 'children' property allows to define children for the template, in case you want to use layouts.
         * You can define any number of children. The key is the 'capture_to' property.
         * If you set the key 'content' to the child, you should have something like echo $this->content in you layout.
         * Any child can have its own children, so you can nest views into other views recursively.
         * By default no children are used
         */
        //'template' => array(
        //    'use_template'  => false,
        //    'path'          => 'ac-mailer/mail-templates/layout',
        //    'params'        => array(),
        //    'children'      => array(
        //        'content'   => array(
        //            'path'   => 'ac-mailer/mail-templates/mail',
        //            'params' => array(),
        //        )
        //    )
        //),

        /*
         * Attachments config.
         * Allows to define an array of files that will be attached to the message,
         * or even a directory that will be iterated to attach all found files.
         * Set directory will only be iterated if 'iterate' property is true and 'path' is a valid directory.
         * If 'recursive' is true all nested directories will be iterated too.
         * If both files and dir are set, all files will be merged without duplication
         * By default the files array is empty and the directory won't be iterated
         */
        //'attachments' => array(
        //    'files' => array(),
        //    'dir' => array(
        //        'iterate'   => false,
        //        'path'      => 'data/mail/attachments',
        //        'recursive' => false,
        //    ),
        //),

        /**********************
         * SMTP CONFIGURATION *
         **********************/

        /*
         * Hostname or IP address of mail server to be used.
         * Default value is localhost
         */
        'server' => 'auth.smtp.1and1.co.uk',

        /*
         * If Zend\Mail\Transport\Smtp adapter is used, this is the SMTP authentication identity.
         * If this is not set, from option is used.
         * Default value is an empty string
         */
        'smtp_user' => '****@****.co.uk',

        /*
         * If Zend\Mail\Transport\Smtp adapter is used, this is the SMTP authentication credential.
         * Default value is an empty string
         */
        'smtp_password' => '********',

        /*
         * If Zend\Mail\Transport\Smtp adapter is used, this defines the SSL type to be used, 'ssl' or 'tls'.
         * Boolean false should be used to disable SSL.
         * Default value is false
         */
        'ssl' => true,

        /*
         * If Zend\Mail\Transport\Smtp adapter is used, this is the connection class used for authentication.
         * Value can be one of 'smtp', 'plain', 'login' or 'crammd5'.
         * Default value is login. ZF2 default is smtp
         */
        //'connection_class' => 'login',

        /*
         * If Zend\Mail\Transport\Smtp adapter is used, this is the SMTP server port
         */
        'port' => 993,

        /**********************
         * FILE CONFIGURATION *
         **********************/

        /*
         * If Zend\Mail\Transport\File adapter is used, thi sis the folder where the file is going to be saved
         * Default value is 'data/mail/output'
         */
        //'file_path' => 'data/mail/output',

        /**
         * A callable that will get the Zend\Mail\Transport\File object as an argument and should return the filename
         * Default value is null, in which case a default callable will be used
         */
        //'file_callback' => null,

    )

);

Solution

  • In case anyone sees this and has the same issue the real problem was this:

    wrong: 'mail_adapter' => 'Zend\Mail\Transport\smtp',

    Correct: 'mail_adapter' => 'Zend\Mail\Transport\Sendmail',

    1and1 uses sendmail instead of smtp.

    For 1and1 you need these settings:

    'server' => 'auth.smtp.1and1.co.uk',

    'ssl' => 'tls',

    'connection_class' => 'smtp',

    'port' => 587,

    The username is your email and the other settings speak for themselves.

    Thanks again to Thomas for helping me in the right direction. I spent the best part of 4 days researching for this problem so i hope this finds anyone else who needs it.

    Cheers