3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.5 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2014 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
31 * @copyright CiviCRM LLC (c) 2004-2014
37 * Form to send test mail
39 class CRM_Mailing_Form_Test
extends CRM_Core_Form
{
42 * Function to set variables up before form is built
47 public function preProcess() {
48 //when user come from search context.
49 $ssID = $this->get('ssID');
50 $this->assign('ssid',$ssID);
51 $this->_searchBasedMailing
= CRM_Contact_Form_Search
::isSearchContext($this->get('context'));
52 if(CRM_Contact_Form_Search
::isSearchContext($this->get('context')) && !$ssID){
54 $result = CRM_Core_BAO_PrevNextCache
::getSelectedContacts();
55 $this->assign("value", $result);
60 * This function sets the default values for the form.
66 function setDefaultValues() {
67 $count = $this->get('count');
68 $this->assign('count', $count);
71 public function buildQuickForm() {
72 $session = CRM_Core_Session
::singleton();
73 $this->add('text', 'test_email', ts('Send to This Address'));
74 $defaults['test_email'] = $session->get('ufUniqID');
75 $qfKey = $this->get('qfKey');
79 ts('Send to This Group'),
80 array('' => ts('- none -')) + CRM_Core_PseudoConstant
::group('Mailing')
82 $this->setDefaults($defaults);
84 $this->add('submit', 'sendtest', ts('Send a Test Mailing'));
85 $name = ts('Next >>');
86 if (CRM_Mailing_Info
::workflowEnabled()) {
87 if (!CRM_Core_Permission
::check('schedule mailings') &&
88 CRM_Core_Permission
::check('create mailings')
90 $name = ts('Inform Scheduler');
95 array('type' => 'back',
96 'name' => ts('<< Previous'),
101 'spacing' => ' ',
106 'name' => ts('Save & Continue Later'),
110 'name' => ts('Cancel'),
114 $this->addButtons($buttons);
116 $mailingID = $this->get('mailing_id');
117 $textFile = $this->get('textFile');
118 $htmlFile = $this->get('htmlFile');
120 $this->addFormRule(array('CRM_Mailing_Form_Test', 'testMail'), $this);
123 $preview['text_link'] = CRM_Utils_System
::url('civicrm/mailing/preview', "type=text&qfKey=$qfKey");
126 $preview['html_link'] = CRM_Utils_System
::url('civicrm/mailing/preview', "type=html&qfKey=$qfKey");
129 $preview['attachment'] = CRM_Core_BAO_File
::attachmentInfo('civicrm_mailing', $mailingID);
130 $this->assign('preview', $preview);
131 //Token Replacement of Subject in preview mailing
133 $prefix = "CRM_Mailing_Controller_Send_$qfKey";
134 if ($this->_searchBasedMailing
) {
135 $prefix = "CRM_Contact_Controller_Search_$qfKey";
137 $session->getVars($options, $prefix);
139 $mailing = new CRM_Mailing_BAO_Mailing();
140 $mailing->id
= $options['mailing_id'];
141 $mailing->find(TRUE);
142 $fromEmail = $mailing->from_email
;
143 $replyToEmail = $mailing->replyto_email
;
145 $attachments = CRM_Core_BAO_File
::getEntityFile('civicrm_mailing',
149 $returnProperties = $mailing->getReturnProperties();
150 $userID = $session->get('userID');
151 $params = array('contact_id' => $userID);
153 $details = CRM_Utils_Token
::getTokenDetails($params,
156 $mailing->getFlattenedTokens(),
160 $allDetails = &$mailing->compose(NULL, NULL, NULL,
165 $details[0][$userID],
169 $this->assign('subject', $allDetails->_headers
['Subject']);
173 * Form rule to send out a test mailing.
176 * @param array $files Any files posted to the form
177 * @param array $self an current this object
179 * @internal param array $params Array of the form values
180 * @return boolean true on successful SMTP handoff
183 static function testMail($testParams, $files, $self) {
186 $urlString = 'civicrm/mailing/send';
187 $urlParams = "_qf_Test_display=true&qfKey={$testParams['qfKey']}";
189 $ssID = $self->get('ssID');
190 if ($ssID && $self->_searchBasedMailing
) {
191 if ($self->_action
== CRM_Core_Action
::BASIC
) {
192 $fragment = 'search';
194 elseif ($self->_action
== CRM_Core_Action
::PROFILE
) {
195 $fragment = 'search/builder';
197 elseif ($self->_action
== CRM_Core_Action
::ADVANCED
) {
198 $fragment = 'search/advanced';
201 $fragment = 'search/custom';
203 $urlString = 'civicrm/contact/' . $fragment;
206 if (!empty($testParams['sendtest'])) {
207 if (!($testParams['test_group'] ||
$testParams['test_email'])) {
208 CRM_Core_Session
::setStatus(ts('You did not provide an email address or select a group.'), ts('Test not sent.'), 'error');
212 if ($testParams['test_email']) {
213 $emailAdd = explode(',', $testParams['test_email']);
214 foreach ($emailAdd as $key => $value) {
215 $email = trim($value);
216 $testParams['emails'][] = $email;
217 $emails .= $emails ?
",'$email'" : "'$email'";
218 if (!CRM_Utils_Rule
::email($email)) {
219 CRM_Core_Session
::setStatus(ts('Please enter a valid email addresses.'), ts('Test not sent.'), 'error');
226 $url = CRM_Utils_System
::url($urlString, $urlParams);
227 CRM_Utils_System
::redirect($url);
232 if (!empty($testParams['_qf_Test_submit'])) {
233 //when user perform mailing from search context
234 //redirect it to search result CRM-3711.
235 if ($ssID && $self->_searchBasedMailing
) {
236 $draftURL = CRM_Utils_System
::url('civicrm/mailing/browse/unscheduled', 'scheduled=false&reset=1');
237 $status = ts("You can continue later by clicking the 'Continue' action to resume working on it.<br />From <a href='%1'>Draft and Unscheduled Mailings</a>.", array(1 => $draftURL));
239 //replace user context to search.
240 $context = $self->get('context');
241 if (!CRM_Contact_Form_Search
::isSearchContext($context)) {
244 $urlParams = "force=1&reset=1&ssID={$ssID}&context={$context}&qfKey={$testParams['qfKey']}";
245 $url = CRM_Utils_System
::url($urlString, $urlParams);
248 $status = ts("Click the 'Continue' action to resume working on it.");
249 $url = CRM_Utils_System
::url('civicrm/mailing/browse/unscheduled', 'scheduled=false&reset=1');
251 CRM_Core_Session
::setStatus($status, ts('Mailing Saved'), 'success');
252 CRM_Utils_System
::redirect($url);
255 if (CRM_Mailing_Info
::workflowEnabled()) {
256 if (!CRM_Core_Permission
::check('schedule mailings') &&
257 CRM_Core_Permission
::check('create mailings')
259 $url = CRM_Utils_System
::url('civicrm/mailing/browse/unscheduled', 'scheduled=false&reset=1');
260 CRM_Utils_System
::redirect($url);
264 if (!empty($testParams['_qf_Test_next']) &&
265 $self->get('count') <= 0) {
268 ts("You can not schedule or send this mailing because there are currently no recipients selected. Click 'Previous' to return to the Select Recipients step, OR click 'Save & Continue Later'."),
272 if (!empty($_POST['_qf_Import_refresh']) ||
!empty($testParams['_qf_Test_next']) ||
empty($testParams['sendtest'])) {
277 $job = new CRM_Mailing_BAO_MailingJob();
278 $job->mailing_id
= $self->get('mailing_id');
279 $job->is_test
= TRUE;
282 $session = CRM_Core_Session
::singleton();
283 if (!empty($testParams['emails'])) {
285 SELECT e.id, e.contact_id, e.email
287 INNER JOIN civicrm_contact c ON e.contact_id = c.id
288 WHERE e.email IN ($emails)
291 AND c.do_not_email = 0
293 AND c.is_deceased = 0
295 ORDER BY e.is_bulkmail DESC, e.is_primary DESC
298 $dao = CRM_Core_DAO
::executeQuery($query);
299 $emailDetail = array();
300 // fetch contact_id and email id for all existing emails
301 while ($dao->fetch()) {
302 $emailDetail[$dao->email
] = array(
303 'contact_id' => $dao->contact_id
,
304 'email_id' => $dao->id
,
309 foreach ($testParams['emails'] as $key => $email) {
310 // Email addresses are forced to lower case when saved, so ensure
311 // we have the same case when comparing.
312 $email = trim(strtolower($email));
313 $contactId = $emailId = NULL;
314 if (array_key_exists($email, $emailDetail)) {
315 $emailId = $emailDetail[$email]['email_id'];
316 $contactId = $emailDetail[$email]['contact_id'];
320 //create new contact.
322 'contact_type' => 'Individual',
324 1 => array('email' => $email,
326 'location_type_id' => 1,
329 $contact = CRM_Contact_BAO_Contact
::create($params);
330 $emailId = $contact->email
[0]->id
;
331 $contactId = $contact->id
;
335 'job_id' => $job->id
,
336 'email_id' => $emailId,
337 'contact_id' => $contactId,
339 CRM_Mailing_Event_BAO_Queue
::create($params);
343 $testParams['job_id'] = $job->id
;
345 while (!$isComplete) {
346 $isComplete = CRM_Mailing_BAO_MailingJob
::runJobs($testParams);
349 if (!empty($testParams['sendtest'])) {
351 if (CRM_Mailing_Info
::workflowEnabled()) {
353 CRM_Core_Permission
::check('schedule mailings') &&
354 CRM_Core_Permission
::check('create mailings')
356 CRM_Core_Permission
::check('access CiviMail')
358 $status = ts("Click 'Next' when you are ready to Schedule or Send your live mailing (you will still have a chance to confirm or cancel sending this mailing on the next page).");
362 $status = ts("Click 'Next' when you are ready to Schedule or Send your live mailing (you will still have a chance to confirm or cancel sending this mailing on the next page).");
366 CRM_Core_Session
::setStatus($status, ts('Test message sent'), 'success');
368 $url = CRM_Utils_System
::url($urlString, $urlParams);
369 CRM_Utils_System
::redirect($url);
376 * Display Name of the form
382 public function getTitle() {
386 public function postProcess() {