code: 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);
      }
docs: 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