src/User/Service/User.php
public function contact(array $data, $destination = null) 
    {
        $authService = $this->getServiceLocator()->get('ControllerPluginManager')->get('zfcUserAuthentication');
        
        if(null === $destination && !$authService->hasIdentity()) {
            throw new \Exception("Errore si sistema.");
        }
        	
        // Manually set email from identity
        $identity = $authService->getIdentity();
        $data['email'] = null !== $destination ? $destination : $identity->getEmail();
        $form = $this->getServiceLocator()->get('user.form.contact');
        $form->setData($data);
        
        if(!$form->isValid()) {
            throw new \Exception(serialize($form->getMessages()));
        }
        $url = $this->getServiceLocator()->get('ControllerPluginManager')->get('Url');
        $data = array_merge($form->getData(), array(
            'siteurl' => $url->fromRoute('home', array(), array('force_canonical' => true))
        ));
        
        $event = new UserContactEvent(__FUNCTION__, null, $data);
        $this->getEventManager()->trigger(__FUNCTION__ . '.pre', $this, $event);
        $this->getEventManager()->trigger(__FUNCTION__ . '.post', $this, $event);
    }
public function contact(array $data, $destination = null) 
    {
        $authService = $this->getServiceLocator()->get('ControllerPluginManager')->get('zfcUserAuthentication');
        
        if(null === $destination && !$authService->hasIdentity()) {
            throw new \Exception("Errore si sistema.");
        }
        	
        // Manually set email from identity
        $identity = $authService->getIdentity();
        $data['email'] = null !== $destination ? $destination : $identity->getEmail();
        $form = $this->getServiceLocator()->get('user.form.contact');
        $form->setData($data);
        
        if(!$form->isValid()) {
            throw new \Exception(serialize($form->getMessages()));
        }
        $url = $this->getServiceLocator()->get('ControllerPluginManager')->get('Url');
        $data = array_merge($form->getData(), array(
            'siteurl' => $url->fromRoute('home', array(), array('force_canonical' => true))
        ));
        
        $event = new UserContactEvent(__FUNCTION__, null, $data);
        $this->getEventManager()->trigger(__FUNCTION__ . '.pre', $this, $event);
        $this->getEventManager()->trigger(__FUNCTION__ . '.post', $this, $event);
    }
Check if data is valid and dispatch contact event
If destination param is empty, session will used

@param array $data
@param string $destination
@throws \Exception