/[drupal]/contributions/modules/mailhandler/mailhandler.module
ViewVC logotype

Diff of /contributions/modules/mailhandler/mailhandler.module

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.87, Thu Feb 1 05:34:50 2007 UTC revision 1.87.2.11, Mon Jul 7 01:03:16 2008 UTC
# Line 1  Line 1 
1  <?php  <?php
2  // $Id: mailhandler.module,v 1.86 2006/08/08 23:01:24 weitzman Exp $  // $Id: mailhandler.module,v 1.87.2.10 2008/07/06 20:07:09 weitzman Exp $
3    
4  /**  /**
5   * Retrieve all msgs from a given mailbox and process them.   * Retrieve all msgs from a given mailbox and process them.
# Line 33  function mailhandler_retrieve($mailbox) Line 33  function mailhandler_retrieve($mailbox)
33        }        }
34    
35        $mime = explode(',', variable_get('mime', 'TEXT/HTML,TEXT/PLAIN'));        $mime = explode(',', variable_get('mime', 'TEXT/HTML,TEXT/PLAIN'));
36    
37          // Get the first text part - this will be the node body
38        $origbody = mailhandler_get_part($result, $i, $mime[0]);        $origbody = mailhandler_get_part($result, $i, $mime[0]);
39    
40          // If we didn't get a body from our first attempt, try the alternate format (HTML or PLAIN)
41        if (!$origbody) {        if (!$origbody) {
42          $origbody = mailhandler_get_part($result, $i, $mime[1]);          $origbody = mailhandler_get_part($result, $i, $mime[1]);
43          if (!$origbody) {        }
44            // @TODO: Log that we got an empty email?  
45            continue;        // Parse MIME parts, so all mailhandler modules have access to
46          }        // the full array of mime parts without having to process the email.
47          $mimeparts = mailhandler_get_parts($result, $i);
48    
49          // Is this an empty message with no body and no mimeparts?
50          if (!$origbody && !$mimeparts) {
51            // @TODO: Log that we got an empty email?
52            continue;
53        }        }
54    
55        $num_processed++;        $num_processed++;
# Line 50  function mailhandler_retrieve($mailbox) Line 60  function mailhandler_retrieve($mailbox)
60        // check if mail originates from an authenticated user        // check if mail originates from an authenticated user
61        $node = mailhandler_authenticate($node, $header, $origbody, $mailbox);        $node = mailhandler_authenticate($node, $header, $origbody, $mailbox);
62    
63          // Put $mimeparts on the node
64          $node->mimeparts = $mimeparts;
65    
66        // we need to change the current user        // we need to change the current user
67        // this has to be done here to allow modules        // this has to be done here to allow modules
68        // to create users        // to create users
# Line 87  function mailhandler_retrieve($mailbox) Line 100  function mailhandler_retrieve($mailbox)
100    }    }
101    else {    else {
102      if ($err) {      if ($err) {
103        watchdog('error', t('Mailhandler %c connection failed: %m', array('%c' => ($mailbox['imap'] ? 'imap' : 'POP3'), '%m' => $mailbox['mail'])));        watchdog('mailhandler', t('Mailhandler %c connection failed: %m', array('%c' => ($mailbox['imap'] ? 'imap' : 'POP3'), '%m' => $mailbox['mail'])), WATCHDOG_ERROR);
104        return t('Mailhandler %c connection failed: %m', array('%c' => ($mailbox['imap'] ? 'imap' : 'POP3'), '%m' => $mailbox['mail']));        return t('Mailhandler %c connection failed: %m', array('%c' => ($mailbox['imap'] ? 'imap' : 'POP3'), '%m' => $mailbox['mail']));
105      }      }
106      else {      else {
107        watchdog('error', t('Mailhandler: Could not access local folder: %m', array('%m' => $mailbox['mail'])));        watchdog('mailhandler', t('Mailhandler: Could not access local folder: %m', array('%m' => $mailbox['mail'])), WATCHDOG_ERROR);
108        return t('Mailhandler could not access local folder: %m', array('%m' => $mailbox['mail']));        return t('Mailhandler could not access local folder: %m', array('%m' => $mailbox['mail']));
109      }      }
110    }    }
# Line 114  function mailhandler_comment_submit($nod Line 127  function mailhandler_comment_submit($nod
127      list($fromaddress, $fromname) = mailhandler_get_fromaddress($header, $mailbox);      list($fromaddress, $fromname) = mailhandler_get_fromaddress($header, $mailbox);
128      $error_txt = t("Sorry, your comment experienced an error and was not posted. Possible reasons are\n- you have insufficient permission to post comments\n- The node is no longer open for comments.\n\n");      $error_txt = t("Sorry, your comment experienced an error and was not posted. Possible reasons are\n- you have insufficient permission to post comments\n- The node is no longer open for comments.\n\n");
129      $error = $error_txt. t("\n\nYou sent:\n\nFrom: %f\nSubject: %t\nBody:\n%b", array('%f' => $fromaddress, '%t' => $header->subject, '%b' => $origbody));      $error = $error_txt. t("\n\nYou sent:\n\nFrom: %f\nSubject: %t\nBody:\n%b", array('%f' => $fromaddress, '%t' => $header->subject, '%b' => $origbody));
130      $sitemail = variable_get('site_mail', ini_get('sendmail_from'));      drupal_mail('mailhandler_error_comment', $fromaddress, t('Email submission to %sn failed - %subj', array('%sn' => variable_get('site_name', 'Drupal'), '%subj' => $header->subject)));
     $headers = "From: $sitemail\nReply-to: $sitemail\nX-Mailer: Drupal\nReturn-path: $sitemail\nErrors-to: $sitemail";  
     drupal_mail($fromaddress, t('Email submission to %sn failed - %subj', array('%sn' => variable_get('site_name', 'Drupal'), '%subj' => $header->subject)), $error, $headers);  
131      $watchdog = t('Mailhandler: comment submission failure: %subject.', array('%subject' => $edit['subject']));      $watchdog = t('Mailhandler: comment submission failure: %subject.', array('%subject' => $edit['subject']));
132      watchdog('error', $watchdog);      watchdog('mailhandler', $watchdog, WATCHDOG_ERROR);
133    }    }
134  }  }
135    
# Line 138  function mailhandler_node_submit($node, Line 149  function mailhandler_node_submit($node,
149    list($fromaddress, $fromname) = mailhandler_get_fromaddress($header, $mailbox);    list($fromaddress, $fromname) = mailhandler_get_fromaddress($header, $mailbox);
150    
151    //dprint_r($node); //DEBUG    //dprint_r($node); //DEBUG
152    
153      // Drupal 5.x & 6.x don't support multiple validations: each node_validate()
154      // call will ADD error messages to previous ones, so if some validation error
155      // occours in one message it will be reported in all messages after it.
156      // Since there is no way to reset form errors, the only method to avoid this
157      // problem is working with $_SESSION['messages'], used by form_set_error().
158      // See http://drupal.org/node/271975 for more info.
159      // Warning: with this method, if the same error message is reported for 2+ different
160      // fields it will be detected only for the last one.
161      if (!isset($_SESSION['messages'])) {
162        $_SESSION['messages'] = array();
163      }
164      $saved_errors = is_array($_SESSION['messages']['error']) ? $_SESSION['messages']['error'] : array();
165      $_SESSION['messages']['error'] = array();
166    node_validate($node);    node_validate($node);
167    $error = form_get_errors();    $error = array();
168      if (count($_SESSION['messages']['error'])) {
169        $allerrors = form_get_errors();
170        foreach ($_SESSION['messages']['error'] as $message) {
171          $keys = array_keys($allerrors, $message);
172          if (!$keys || !count($keys)) {
173            // Not a validation error (but an error, i'll print it)
174            $saved_errors[] = $message;
175          } else {
176            // This is a validation error, i take the last field with it (previous fields
177            // should be about previous validations)
178            $error[$keys[count($keys) - 1]] = $message;
179          }
180        }
181      }
182      $_SESSION['messages']['error'] = $saved_errors;
183    
184    if (!$error) {    if (!$error) {
185      // Prepare the node for save and allow modules make changes      // Prepare the node for save and allow modules make changes
186      $node = node_submit($node);      $node = node_submit($node);
# Line 148  function mailhandler_node_submit($node, Line 188  function mailhandler_node_submit($node,
188      if ($node->nid) {      if ($node->nid) {
189        if (node_access('update', $node)) {        if (node_access('update', $node)) {
190          node_save($node);          node_save($node);
191          watchdog('special', t("Mailhandler: Updated '%t' by %f", array('%t' => $node->title, '%f' => $fromaddress)));          watchdog('mailhandler', t("Mailhandler: Updated '%t' by %f", array('%t' => $node->title, '%f' => $fromaddress)), WATCHDOG_NOTICE);
192        }        }
193        else {        else {
194          $errortxt = t("The e-mail address '%f' may not update %t items.", array('%f' => $fromaddress, '%t' => $node->type));          $errortxt = t("The e-mail address '%f' may not update %t items.", array('%f' => $fromaddress, '%t' => $node->type));
# Line 157  function mailhandler_node_submit($node, Line 197  function mailhandler_node_submit($node,
197      else {      else {
198        if (node_access('create', $node)) {        if (node_access('create', $node)) {
199          node_save($node);          node_save($node);
200          watchdog('special', t("Mailhandler: Added '%t' by %f", array('%t' => $node->title, '%f' => $fromaddress)));          watchdog('mailhandler', t("Mailhandler: Added '%t' by %f", array('%t' => $node->title, '%f' => $fromaddress)), WATCHDOG_NOTICE);
201        }        }
202        else {        else {
203          $errortxt = t("The e-mail address '%f' may not create %t items.", array('%f' => $fromaddress, '%t' => $node->type));          $errortxt = t("The e-mail address '%f' may not create %t items.", array('%f' => $fromaddress, '%t' => $node->type));
# Line 172  function mailhandler_node_submit($node, Line 212  function mailhandler_node_submit($node,
212    }    }
213    
214    if ($errortxt) {    if ($errortxt) {
215      watchdog('error', "Mailhandler: $errortxt");      watchdog('mailhandler', "Mailhandler: $errortxt", WATCHDOG_ERROR);
216      if ($mailbox['replies']) {      if ($mailbox['replies']) {
217        $errortxt .= t("\n\nYou sent:\n\nFrom: %f\nSubject: %t\nBody:\n%b", array('%f' => $fromaddress, '%t' => $header->subject, '%b' => $origbody));        $errortxt .= t("\n\nYou sent:\n\nFrom: %f\nSubject: %t\nBody:\n%b", array('%f' => $fromaddress, '%t' => $header->subject, '%b' => $origbody));
218        $sitemail = variable_get('site_mail', ini_get('sendmail_from'));        drupal_mail('mailhandler_error_node', $fromaddress, t('Email submission to %sn failed - %subj', array('%sn' => variable_get('site_name', 'Drupal'), '%subj' => $node->title)), $errortxt);
       $headers = "From: $sitemail\nReply-to: $sitemail\nX-Mailer: Drupal\nReturn-path: $sitemail\nErrors-to: $sitemail";  
       drupal_mail($fromaddress, t('Email submission to %sn failed - %subj', array('%sn' => variable_get('site_name', 'Drupal'), '%subj' => $node->title)), $errortxt, $headers);  
219      }      }
220    }    }
221  }  }
# Line 237  function mailhandler_process_message($he Line 275  function mailhandler_process_message($he
275        if ($data[0] == 'taxonomy' && !is_numeric($data[1][0])) {        if ($data[0] == 'taxonomy' && !is_numeric($data[1][0])) {
276          array_walk($data[1], 'mailhandler_term_map');          array_walk($data[1], 'mailhandler_term_map');
277        }        }
278        $node->$data[0] = $data[1];        if (!empty($data[0])) {
279            $node->$data[0] = $data[1];
280          }
281      }      }
282      else {      else {
283        if (is_null($endcommands)) $endcommands = $i;        if (is_null($endcommands)) $endcommands = $i;
# Line 325  function mailhandler_switch_user($uid = Line 365  function mailhandler_switch_user($uid =
365    static $orig_user = array();    static $orig_user = array();
366    
367    if (isset($uid)) {    if (isset($uid)) {
368        session_save_session(FALSE);
369      $user = user_load(array('uid' => $uid));      $user = user_load(array('uid' => $uid));
370    }    }
371    // retrieve the initial user, can be called multiple times    // retrieve the initial user, can be called multiple times
372    else if (count($orig_user)) {    else if (count($orig_user)) {
373      $user = array_shift($orig_user);      $user = array_shift($orig_user);
374        session_save_session(TRUE);
375      array_unshift($orig_user, $user);      array_unshift($orig_user, $user);
376    }    }
377    // store the initial user    // store the initial user
# Line 387  function mailhandler_get_part($stream, $ Line 429  function mailhandler_get_part($stream, $
429          $part_number = '1';          $part_number = '1';
430        }        }
431        $text = imap_fetchbody($stream, $msg_number, $part_number);        $text = imap_fetchbody($stream, $msg_number, $part_number);
432        if ($structure->encoding == 3) {        if ($structure->encoding == ENCBASE64) {
433          return drupal_convert_to_utf8(imap_base64($text), $encoding);          return drupal_convert_to_utf8(imap_base64($text), $encoding);
434        }        }
435        else if ($structure->encoding == 4) {        else if ($structure->encoding == ENCQUOTEDPRINTABLE) {
436          return drupal_convert_to_utf8(quoted_printable_decode($text), $encoding);          return drupal_convert_to_utf8(quoted_printable_decode($text), $encoding);
437        }        }
438        else {        else {
439          return drupal_convert_to_utf8($text, $encoding);          return drupal_convert_to_utf8($text, $encoding);
440        }        }
441      }      }
442      if ($structure->type == 1) { /* multipart */      if ($structure->type == TYPEMULTIPART) { /* multipart */
443        while (list($index, $sub_structure) = each ($structure->parts)) {        while (list($index, $sub_structure) = each ($structure->parts)) {
444          if ($part_number) {          if ($part_number) {
445            $prefix = $part_number .'.';            $prefix = $part_number .'.';
# Line 413  function mailhandler_get_part($stream, $ Line 455  function mailhandler_get_part($stream, $
455    return false;    return false;
456  }  }
457    
458    
459    /**
460     * Returns an array of parts as file objects
461     *
462     * @param
463     * @param $structure
464     *   A message structure, usually used to recurse into specific parts
465     * @param $max_depth
466     *   Maximum Depth to recurse into parts.
467     * @param $depth
468     *   The current recursion depth.
469     * @param $part_number
470     *   A message part number to track position in a message during recursion.
471     * @return
472     *   An array of file objects.
473     */
474    function mailhandler_get_parts($stream, $msg_number, $max_depth = 10, $depth = 0, $structure = FALSE, $part_number = FALSE) {
475      $parts = array();
476    
477      // Load Structure.
478      if (!$structure && !$structure = imap_fetchstructure($stream, $msg_number)) {
479        watchdog('mailhandler', t('Could not fetch structure for message number %msg_number', array('%msg_number' => $msg_number)), WATCHDOG_NOTICE);
480        return $parts;
481      }
482    
483      // Recurse into multipart messages.
484      if ($structure->type == TYPEMULTIPART) {
485        // Restrict recursion depth.
486        if ($depth >= $max_depth) {
487          watchdog('mailhandler', t('Maximum recursion depths met in mailhander_get_structure_part for
488                      message number %msg_number.',  array('%msg_number' => $msg_number)), WATCHDOG_NOTICE);
489          return $parts;
490        }
491        foreach($structure->parts as $index => $sub_structure) {
492          // If a part number was passed in and we are a multitype message, prefix the
493          // the part number for the recursive call to match the imap4 dot seperated part indexing.
494          if ($part_number) {
495            $prefix = $part_number .'.';
496          }
497          $sub_parts =  mailhandler_get_parts($stream, $msg_number, $max_depth, $depth + 1,
498            $sub_structure, $prefix . ($index + 1));
499          $parts = array_merge($parts, $sub_parts);
500        }
501        return $parts;
502      }
503    
504      // Per Part Parsing.
505    
506      // Initalize file object like part structure.
507      $part = new StdClass();
508      $part->attributes = array();
509      $part->filename = 'unnamed_attachment';
510      if (!$part->filemime = mailhandler_get_mime_type($structure)) {
511        watchdog('mailhandler', t('Could not fetch mime type for message part. Defaulting to application/octet-stream.'),
512          WATCHDOG_NOTICE);
513        $part->filemime = 'application/octet-stream';
514      }
515    
516      if ($structure->ifparameters) {
517        foreach ($structure->parameters as $parameter) {
518          switch (strtoupper($parameter->attribute)) {
519            case 'NAME':
520            case 'FILENAME':
521              $part->filename = $parameter->value;
522              break;
523            default:
524              // put every thing else in the attributes array;
525              $part->attributes[$parameter->attribute] = $parameter->value;
526          }
527        }
528      }
529    
530      // Handle Content-Disposition parameters for non-text types.
531      if ($structure->type != TYPETEXT && $structure->ifdparameters) {
532        foreach ($structure->dparameters as $parameter) {
533          switch (strtoupper($parameter->attribute)) {
534            case 'NAME':
535            case 'FILENAME':
536              $part->filename = $parameter->value;
537              break;
538            // put every thing else in the attributes array;
539            default:
540              $part->attributes[$parameter->attribute] = $parameter->value;
541          }
542        }
543      }
544    
545      // Retrieve part  convert MIME encoding to UTF-8
546      if(!$part->data = imap_fetchbody($stream, $msg_number, $part_number)) {
547        drupal_set_message("imap_fetchbody($stream, $msg_number, $part_number)");
548        watchdog('mailhandler', 'No Data!!', WATCHDOG_ERROR);
549        return $parts;
550      }
551    
552      // convert text attachment to UTF-8.
553      if ($structure->type == TYPETEXT) {
554        $part->data = imap_utf8($part->data);
555      }
556      else {
557        // If not text then decode as necessary
558        if ($structure->encoding == ENCBASE64) {
559          $part->data = imap_base64($part->data);
560        }
561        else if ($structure->encoding == ENCQUOTEDPRINTABLE) {
562          $part->data = quoted_printable_decode($part->data);
563        }
564      }
565    
566      //always return an array to satisfy array_merge in recursion catch, and array return value.
567      $parts[] = $part;
568      return $parts;
569    }
570    
571  /**  /**
572   * Retrieve MIME type of the message structure.   * Retrieve MIME type of the message structure.
573   */   */
# Line 427  function mailhandler_get_mime_type(&$str Line 582  function mailhandler_get_mime_type(&$str
582    
583  /**  /**
584   * Implementation of hook_user().   * Implementation of hook_user().
585   */   *
586     * Commented out because mailhandler cannot assume that this mailbox will
587     * accept blog entries from users.
588    */
589    /*
590  function mailhandler_user($type, &$edit, &$account, $category = NULL) {  function mailhandler_user($type, &$edit, &$account, $category = NULL) {
591    if ($type == 'view') {    if ($type == 'view') {
592      // @TODO: We may add a new option in mailboxes to choose which roles can post.      // @TODO: We may add a new option in mailboxes to choose which roles can post.
# Line 452  function mailhandler_user($type, &$edit, Line 611  function mailhandler_user($type, &$edit,
611      }      }
612    }    }
613  }  }
614    */
615    
616  /**  /**
617   * Implementation of hook_cron(). Process msgs from all enabled mailboxes.   * Implementation of hook_cron(). Process msgs from all enabled mailboxes.
# Line 484  function mailhandler_menu($may_cache) { Line 644  function mailhandler_menu($may_cache) {
644    if ($may_cache) {    if ($may_cache) {
645      $items[] = array('path' => 'admin/content/mailhandler', 'title' => t('Mailhandler'),      $items[] = array('path' => 'admin/content/mailhandler', 'title' => t('Mailhandler'),
646        'callback' => 'mailhandler_admin',        'callback' => 'mailhandler_admin',
647          'description' => t('Manage mailboxes and retrieve messages.'),
648        'access' => $admin_access);        'access' => $admin_access);
649      $items[] = array('path' => 'admin/content/mailhandler/retrieve', 'title' => t('Retrieve'),      $items[] = array('path' => 'admin/content/mailhandler/retrieve', 'title' => t('Retrieve'),
650        'callback' => 'mailhandler_admin_retrieve',        'callback' => 'mailhandler_admin_retrieve',
# Line 590  function mailhandler_form($edit = array( Line 751  function mailhandler_form($edit = array(
751    $form['mailto'] = array('#type' => 'textfield', '#title' => t('Second E-mail address'), '#default_value' => $edit['mailto'], '#description' => t('Optional. The e-mail address to which modules should send generated content.'));    $form['mailto'] = array('#type' => 'textfield', '#title' => t('Second E-mail address'), '#default_value' => $edit['mailto'], '#description' => t('Optional. The e-mail address to which modules should send generated content.'));
752    $form['folder'] = array('#type' => 'textfield', '#title' => t('Folder'), '#default_value' => $edit['folder'], '#description' => t('Optional. The folder where the mail is stored. If you want this mailbox to read from a local folder, give the full path. Leave domain, port, name, and pass empty below. Remember to set the folder to readable and writable by the webserver.'));    $form['folder'] = array('#type' => 'textfield', '#title' => t('Folder'), '#default_value' => $edit['folder'], '#description' => t('Optional. The folder where the mail is stored. If you want this mailbox to read from a local folder, give the full path. Leave domain, port, name, and pass empty below. Remember to set the folder to readable and writable by the webserver.'));
753    $form['imap'] = array('#type' => 'select', '#title' => t('POP3 or IMAP Mailbox'), '#options' => array('POP3', 'IMAP'), '#default_value' => $edit['imap'], '#description' => t('If you wish to retrieve mail from a POP3 or IMAP mailbox instead of a Folder, select POP3 or IMAP. Also, complete the Mailbox items below.'));    $form['imap'] = array('#type' => 'select', '#title' => t('POP3 or IMAP Mailbox'), '#options' => array('POP3', 'IMAP'), '#default_value' => $edit['imap'], '#description' => t('If you wish to retrieve mail from a POP3 or IMAP mailbox instead of a Folder, select POP3 or IMAP. Also, complete the Mailbox items below.'));
754    $form['domain'] = array('#type' => 'textfield', '#title' => t('Mailbox domain'), '#default_value' => $edit['domain'], '#description' => t('The domain of the server used to collect mail.'), '#required' => TRUE);    $form['domain'] = array('#type' => 'textfield', '#title' => t('Mailbox domain'), '#default_value' => $edit['domain'], '#description' => t('The domain of the server used to collect mail.'));
755    $form['port'] = array('#type' => 'textfield', '#title' => t('Mailbox port'), '#size' => 5, '#maxlength' => 5, '#default_value' => $edit['port'], '#description' => t('The port of the mailbox used to collect mail (usually 110 for POP3, 143 for IMAP).'));    $form['port'] = array('#type' => 'textfield', '#title' => t('Mailbox port'), '#size' => 5, '#maxlength' => 5, '#default_value' => $edit['port'], '#description' => t('The port of the mailbox used to collect mail (usually 110 for POP3, 143 for IMAP).'));
756    $form['name'] = array('#type' => 'textfield', '#title' => t('Mailbox username'), '#default_value' => $edit['name'], '#description' => t('This username is used while logging into this mailbox during mail retrieval.'));    $form['name'] = array('#type' => 'textfield', '#title' => t('Mailbox username'), '#default_value' => $edit['name'], '#description' => t('This username is used while logging into this mailbox during mail retrieval.'));
757    $form['pass'] = array('#type' => 'textfield', '#title' => t('Mailbox password'), '#default_value' => $edit['pass'], '#description' => t('The password corresponding to the username above. Consider using a non-vital password, since this field is stored without encryption in the database.'));    $form['pass'] = array('#type' => 'textfield', '#title' => t('Mailbox password'), '#default_value' => $edit['pass'], '#description' => t('The password corresponding to the username above. Consider using a non-vital password, since this field is stored without encryption in the database.'));
# Line 681  function mailhandler_admin_delete_confir Line 842  function mailhandler_admin_delete_confir
842  function mailhandler_admin_delete_confirm_submit($form_id, $form_values) {  function mailhandler_admin_delete_confirm_submit($form_id, $form_values) {
843    $info = db_fetch_object(db_query("SELECT mid, mail FROM {mailhandler} WHERE mid = %d", $form_values['mid']));    $info = db_fetch_object(db_query("SELECT mid, mail FROM {mailhandler} WHERE mid = %d", $form_values['mid']));
844    db_query("DELETE FROM {mailhandler} WHERE mid = %d", $form_values['mid']);    db_query("DELETE FROM {mailhandler} WHERE mid = %d", $form_values['mid']);
845    watchdog('special', t('Mailhandler: Mailbox %mailbox deleted', array('%mailbox' => $info->mail)));    watchdog('mailhandler', t('Mailhandler: Mailbox %mailbox deleted', array('%mailbox' => $info->mail)), WATCHDOG_NOTICE);
846    drupal_set_message(t('Mailbox %mailbox deleted', array('%mailbox' => $info->mail)));    drupal_set_message(t('Mailbox %mailbox deleted', array('%mailbox' => $info->mail)));
847    drupal_goto('admin/content/mailhandler');    drupal_goto('admin/content/mailhandler');
848  }  }

Legend:
Removed from v.1.87  
changed lines
  Added in v.1.87.2.11

  ViewVC Help
Powered by ViewVC 1.1.2