DMail Milestone 1.0
Drupal Mail Client
dmail.user.inc
Go to the documentation of this file.
00001 <?php
00002 // $Id: b059163311fc6c22d43d0ad912c36a0a1b127e29 $
00017 /******************************************************************************
00018  * Module menu callbacks
00019  */
00020 
00024 function dmail_user_identities() {
00025   return drupal_get_form('mfm_dmail_identities');
00026 }
00027 
00031 function dmail_user_identities_add() {
00032   return drupal_get_form('mfm_dmail_identities_add');
00033 }
00034 
00035 
00036 /******************************************************************************
00037  * Module forms
00038  */
00039 
00043 function mfm_dmail_identities() {
00044   global $user;
00045   mfn_dmail_security_check();
00046   $identity->id = 0;
00047   mfn_dmail_set_active_identity($identity);
00048   $form['dmail']['identity']['list']['header']['#dmail_data'] = array(
00049     array('data' => t('##'), 'field' => 'id'),
00050     array('data' => t('Identity'), 'field' => 'name'),
00051     array('data' => t('Last Checked'), 'field' => 'lastchkd'),
00052     array('data' => t('Messages'), 'field' => 'messages'),
00053     array('data' => t('Recent'), 'field' => 'recent'),
00054   );
00055   $identities = mfn_dmail_db_identities_with_counts();
00056   foreach ($identities as $identity) {
00057     $urlf = 'user/' . $user->uid . '/email/' . $identity->id;
00058     if (!$identity->messages) {
00059       $identity->messages = 0;
00060       $identity->recent = 0;
00061     }
00062     $form['dmail']['identity']['list']['id'][$identity->id] = array(
00063       '#value' => l($identity->id, $urlf . '/edit'),
00064     );
00065     $form['dmail']['identity']['list']['name'][$identity->id] = array(
00066       '#value' => l($identity->name, $urlf . '/folders'),
00067     );
00068     $form['dmail']['identity']['list']['lastchkd'][$identity->id] = array(
00069       '#value' => mfn_dmail_l($urlf . '/get', $identity->lastchkd, 'Retrieve the mail headers from the server.'),
00070     );
00071     $form['dmail']['identity']['list']['messages'][$identity->id] = array(
00072       '#value' => mfn_dmail_l($urlf . '/messages', $identity->messages, 'View all messages for this identity.'),
00073     );
00074     $form['dmail']['identity']['list']['recent'][$identity->id] = array(
00075       '#value' => mfn_dmail_l($urlf . '/recent', $identity->recent, 'View all recent messages for this identity.'),
00076     );
00077     $v  = mfn_dmail_l(array(
00078       'url' => $urlf . '/expunge',
00079       'title' => 'Expunge',
00080       'description' => 'Purge the mail marked as deleted in all folders.',
00081       'image' => array(
00082         'type' => 'action',
00083         'file' => 'expunge_all.png',
00084       ),
00085     )) . ' | ';
00086     $v .= mfn_dmail_l(array(
00087       'url' => $urlf . '/mailboxes',
00088       'title' => 'Get Folders',
00089       'description' => 'Get the mailbox folders from the server.  Use when you have added or modified folders using another email client.',
00090       'image' => array('type' => 'action', 'file' => 'get_folders.png'),
00091     )) . ' | ';
00092     $v .= mfn_dmail_l(array(
00093       'url' => $urlf . '/sanitize',
00094       'title' => 'Sanitize',
00095       'description' => 'Sanitize the mailbox folders.  Use when you have used another email client to process mail; some clients do not do the right thing with the imap data.',
00096       'image' => array(
00097         'type' => 'action',
00098         'file' => 'sanitize.png',
00099       ),
00100     )) . ' | ';
00101     $v .= mfn_dmail_l(array(
00102       'url' => $urlf . '/remove',
00103       'title' => 'Remove',
00104       'description' => 'Remove this identity.  This action cannot be undone and all related data will be removed.',
00105       'image' => array(
00106         'type' => 'action',
00107         'file' => 'remove_identity.png',
00108       ),
00109     )) . ' | ';
00110     $form['dmail']['identity']['list']['operations'][$identity->id] = array(
00111       '#value' => $v,
00112     );
00113     $identities_on_page[$identity->id] = '';
00114   }
00115   $form['dmail']['identity']['list']['identities'] = array(
00116     '#type' => 'checkboxes',
00117     '#options' => $identities_on_page,
00118   );
00119   return $form;
00120 }
00121 
00125 function mfm_dmail_identities_add() {
00126   global $user;
00127   mfn_dmail_security_check();
00128   $form['dmail']['identities']['add']['name'] = array(
00129     '#type' => 'textfield',
00130     '#title' => t('Name'),
00131     '#description' => t('The visual representation of the identity'),
00132     '#required' => TRUE,
00133   );
00134   $form['dmail']['identities']['add']['user'] = array(
00135     '#type' => 'textfield',
00136     '#title' => t('User'),
00137     '#description' => t('The account identifier you use for the service login.'),
00138     '#required' => TRUE,
00139   );
00140   $form['dmail']['identities']['add']['pass'] = array(
00141     '#type' => 'password',
00142     '#title' => t('Password'),
00143     '#description' => t('The account password you use for the service login.'),
00144     '#required' => TRUE,
00145   );
00146   $default = variable_get('dmail_default_host', DMAIL_DEFAULT_HOST);
00147   $form['dmail']['identities']['add']['host'] = array(
00148     '#type' => 'textfield',
00149     '#title' => t('Host'),
00150     '#description' => t('The server name for the email account.'),
00151     '#required' => TRUE,
00152     '#default_value' => $default,
00153   );
00154   $default = variable_get('dmail_default_service', DMAIL_DEFAULT_SERVICE);
00155   $form['dmail']['identities']['add']['service'] = array(
00156     '#type' => 'select',
00157     '#title' => t('Service'),
00158     '#description' => t('The type of service provided by the server (imap, pop3, nntp).'),
00159     '#required' => TRUE,
00160     '#options' => array('imap' => 'imap', 'pop3' => 'pop3', 'nntp' => 'nntp'),
00161     '#default_value' => $default,
00162   );
00163   $default = variable_get('dmail_default_port', DMAIL_DEFAULT_PORT);
00164   $form['dmail']['identities']['add']['port'] = array(
00165     '#type' => 'textfield',
00166     '#title' => t('Port'),
00167     '#description' => t('The port number for the service chosen.'),
00168     '#required' => TRUE,
00169     '#default_value' => $default,
00170   );
00171   $default = variable_get('dmail_default_encrypt', DMAIL_DEFAULT_ENCRYPT);
00172   $form['dmail']['identities']['add']['encrypt'] = array(
00173     '#type' => 'select',
00174     '#title' => t('Encryption type'),
00175     '#description' => t('The type of encryption required by the server (plain, tls, ssl).'),
00176     '#required' => TRUE,
00177     '#options' => array('none' => 'none', 'tls' => 'tls', 'ssl' => 'ssl'),
00178     '#default_value' => $default,
00179   );
00180   $default = variable_get('dmail_default_validate_cert', DMAIL_DEFAULT_VALIDATE_CERT);
00181   $form['dmail']['identities']['add']['validate_cert'] = array(
00182     '#type' => 'select',
00183     '#title' => t('Validate Certificate'),
00184     '#description' => t('Should the server certificate be validated?'),
00185     '#required' => TRUE,
00186     '#options' => array('yes' => t('Yes'), 'no' => t('No')),
00187     '#default_value' => $default,
00188   );
00189   $default = variable_get('dmail_default_expunge', DMAIL_DEFAULT_EXPUNGE);
00190   $form['dmail']['identities']['add']['expunge'] = array(
00191     '#type' => 'select',
00192     '#title' => t('Expunge On Close'),
00193     '#description' => t('Should the service expunge deleted items on close of the service connection?  NOTE: The connection may close for reasons other than exiting or logging off.'),
00194     '#required' => TRUE,
00195     '#options' => array('yes' => t('Yes'), 'no' => t('No')),
00196     '#default_value' => $default,
00197   );
00198   $default = variable_get('dmail_default_readonly', DMAIL_DEFAULT_READONLY);
00199   $form['dmail']['identities']['add']['readonly'] = array(
00200     '#type' => 'select',
00201     '#title' => t('Read Only Access'),
00202     '#description' => t('Should the service be accessed in read only mode?'),
00203     '#required' => TRUE,
00204     '#options' => array('yes' => t('Yes'), 'no' => t('No')),
00205     '#default_value' => $default,
00206   );
00207 
00208   $field = 'inbox';
00209   $form['dmail']['identities']['add'][$field] = array(
00210     '#type' => 'textfield',
00211     '#title' => mfn_dmail_form_text('title', $field),
00212     '#description' => mfn_dmail_form_text('desc', $field),
00213     '#required' => TRUE,
00214     '#default_value' => mfn_dmail_form_default($field),
00215   );
00216 
00217   $field = 'check_mail_freq';
00218   $form['dmail']['identities']['add'][$field] = array(
00219     '#type' => 'select',
00220     '#title' => mfn_dmail_form_text('title', $field),
00221     '#description' => mfn_dmail_form_text('desc', $field),
00222     '#options' => mfn_dmail_form_options($field),
00223     '#default_value' => mfn_dmail_form_default($field),
00224   );
00225 
00226   $field = 'delimiter';
00227   $form['dmail']['identities']['add'][$field] = array(
00228     '#type' => 'textfield',
00229     '#title' => mfn_dmail_form_text('title', $field),
00230     '#description' => mfn_dmail_form_text('desc', $field),
00231     '#default_value' => mfn_dmail_form_default($field),
00232     '#size' => 1,
00233     '#maxlength' => 1,
00234   );
00235 
00236   $field = 'toplevel';
00237   $form['dmail']['identities']['add'][$field] = array(
00238     '#type' => 'checkbox',
00239     '#title' => mfn_dmail_form_text('title', $field),
00240     '#description' => mfn_dmail_form_text('desc', $field),
00241     '#default_value' => mfn_dmail_form_default($field),
00242   );
00243 
00244   $field = 'orderby';
00245   $form['dmail']['identities']['add'][$orderby] = array(
00246     '#type' => 'select',
00247     '#title' => mfn_dmail_form_text('title', $field),
00248     '#description' => mfn_dmail_form_text('desc', $field),
00249     '#options' => mfn_dmail_form_options($field),
00250     '#default_value' => mfn_dmail_form_default($field),
00251   );
00252 
00253   $field = 'sortdir';
00254   $form['dmail']['identities']['add'][$field] = array(
00255     '#type' => 'select',
00256     '#title' => mfn_dmail_form_text('title', $field),
00257     '#description' => mfn_dmail_form_text('desc', $field),
00258     '#options' => mfn_dmail_form_options($field),
00259     '#default_value' => mfn_dmail_form_default($field),
00260   );
00261 
00262   $field = 'signature';
00263   $form['dmail']['identities']['add'][$field] = array(
00264     '#type' => 'select',
00265     '#title' => mfn_dmail_form_text('title', $field),
00266     '#description' => mfn_dmail_form_text('desc', $field),
00267     '#options' => mfn_dmail_form_options($field),
00268     '#default_value' => mfn_dmail_form_default($field),
00269   );
00270 
00271   $field = 'delete_folder';
00272   $form['dmail']['identities']['add'][$field] = array(
00273     '#type' => 'textfield',
00274     '#title' => mfn_dmail_form_text('title', $field),
00275     '#description' => mfn_dmail_form_text('description', $field),
00276     '#default_value' => mfn_dmail_form_default($field),
00277   );
00278 
00279   $field = 'move_deleted';
00280   $form['dmail']['identities']['add'][$field] = array(
00281     '#type' => 'select',
00282     '#title' => mfn_dmail_form_text('title', $field),
00283     '#description' => mfn_dmail_form_text('description', $field),
00284     '#options' => mfn_dmail_form_options($field),
00285     '#default_value' => mfn_dmail_form_default($field),
00286   );
00287 
00288   $field = 'draft_folder';
00289   $form['dmail']['identities']['add'][$field] = array(
00290     '#type' => 'textfield',
00291     '#title' => mfn_dmail_form_text('title', $field),
00292     '#description' => mfn_dmail_form_text('description', $field),
00293     '#default_value' => mfn_dmail_form_default($field),
00294   );
00295 
00296   $field = 'sent_folder';
00297   $form['dmail']['identities']['add'][$field] = array(
00298     '#type' => 'textfield',
00299     '#title' => mfn_dmail_form_text('title', $field),
00300     '#description' => mfn_dmail_form_text('desc', $field),
00301     '#default_value' => mfn_dmail_form_default($field),
00302   );
00303 
00304   $field = 'junk_folder';
00305   $form['dmail']['identities']['add'][$field] = array(
00306     '#type' => 'textfield',
00307     '#title' => mfn_dmail_form_text('title', $field),
00308     '#description' => mfn_dmail_form_text('desc', $field),
00309     '#default_value' => mfn_dmail_form_default($field),
00310   );
00311 
00312   $form['dmail']['identities']['add']['submit'] = array(
00313     '#type' => 'submit',
00314     '#value' => t('Add Identity'),
00315   );
00316   $form['#redirect'] = 'user/' . $user->uid . '/email/identities';
00317   return $form;
00318 }
00319 
00323 function mfm_dmail_identities_add_validate(&$form, &$form_state) {
00324   $values =& $form_state['values'];
00325   if (isset($values['id'])) {
00326     $identity = mfn_dmail_db_identity_select($values['id']);
00327     if (empty($values['pass'])) {
00328       $values['pass'] = mfn_dmail_decrypt($identity->pass);
00329     }
00330   }
00331   if (!is_numeric($values['port'])) {
00332     form_set_error('port', t('A port must contain a numeric value.'));
00333   }
00334   if (!mfn_dmail_is_valid_service($values)) {
00335     form_set_error('dmail][identities][add]', t('The entered service parameters did not validate.'));
00336   }
00337   if ($values['readonly'] === 'yes' && $values['expunge'] === 'yes') {
00338     form_set_error('dmail][identities][add]', t('Expunge On Close and Read Only Access are mutally exclusive and cannot be both set to Yes'));
00339   }
00340 }
00341 
00345 function mfm_dmail_identities_add_submit(&$form, &$form_state) {
00346   $values =& $form_state['values'];
00347   $ret = mfn_dmail_db_identity_add($values);
00348   $id =& $ret[1];
00349   mfn_dmail_get_mailboxes($id);
00350 }
00351 
00355 function mfm_dmail_identities_edit(&$form_state, $id) {
00356   global $user;
00357   mfn_dmail_security_check();
00358   $identity = mfn_dmail_db_identity_select($id);
00359   if ($identity === FALSE) {
00360     throw new Exception('Given identity id (' . $id . ') was not retrieved.');
00361   }
00362   $form = mfm_dmail_identities_add();
00363   $form['dmail']['identities']['edit'] = $form['dmail']['identities']['add'];
00364   unset($form['dmail']['identities']['add']);
00365   $form['dmail']['identities']['edit']['id'] = array(
00366     '#type' => 'value',
00367     '#value' => $id,
00368   );
00369   $form['dmail']['identities']['edit']['name']['#default_value'] = $identity->name;
00370   $form['dmail']['identities']['edit']['user']['#default_value'] = $identity->user;
00371   unset($form['dmail']['identities']['edit']['pass']['#required']);
00372   $form['dmail']['identities']['edit']['pass']['#description'] .= t('  Leave empty if you are not changing your password.');
00373   $form['dmail']['identities']['edit']['host']['#default_value'] = $identity->host;
00374   $form['dmail']['identities']['edit']['service']['#default_value'] = $identity->service;
00375   $form['dmail']['identities']['edit']['port']['#default_value'] = $identity->port;
00376   $form['dmail']['identities']['edit']['encrypt']['#default_value'] = $identity->encryption;
00377   $form['dmail']['identities']['edit']['validate_cert']['#default_value'] = $identity->vld8cert ? 'yes' : 'no';
00378   $form['dmail']['identities']['edit']['expunge']['#default_value'] = $identity->expunge ? 'yes' : 'no';
00379   $form['dmail']['identities']['edit']['readonly']['#default_value'] = $identity->readonly ? 'yes' : 'no';
00380   $form['dmail']['identities']['edit']['move_deleted']['#default_value'] = $identity->movedel ? 'yes' : 'no';
00381   $form['dmail']['identities']['edit']['check_mail_freq']['#default_value'] = $identity->checkevery;
00382   $form['dmail']['identities']['edit']['signature']['#default_value'] = $identity->signature_id;
00383   $form['dmail']['identities']['edit']['inbox']['#default_value'] = $identity->inbox;
00384   $form['dmail']['identities']['edit']['delimiter']['#default_value'] = $identity->delimiter;
00385   $form['dmail']['identities']['edit']['toplevel']['#default_value'] = $identity->toplevel;
00386   $form['dmail']['identities']['edit']['delete_folder']['#default_value'] = $identity->deletefolder;
00387   $form['dmail']['identities']['edit']['draft_folder']['#default_value'] = $identity->draftfolder;
00388   $form['dmail']['identities']['edit']['sent_folder']['#default_value'] = $identity->sentfolder;
00389   $form['dmail']['identities']['edit']['junk_folder']['#default_value'] = $identity->junkfolder;
00390   $form['dmail']['identities']['edit']['submit']['#value'] = t('Change Identity');
00391   return $form;
00392 }
00393 
00397 function mfm_dmail_identities_edit_validate(&$form, &$form_state) {
00398   mfm_dmail_identities_add_validate($form, $form_state);
00399 }
00400 
00404 function mfm_dmail_identities_edit_submit(&$form, &$form_state) {
00405   $values =& $form_state['values'];
00406   $identity = mfn_dmail_db_identity_select($values['id']);
00407   if (empty($values['pass'])) {
00408     $values['pass'] = mfn_dmail_decrypt($identity->pass);
00409   }
00410   mfn_dmail_db_identity_update($values['id'], $values);
00411 }
00412 
00416 function mfm_dmail_display_folders(&$form_state, $identity_id) {
00417   global $user;
00418   mfn_dmail_security_check();
00419   mfn_dmail_readonly_check();
00420   $mboxes = mfn_dmail_db_mboxes_select($identity_id);
00421   $identity = mfn_dmail_db_identity_select($identity_id);
00422   mfn_dmail_set_active_identity($identity);
00423   drupal_set_title(t('Folders for %identity', array('%identity' => $identity->name)));
00424   foreach ($mboxes as $mbox) {
00425     $_mboxes[$mbox->id] = $mbox;
00426   }
00427   $form = array();
00428   foreach ($mboxes as $weight => $mbox) {
00429     $folders = explode($identity->delimiter, $mbox->name);
00430     $collapsed = TRUE;
00431     for ($i = 0; $i < count($folders)-1; $i++) {
00432       switch ($i) {
00433         case 0: {
00434           if (empty($f[$folders[0]])) {
00435             $f[$folders[0]] = array(
00436               '#type' => 'fieldset',
00437               '#title' => $folders[$i],
00438               '#collapsible' => TRUE,
00439               '#collapsed' => FALSE,
00440               '#weight' => $weight * $i,
00441             );
00442           }
00443           break;
00444         }
00445         case 1: {
00446           if (empty($f[$folders[0]][$folders[1]])) {
00447             $f[$folders[0]][$folders[1]] = array(
00448               '#type' => 'fieldset',
00449               '#title' => $folders[$i],
00450               '#collapsible' => TRUE,
00451               '#collapsed' => $collapsed,
00452               '#weight' => $weight * $i,
00453             );
00454           }
00455           break;
00456         }
00457         case 2: {
00458           if (empty($f[$folders[0]][$folders[1]][$folders[2]])) {
00459             $f[$folders[0]][$folders[1]][$folders[2]] = array(
00460               '#type' => 'fieldset',
00461               '#title' => $folders[$i],
00462               '#collapsible' => TRUE,
00463               '#collapsed' => $collapsed,
00464               '#weight' => $weight * $i,
00465             );
00466           }
00467           break;
00468         }
00469         case 3: {
00470           if (empty($f[$folders[0]][$folders[1]][$folders[2]][$folders[3]])) {
00471             $f[$folders[0]][$folders[1]][$folders[2]][$folders[3]] = array(
00472               '#type' => 'fieldset',
00473               '#title' => $folders[$i],
00474               '#collapsible' => TRUE,
00475               '#collapsed' => $collapsed,
00476               '#weight' => $weight * $i,
00477             );
00478           }
00479           break;
00480         }
00481         case 4: {
00482           if (empty($f[$folders[0]][$folders[1]][$folders[2]][$folders[3]][$folders[4]])) {
00483             $f[$folders[0]][$folders[1]][$folders[2]][$folders[3]][$folders[4]] = array(
00484               '#type' => 'fieldset',
00485               '#title' => $folders[$i],
00486               '#collapsible' => TRUE,
00487               '#collapsed' => $collapsed,
00488               '#weight' => $weight * $i,
00489             );
00490           }
00491           break;
00492         }
00493         case 5: {
00494           if (empty($f[$folders[0]][$folders[1]][$folders[2]][$folders[3]][$folders[4]][$folders[5]])) {
00495             $f[$folders[0]][$folders[1]][$folders[2]][$folders[3]][$folders[4]][$folders[5]] = array(
00496               '#type' => 'fieldset',
00497               '#title' => $folders[$i],
00498               '#collapsible' => TRUE,
00499               '#collapsed' => $collapsed,
00500               '#weight' => $weight * $i,
00501             );
00502           }
00503           break;
00504         }
00505         default: {
00506           //throw new Exception(t('Unmanagable folder depth (' . count($folders) . ')!'));
00507           break;
00508         }
00509       }
00510     }
00511   }
00512   $sep = ' | ';
00513   foreach ($mboxes as $weight => $mbox) {
00514     $folders = explode($identity->delimiter, $mbox->name);
00515     $value = l($folders[count($folders) - 1], 'user/' . $user->uid . '/email/' . $identity_id . '/mbox/' . $mbox->id) . '&nbsp; &nbsp;' . $mbox->messages . t(' messages.');
00516     $add_folder = mfn_dmail_l(array(
00517       'url' => 'user/' . $user->uid . '/email/' . $mbox->identity_id . '/mbox/' . $mbox->id . '/add',
00518       'title' => 'Add folder',
00519       'description' => 'Add a new folder to filter mail to.',
00520       'image' => array(
00521         'type' => 'action',
00522         'file' => 'add_folder.png',
00523       ),
00524     ));
00525     $del_folder = mfn_dmail_l(array(
00526       'href' => 'user/' . $user->uid . '/email/' . $mbox->identity_id . '/mbox/' . $mbox->id . '/delete',
00527       'title' => 'Delete folder',
00528       'description' => 'Remove all messages in folder and then remove the folder.',
00529       'image' => array('type' => 'action', 'file' => 'delete_folder.png'),
00530     ));
00531     if ($mbox->name == $identity->inbox) {
00532       $f[$mbox->name][$identity->inbox . $identity->delimiter . $mbox->name] = array(
00533         '#type' => 'markup',
00534         '#value' => "$value$sep$add_folder",
00535         '#prefix' => '<p>',
00536         '#suffix' => '</p>',
00537         '#weight' => 100,
00538       );
00539     }
00540     else {
00541       $top = $identity->toplevel ? NULL : $identity->inbox . $identity->delimiter;
00542       $trash = $top . $identity->deletefolder;
00543       $junk = $top . $identity->junkfolder;
00544       $draft = $top . $identity->draftfolder;
00545       $sent = $top . $identity->sentfolder;
00546       if (!in_array($mbox->name, array($trash, $junk, $draft, $sent))) {
00547         $value .= $sep . $add_folder . $sep . $del_folder;
00548         $weight_m = 1;
00549       }
00550       else {
00551         $weight_m = 10;
00552       }
00553       switch (count($folders)) {
00554         case 1: {
00555           if (empty($f[$folders[0]])) {
00556             $f[$folders[0]] = array(
00557               '#type' => 'markup',
00558               '#value' => $value,
00559               '#prefix' => '<p>',
00560               '#suffix' => '</p>',
00561               '#weight' => $weight * 100 * $weight_m,
00562             );
00563           }
00564         } break;
00565         case 2: {
00566           if (empty($f[$folders[0]][$folders[1]])) {
00567             $f[$folders[0]][$folders[1]] = array(
00568               '#type' => 'markup',
00569               '#value' => $value,
00570               '#prefix' => '<p>',
00571               '#suffix' => '</p>',
00572               '#weight' => $weight * 200 * $weight_m,
00573             );
00574           }
00575         } break;
00576         case 3: {
00577           if (empty($f[$folders[0]][$folders[1]][$folders[2]])) {
00578             $f[$folders[0]][$folders[1]][$folders[2]] = array(
00579               '#type' => 'markup',
00580               '#value' => $value,
00581               '#prefix' => '<p>',
00582               '#suffix' => '</p>',
00583               '#weight' => $weight * 300 * $weight_m,
00584             );
00585           }
00586         } break;
00587         case 4: {
00588           if (empty($f[$folders[0]][$folders[1]][$folders[2]][$folders[3]])) {
00589             $f[$folders[0]][$folders[1]][$folders[2]][$folders[3]] = array(
00590               '#type' => 'markup',
00591               '#value' => $value,
00592               '#prefix' => '<p>',
00593               '#suffix' => '</p>',
00594               '#weight' => $weight * 400 * $weight_m,
00595             );
00596           }
00597         } break;
00598         case 5: {
00599           if (empty($f[$folders[0]][$folders[1]][$folders[2]][$folders[3]][$folders[4]])) {
00600             $f[$folders[0]][$folders[1]][$folders[2]][$folders[3]][$folders[4]] = array(
00601               '#type' => 'markup',
00602               '#value' => $value,
00603               '#prefix' => '<p>',
00604               '#suffix' => '</p>',
00605               '#weight' => $weight * 500 * $weight_m,
00606             );
00607           }
00608         } break;
00609         case 6: {
00610           if (empty($f[$folders[0]][$folders[1]][$folders[2]][$folders[3]][$folders[4]][$folders[5]])) {
00611             $f[$folders[0]][$folders[1]][$folders[2]][$folders[3]][$folders[4]][$folders[5]] = array(
00612               '#type' => 'markup',
00613               '#value' => $value,
00614               '#prefix' => '<p>',
00615               '#weight' => $weight * 600 * $weight_m,
00616             );
00617           }
00618         } break;
00619         default: {
00620         } break;
00621       }
00622     }
00623   }
00624   $form['dmail']['folders'] = $f;
00625   return $form;
00626 }
00627 
00631 function mfm_dmail_display_headers(&$form_state, $mbox_id) {
00632   global $user;
00633   dcache_del(array('form', 'reply'), DCACHE_SESSION);
00634   dcache_del(array('form', 'item'), DCACHE_SESSION);
00635   mfn_dmail_security_check();
00636   mfn_dmail_readonly_check();
00637   $form = array();
00638   $mbox = mfn_dmail_db_mbox_select($mbox_id);
00639   $identity = mfn_dmail_db_identity_select($mbox->identity_id);
00640   mfn_dmail_set_active_identity($identity);
00641   mfn_dmail_active_mbox($mbox);
00642   drupal_set_title(t('@identity %mbox Items', array('%mbox' => $mbox->name, '@identity' => $identity->name)));
00643   $urlf = 'user/' . $user->uid . '/email/' . $mbox->identity_id . '/mbox/' . $mbox_id;
00644   $orderby = mfn_dmail_orderby();
00645   $list_header = mfn_dmail_items_list_header();
00646   $headers_count = mfn_dmail_db_mbox_message_headers_count($mbox_id);
00647   if ($headers_count != $mbox->messages) {
00648     mfn_dmail_get_headers($mbox, $identity);
00649   }
00650   $headers = mfn_dmail_db_mbox_message_headers_select_ordered($mbox_id);
00651   foreach ($headers as $header) {
00652     $bspan = '<span class="dmail.normal">';
00653     $espan = '</span>';
00654     if (!$header->seen) {
00655       $bspan = '<span class="dmail.unseen">';
00656     }
00657     if ($header->deleted) {
00658       $bspan = '<span class="dmail.deleted">';
00659     }
00660     if ($header->flagged) {
00661       $bspan = '<span class="dmail.flagged">';
00662     }
00663     $form['dmail']['headers']['msgno'][$header->id] = array(
00664       '#value' => $header->msgno,
00665       '#suffix' => '&nbsp;',
00666     );
00667     $form['dmail']['headers']['received'][$header->id] = array(
00668       '#value' => $header->date,
00669       '#prefix' => '&nbsp;' . $bspan,
00670       '#suffix' => '&nbsp;' . $espan,
00671     );
00672     $form['dmail']['headers']['from'][$header->id] = array(
00673       '#value' => mfn_dmail_decode_str($header->from),
00674       '#prefix' => '&nbsp;' . $bspan,
00675       '#suffix' => '&nbsp;' . $espan,
00676     );
00677     $form['dmail']['headers']['subject'][$header->id] = array(
00678       '#value' => mfn_dmail_decode_str($header->subject),
00679       '#prefix' => '&nbsp;' . $bspan,
00680       '#suffix' => '&nbsp;' . $espan,
00681     );
00682     $attributes = array();
00683     $v = mfn_dmail_l($urlf . '/view/' . $header->id, 'View', 'View the mail item.', $attributes, $orderby, array('type' => 'action', 'file' => 'view.png')) . ' | ';
00684     $v .= mfn_dmail_l($urlf . '/reply/' . $header->id, 'Reply', 'Reply about this item.', $attributes, $orderby, array('type' => 'action', 'file' => 'reply.png')) . ' | ';
00685     $v .= mfn_dmail_l($urlf . '/replyall/' . $header->id, 'Reply All', 'Reply to every address about this item.', $attributes, $orderby, array('type' => 'action', 'file' => 'replyall.png')) . ' | ';
00686     $v .= mfn_dmail_l($urlf . '/forward/' . $header->id, 'Forward', 'Forward this item to another mailbox.', $attributes, $orderby, array('type' => 'action', 'file' => 'forward.png')) . ' | ';
00687     if (mfn_dmail_is_junk($header->message_id)) {
00688       $v .= mfn_dmail_l($urlf . '/unjunk/' . $header->id, 'Unjunk', 'The mail item is not Junk (i.e. not SPAM).', $attributes, $orderby, array('type' => 'action', 'file' => 'unjunk.png')) . ' | ';
00689     }
00690     else {
00691       $v .= mfn_dmail_l($urlf . '/junk/' . $header->id, 'Junk', 'The mail item is Junk (i.e. SPAM).', $attributes, $orderby, array('type' => 'action', 'file' => 'junk.png')) . ' | ';
00692     }
00693     if ($header->deleted) {
00694       $v .= mfn_dmail_l(array(
00695         'url' => $urlf . '/undelete/' . $header->id,
00696         'title' => 'Undelete',
00697         'description' => 'Undelete the mail item.',
00698         'attributes' => $attributes,
00699         'options' => $orderby,
00700         'image' => array('type' => 'action', 'file' => 'undelete.png'),
00701       )) . ' | ';
00702     }
00703     else {
00704       $v .= mfn_dmail_l(array(
00705         'url' => $urlf . '/delete/' . $header->id,
00706         'title' => 'Delete',
00707         'description' => 'Delete the mail item.',
00708         'attributes' => $attributes,
00709         'options' => $orderby,
00710         'image' => array('type' => 'action', 'file' => 'delete.png'),
00711       )) . ' | ';
00712     }
00713     if ($header->flagged) {
00714       $v .= mfn_dmail_l($urlf . '/unflag/' . $header->id, 'Normal', 'Flag mail item not important.', $attributes, $orderby, array('type' => 'action', 'file' => 'unimportant.png')) . ' | ';
00715     }
00716     else {
00717       $v .= mfn_dmail_l($urlf . '/flag/' . $header->id, 'Important', 'Flag mail item important.', $attributes, $orderby, array('type' => 'action', 'file' => 'important.png')) . ' | ';
00718     }
00719     if ($header->seen) {
00720       $v .= mfn_dmail_l(array(
00721         'url' => $urlf . '/unseen/' . $header->id,
00722         'title' => 'Unseen',
00723         'description' => 'Flag the mail item not seen.',
00724         'attributes' => $attributes,
00725         'options' => $orderby,
00726         'image' => array('type' => 'action', 'file' => 'flag_unseen.png'),
00727       )) . ' | ';
00728     }
00729     else {
00730       $v .= mfn_dmail_l(array(
00731         'url' => $urlf . '/seen/' . $header->id,
00732         'title' => 'Seen',
00733         'description' => 'Flag the mail item seen.',
00734         'attributes' => $attributes,
00735         'options' => $orderby,
00736         'image' => array('type' => 'action', file=> 'flag_seen.png'),
00737       )) . ' | ';
00738     }
00739     $v .= mfn_dmail_l($urlf . '/copy/' . $header->id, 'Copy', 'Copy the mail item.', $attributes, $orderby, array('type' => 'action', 'file' => 'copy.png')) . ' | ';
00740     $v .= mfn_dmail_l($urlf . '/move/' . $header->id, 'Move', 'Move the mail item.', $attributes, $orderby, array('type' => 'action', 'file' => 'move.png')) . ' | ';
00741     if (mfn_dmail_access($user->uid, DMAIL_POST_ROLE)) {
00742       $v .= mfn_dmail_l($urlf . '/post/' . $header->id, 'Post', 'Post this message to Drupal.', $attributes, $orderby, array('type' => 'action', 'file' => 'post.png')) . ' | ';
00743     }
00744     $form['dmail']['headers']['operations'][$header->id] = array(
00745       '#value' => $v,
00746       '#prefix' => '&nbsp;' . $bspan,
00747       '#suffix' => '&nbsp;' . $espan,
00748     );
00749     $form['dmail']['headers']['pager'] = array(
00750       '#value' => theme('pager', NULL, duvar_get('items_per_page', 10), 0),
00751     );
00752     //$__headers = explode("\n", $imap->fetchheader($_headers->msgno));
00753     $form['dmail']['headers']['headers'][$header->id] = array(
00754       '#value' => check_plain(print_r($header->full, TRUE)),
00755       '#prefix' => '<pre>',
00756       '#suffix' => '</pre>',
00757     );
00758   }
00759   //$imap->close();
00760   return $form;
00761 }
00762 
00766 function mfm_dmail_display_item(&$form_state, $mbox_id, $header_id, $html = FALSE) {
00767   global $user, $imap;
00768   dcache_del(array('form', 'reply'), DCACHE_SESSION);
00769   $item = dcache_get(array('form', 'item'), DCACHE_SESSION);
00770   if (isset($item)) {
00771     if ($item['mbox_id'] === $mbox_id && $item['header_id'] === $header_id && $item['html'] === $html) {
00772       return $item['form'];
00773     }
00774   }
00775   mfn_dmail_security_check();
00776   mfn_dmail_readonly_check();
00777   set_time_limit(60);
00778   $form = array();
00779   //* We get all the headers to program the Prev/Next Buttons.
00780   //* @todo Select needs to include ordering information.
00781   //* @todo Determine which page the Prev/Next link would be on in the list
00782   //        to program the Mailbox Items breadcrumb link.
00783   $headers = mfn_dmail_db_mbox_message_headers_select_ordered($mbox_id);
00784   for ($i = 0; $i < count($headers); $i++) {
00785     if ($headers[$i]->id == $header_id) {
00786       $header = $headers[$i];
00787       break;
00788     }
00789   }
00790   if (empty($header)) {
00791     $header = $headers[0];
00792   }
00793   $mbox = mfn_dmail_db_mbox_select($header->mbox_id);
00794   $identity = mfn_dmail_db_identity_select($mbox->identity_id);
00795   mfn_dmail_set_active_identity($identity);
00796   mfn_dmail_active_mbox($mbox);
00797   drupal_set_title(t('View @identity->@mbox', array(
00798     '@identity' => $identity->name,
00799     '@mbox' => $mbox->name,
00800     '%subject' => mfn_dmail_decode_str($header->subject),
00801   )));
00802   $header->identity_id = $mbox->identity_id;
00803   mfn_dmail_imap_open($identity, $mbox->name);
00804   $headerinfo = mfn_dmail_get_headerinfo($header);
00805   mfn_dmail_xform_header($header, $headerinfo);
00806   if ((isset($header->x_spam_flag) &&
00807        strtolower(trim($header->x_spam_flag)) === 'yes') ||
00808       (isset($header->x_va_spam_flag) &&
00809        strtolower(trim($header->x_va_spam_flag)) === 'yes'))
00810   {
00811     drupal_set_message('This items headers are indicating it as SPAM.', 'error');
00812   }
00813   if ($header->deleted) {
00814     drupal_set_message('DELETED item.', 'warning');
00815   }
00816   if ($header->draft) {
00817     drupal_set_message('DRAFT item.', 'warning');
00818   }
00819   if ($header->flagged) {
00820     drupal_set_message('IMPORTANT item.', 'warning');
00821   }
00822   $bodyplain = $imap->fetch_item($header->msgno, 'TEXT/PLAIN');
00823   $bodyhtml = $imap->fetch_item($header->msgno, 'TEXT/HTML');
00824   $attach = $imap->fetch_item($header->msgno, 'ATTACHMENT');
00825   if (empty($bodyplain)) {
00826     $bodyplain = $bodyhtml;
00827   }
00828   $body = $html ? $bodyhtml : mfn_dmail_format_body(mfn_dmail_check_string($bodyplain, TRUE), 80);
00829   $structure = $imap->fetchstructure($header->msgno);
00830   $bodystruct['1'] = $imap->bodystruct($header->msgno, '1');
00831   $bodystruct['1.1'] = $imap->bodystruct($header->msgno, '1.1');
00832   $bodystruct['1.2'] = $imap->bodystruct($header->msgno, '1.2');
00833   $bodystruct['2'] = $imap->bodystruct($header->msgno, '2');
00834   $bodystruct['3'] = $imap->bodystruct($header->msgno, '3');
00835   $imap->close();
00836   $form['dmail']['item']['begintable1'] = array(
00837     '#prefix' => '<p><table>',
00838     '#value' => ' ',
00839   );
00840   $form['dmail']['item']['itemnot'] = array(
00841     '#prefix' => '<tr><th>',
00842     '#value' => 'Item:',
00843     '#suffix' => '</th>',
00844   );
00845   $form['dmail']['item']['itemno'] = array(
00846     '#prefix' => '<td>',
00847     '#value' => $header->current_id + 1 . t(' of ') . count($headers),
00848     '#suffix' => '</td>',
00849   );
00850   $form['dmail']['item']['receivedt'] = array(
00851     '#prefix' => '<tr><th>',
00852     '#value' => 'Received:',
00853     '#suffix' => '</th>',
00854   );
00855   $form['dmail']['item']['received'] = array(
00856     '#prefix' => '<td>',
00857     '#value' => $header->date,
00858     '#suffix' => '</td>',
00859   );
00860   $xform = mfn_dmail_transform_addr('from', $header);
00861   $form['dmail']['item']['fromt'] = array(
00862     '#prefix' => '<tr><th>',
00863     '#value' => 'From:',
00864     '#suffix' => '</th>',
00865   );
00866   $form['dmail']['item']['from'] = array(
00867     '#prefix' => '<td>',
00868     '#value' => $xform[0],
00869     '#suffix' => '</td>',
00870   );
00871   $form['dmail']['item']['fromo'] = array(
00872     '#prefix' => '<td>',
00873     '#value' => mfn_dmail_options_addr('from', $header, !is_null($bodyhtml), 0),
00874     '#suffix' => '</td></tr>',
00875   );
00876   $xform = mfn_dmail_transform_addr('to', $header);
00877   $tot = t('To:');
00878   foreach ($xform as $el => $addr) {
00879     $form['dmail']['item'][$el]['tot'] = array(
00880       '#prefix' => '<tr><th>',
00881       '#value' => $tot,
00882       '#suffix' => '</th>',
00883     );
00884     $tot = ' &amp;';
00885     $form['dmail']['item'][$el]['to'] = array(
00886       '#prefix' => '<td>',
00887       '#value' => $addr,
00888       '#suffix' => '</td>',
00889     );
00890     $form['dmail']['item'][$el]['too'] = array(
00891       '#prefix' => '<td>',
00892       '#value' => mfn_dmail_options_addr('to', $header, !is_null($bodyhtml), $el),
00893       '#suffix' => '</td></tr>',
00894     );
00895   }
00896   if (isset($header->cc)) {
00897     $xform = mfn_dmail_transform_addr('cc', $header);
00898     $cct = t('Cc:');
00899     foreach ($xform as $el => $addr) {
00900       $form['dmail']['item'][$el]['cct'] = array(
00901         '#prefix' => '<tr><th>',
00902         '#value' => $cct,
00903         '#suffix' => '</th>',
00904       );
00905       $cct = ' &amp;';
00906       $form['dmail']['item'][$el]['cc'] = array(
00907         '#prefix' => '<td>',
00908         '#value' => $addr,
00909         '#suffix' => '</td>',
00910       );
00911       $form['dmail']['item'][$el]['cco'] = array(
00912         '#prefix' => '<td>',
00913         '#value' => mfn_dmail_options_addr('cc', $header, !is_null($bodyhtml), $el),
00914         '#suffix' => '</td></tr>',
00915       );
00916     }
00917   }
00918   $form['dmail']['item']['tsubject'] = array(
00919     '#prefix' => '<tr><th>',
00920     '#value' => t('Subject:'),
00921     '#suffix' => '</th>',
00922   );
00923   $form['dmail']['item']['subject'] = array(
00924     '#prefix' => '<td colspan="2">',
00925     '#value' => check_plain(mfn_dmail_decode_str($header->subject)),
00926     '#suffix' => '</td></tr>',
00927   );
00928   $list_options = mfn_dmail_options_addr('list options', $header, !is_null($bodyhtml));
00929   if (!empty($list_options)) {
00930     $form['dmail']['item']['list_options'] = array(
00931       '#prefix' => '<tr><td colspan="3">',
00932       '#value' => $list_options,
00933       '#suffix' => '</td></tr>',
00934     );
00935   }
00936   $form['dmail']['item']['endtable1'] = array(
00937     '#value' => ' ',
00938     '#suffix' => '</table></p>',
00939   );
00940   $form['dmail']['item']['begintable2'] = array(
00941     '#prefix' => '<p><table border="1" width="80%">',
00942     '#value' => ' ',
00943   );
00944   $form['dmail']['item']['options'] = array(
00945     '#prefix' => '<tr><td>',
00946     '#value' => mfn_dmail_options_addr('options', $header, !is_null($bodyhtml), NULL, $html),
00947     '#suffix' => '</td></tr>',
00948   );
00949   $form['dmail']['item']['attachments'] = array(
00950     '#prefix' => '<tr><td>',
00951     '#value' => mfn_dmail_format_attachments($attach),
00952     '#suffix' => '</td></tr>',
00953   );
00954   $form['dmail']['item']['body'] = array(
00955     '#type' => 'markup',
00956     '#prefix' => '<tr><td>',
00957     '#value' => $body,
00958     '#suffix' => '</td></tr>',
00959     '#disabled' => TRUE,
00960   );
00961   $form['dmail']['item']['attachments2'] = array(
00962     '#prefix' => '<tr><td>',
00963     '#value' => $form['dmail']['item']['attachments']['#value'],
00964     '#suffix' => '</td></tr>',
00965   );
00966   $form['dmail']['item']['options2'] = array(
00967     '#prefix' => '<tr><td>',
00968     '#value' => $form['dmail']['item']['options']['#value'],
00969     '#suffix' => '</td></tr>',
00970   );
00971   $form['dmail']['item']['end'] = array(
00972     '#value' => ' ',
00973     '#suffix' => '</table></p>',
00974   );
00975   $form['dmail']['item']['headers'] = array(
00976     '#prefix' => '<!-- <pre>',
00977     '#value' => print_r($header,true),
00978     '#suffix' => '</pre>',
00979   );
00980   $form['dmail']['item']['headerinfo'] = array(
00981     '#prefix' => '<pre>',
00982     '#value' => print_r($headerinfo,true),
00983     '#suffix' => '</pre>',
00984   );
00985   $form['dmail']['item']['structure'] = array(
00986     '#prefix' => '<pre>',
00987     '#value' => print_r($structure,true),
00988     '#suffix' => '</pre>',
00989   );
00990   $form['dmail']['item']['bodystruct'] = array(
00991     '#prefix' => '<pre>',
00992     '#value' => print_r($bodystruct,true),
00993     '#suffix' => '</pre> -->',
00994   );
00995   $form['dmail']['item']['attach'] = array(
00996     '#prefix' => '<!-- <pre>',
00997     '#value' => print_r($attach,true),
00998     '#suffix' => '</pre> -->',
00999   );
01000   dcache_set(array('form', 'item'), array(
01001     'identity_id' => $mbox->identity_id,
01002     'mbox_id' => $mbox_id,
01003     'header_id' => $header_id,
01004     'html' => $html,
01005     'bodyplain' => $bodyplain,
01006     'bodyhtml' => $bodyhtml,
01007     'attach' => $attach,
01008     'form' => $form,
01009   ), DCACHE_SESSION);
01010   return $form;
01011 }
01012 
01016 function mfm_dmail_reply_item(&$form_state, $header_id) {
01017   global $user;
01018   mfn_dmail_security_check();
01019   mfn_dmail_readonly_check();
01020   $ns = array('form', 'reply');
01021   $cache = dcache_get($ns);
01022   dcache_del($ns);
01023   $header = mfn_dmail_db_mbox_message_header_select($header_id);
01024   $headerinfo = mfn_dmail_get_headerinfo($header);
01025   mfn_dmail_xform_header($header, $headerinfo);
01026   drupal_set_message('The Reply form is still under development.', 'warning');
01027   $form['dmail']['reply']['message'] = array(
01028     '#value' => "You've requested a reply to item: $header_id",
01029   );
01030   if (isset($cache['recipients'])) {
01031     $recipients =& $cache['recipients'];
01032   }
01033   else {
01034     $recipients = mfn_dmail_reply_to('reply', $header);
01035   }
01036   mfm_dmail_reply_form($form, $recipients, $header);
01037   dcache_set($ns, array('form' => $form, 'recipients' => $recipients));
01038   return $form;
01039 }
01040 
01044 function mfm_dmail_replylist_item(&$form_state, $header_id) {
01045   global $user;
01046   static $hval = array('to' => 'To:', 'cc' => 'Cc:', 'bc' => 'Bcc:', 'rt' => 'Reply-To:');
01047   mfn_dmail_security_check();
01048   mfn_dmail_readonly_check();
01049   $ns = array('form', 'reply');
01050   $cmode = DCACHE_SESSION;
01051   $cache = dcache_get($ns, $cmode);
01052   dcache_del($ns, $cmode);
01053   $header = mfn_dmail_db_mbox_message_header_select($header_id);
01054   $headerinfo = mfn_dmail_get_headerinfo($header);
01055   mfn_dmail_xform_header($header, $headerinfo);
01056   drupal_set_message('The List Reply form is still under development.', 'warning', FALSE);
01057   if (isset($cache['recipients'])) {
01058     $recipients =& $cache['recipients'];
01059   }
01060   else {
01061     $recipients = mfn_dmail_reply_to('replylist', $header);
01062   }
01063   $form['dmail']['reply']['message'] = array(
01064     '#value' => "You've requested a list reply to item: $header_id",
01065   );
01066   mfm_dmail_reply_form($form, $recipients, $header);
01067   dcache_set($ns, array('form' => $form, 'recipients' => $recipients), $cmode);
01068   return $form;
01069 }
01070 
01074 function mfm_dmail_reply_form(&$form, &$recipients, $header) {
01075   static $hval = array('to' => 'To:', 'cc' => 'Cc:', 'bc' => 'Bcc:', 'rt' => 'Reply-To:');
01076   $form['dmail']['reply']['begintable1'] = array(
01077     '#prefix' => '<p><table>',
01078     '#value' => ' ',
01079   );
01080   $form['dmail']['reply']['fromt'] = array(
01081     '#prefix' => '<tr><th>',
01082     '#value' => 'From:',
01083     '#suffix' => '</th>',
01084   );
01085   $form['dmail']['reply']['from'] = array(
01086     '#prefix' => '<td>',
01087     '#type' => 'select',
01088     '#options' => mfn_dmail_reply_from($header),
01089     '#default_value' => 0,
01090     '#suffix' => '</td></tr>',
01091   );
01092   if (!is_array($recipients)) {
01093     $t = $recipients;
01094     $recipients= array();
01095     $recipients[] = $t;
01096     unset($t);
01097   }
01098   $replycount = 0;
01099   foreach($recipients as $key => $obj) {
01100     $form['dmail']['reply'][$key]["toitem:$key"] = array(
01101       '#type' => 'value',
01102       '#value' => $key,
01103     );
01104     $form['dmail']['reply'][$key]["tot:$key"] = array(
01105       '#prefix' => '<tr><th>',
01106       '#type' => 'select',
01107       '#options' => $hval,
01108       '#default_value' => $obj->hval,
01109       '#suffix' => '</th>',
01110     );
01111     $form['dmail']['reply'][$key]["to:$key"] = array(
01112       '#prefix' => '<td>',
01113       '#type' => 'textfield',
01114       '#default_value' => $obj->recipient,
01115       '#suffix' => '</td>',
01116     );
01117     $form['dmail']['reply'][$key]["too:$key"] = array(
01118       '#prefix' => '<td>',
01119       '#name' => $key,
01120       '#type' => 'submit',
01121       '#value' => 'Remove',
01122       '#suffix' => '</td>',
01123       '#submit' => array('mfm_dmail_recipient_action'),
01124     );
01125     $form['dmail']['reply'][$key]["too2:$key"] = array(
01126       '#prefix' => '<td>',
01127       '#name' => $key,
01128       '#type' => 'submit',
01129       '#value' => 'Update',
01130       '#suffix' => '</td>',
01131       '#submit' => array('mfm_dmail_recipient_action'),
01132     );
01133   }
01134   $key = count($recipients);
01135   $form['dmail']['reply'][$key]["toitem:$key"] = array(
01136     '#type' => 'value',
01137     '#value' => $key,
01138   );
01139   $form['dmail']['reply'][$key]["tot:$key"] = array(
01140     '#prefix' => '</tr><tr><th>',
01141     '#type' => 'select',
01142     '#options' => $hval,
01143     '#suffix' => '</th>',
01144   );
01145   $form['dmail']['reply'][$key]["to:$key"] = array(
01146     '#prefix' => '<td>',
01147     '#type' => 'textfield',
01148     '#suffix' => '</td>',
01149   );
01150   $form['dmail']['reply'][$key]["too:$key"] = array(
01151     '#prefix' => '<td>',
01152     '#name' => $key,
01153     '#type' => 'submit',
01154     '#value' => 'Add',
01155     '#suffix' => '</td></tr>',
01156     '#submit' => array('mfm_dmail_recipient_action'),
01157   );
01158   $form['dmail']['reply']['subject'] = array(
01159     '#prefix' => '<tr><td colspan="3">',
01160     '#title' => t('Subject'),
01161     '#type' => 'textfield',
01162     '#default_value' => mfn_dmail_reply_subject($header),
01163   );
01164   $form['dmail']['reply']['body'] = array(
01165     '#type' => 'textarea',
01166     '#default_value' => mfn_dmail_reply_body($header, duvar_get('body_char_wrap', DMAIL_DEFAULT_BODY_CHAR_WRAP)),
01167     '#cols' => 85,
01168     '#rows' => 25,
01169   );
01170   $form['dmail']['reply']['send'] = array(
01171     '#type' => 'submit',
01172     '#value' => 'Send',
01173     '#submit' => array('mfm_dmail_send_action'),
01174   );
01175   $form['dmail']['reply']['cancel'] = array(
01176     '#type' => 'submit',
01177     '#value' => 'Cancel',
01178     '#submit' => array('mfm_dmail_cancel_action'),
01179   );
01180   $form['dmail']['reply']['endtable1'] = array(
01181     '#value' => ' ',
01182     '#suffix' => '</td></tr></table></p>',
01183   );
01184 }
01185 
01189 function mfm_dmail_recipient_action(&$form, &$form_state) {
01190   $ns = array('form', 'reply');
01191   $cache = dcache_get($ns);
01192   $r =& $cache['recipients'];
01193   $v =& $form_state['values'];
01194   $key =& $form_state['clicked_button']['#name'];
01195   switch ($v[$key]) {
01196     case 'Add': {
01197       $cl = new stdClass;
01198       $cl->hval = $v["tot:$key"];
01199       $cl->recipient = $v["to:$key"];
01200       $r[] = $cl;
01201     } break;
01202     case 'Update': {
01203       $cl = new stdClass;
01204       $cl->hval = $v["tot:$key"];
01205       $cl->recipient = $v["to:$key"];
01206       $r[$key] = $cl;
01207     } break;
01208     case 'Remove': {
01209       unset($r[$key]);
01210     } break;
01211   }
01212   dcache_set($ns, $cache);
01213 }
01214 
01218 function mfm_dmail_send_action(&$form, &$form_state) {
01219   $identity = mfn_dmail_db_identity_select(arg(3));
01220   $ns = array('form','reply');
01221   $cmode = DCACHE_SESSION;
01222   if ($identity->readonly) {
01223     form_error($form, 'Mail was not sent because the identity is set to read only!');
01224     dcache_del($ns, $cmode);
01225     return;
01226   }
01227 }
01228 
01232 function mfm_dmail_cancel_action(&$form, &$form_state) {
01233   $ns = array('form','reply');
01234   $cmode = DCACHE_SESSION;
01235   dcache_del($ns, $cmode);
01236   $args = arg();
01237   $uri = "user/{$args[1]}/email/{$args[3]}/mbox/{$args[5]}/view/{$args[7]}";
01238   drupal_goto($uri);
01239 }
01240 
01244 function mfm_dmail_replyall_item(&$form_state, $header_id) {
01245   global $user;
01246   mfn_dmail_security_check();
01247   mfn_dmail_readonly_check();
01248   $ns = array('form', 'reply');
01249   $cache = dcache_get($ns);
01250   dcache_del($ns);
01251   drupal_set_message('The Reply All form is still under development.', 'warning');
01252   $header = mfn_dmail_db_mbox_message_header_select($header_id);
01253   $headerinfo = mfn_dmail_get_headerinfo($header);
01254   mfn_dmail_xform_header($header, $headerinfo);
01255   $form['dmail']['reply']['message'] = array(
01256     '#value' => "You've requested a reply all to item: $header_id",
01257   );
01258   if (isset($cache['recipients'])) {
01259     $recipients =& $cache['recipients'];
01260   }
01261   else {
01262     $recipients = mfn_dmail_reply_to('replyall', $header);
01263   }
01264   mfm_dmail_reply_form($form, $recipients, $header);
01265   dcache_set($ns, array('form' => $form, 'recipients' => $recipients));
01266   return $form;
01267 }
01268 
01272 function mfm_dmail_replyto_item(&$form_state, $header_id, $personal, $address) {
01273   global $user;
01274   mfn_dmail_security_check();
01275   mfn_dmail_readonly_check();
01276   $ns = array('form', 'reply');
01277   $cache = dcache_get($ns);
01278   dcache_del($ns);
01279   drupal_set_message('The Reply To form is still under development.', 'warning');
01280   $header = mfn_dmail_db_mbox_message_header_select($header_id);
01281   $headerinfo = mfn_dmail_get_headerinfo($header);
01282   mfn_dmail_xform_header($header, $headerinfo);
01283   if (empty($address)) {
01284     $address = $personal;
01285     $personal = NULL;
01286   }
01287   $form['dmail']['reply']['message'] = array(
01288     '#value' => "You've requested a reply to $personal &lt;$address&gt; for item $header_id",
01289   );
01290   if (isset($cache['recipients'])) {
01291     $recipients =& $cache['recipients'];
01292   }
01293   else {
01294     $recipients = mfn_dmail_reply_to('replyto', $header);
01295   }
01296   mfm_dmail_reply_form($form, $recipients, $header);
01297   dcache_set($ns, array('form' => $form, 'recipients' => $recipients));
01298   return $form;
01299 }
01300 
01304 function mfm_dmail_forward_item(&$form_state, $header_id) {
01305   global $user;
01306   mfn_dmail_security_check();
01307   drupal_set_message('The Forward form is still under development.', 'warning');
01308   $form['dmail']['reply']['message'] = array(
01309     '#value' => "You've requested to forward item: $header_id",
01310   );
01311   return $form;
01312 }
01313 
01317 function mfm_dmail_junk_item(&$form_state, $header_id) {
01318   global $user;
01319   mfn_dmail_security_check();
01320   drupal_set_message('The Junk form is still under development.', 'warning');
01321   $form['dmail']['reply']['message'] = array(
01322     '#value' => "You've requested to junk item: $header_id",
01323   );
01324   return $form;
01325 }
01326 
01330 function mfm_dmail_unjunk_item(&$form_state, $header_id) {
01331   global $user;
01332   mfn_dmail_security_check();
01333   drupal_set_message('The Unjunk form is still under development.', 'warning');
01334   $form['dmail']['reply']['message'] = array(
01335     '#value' => "You've requested to unjunk item: $header_id",
01336   );
01337   return $form;
01338 }
01339 
01343 function mfm_dmail_delete_item(&$form_state, $header_id) {
01344   global $user;
01345   mfn_dmail_security_check();
01346   drupal_set_message('The Delete form is still under development.', 'warning');
01347   $form['dmail']['reply']['message'] = array(
01348     '#value' => "You've requested to delete item: $header_id",
01349   );
01350   return $form;
01351 }
01352 
01356 function mfm_dmail_undelete_item(&$form_state, $header_id) {
01357   global $user;
01358   mfn_dmail_security_check();
01359   drupal_set_message('The Undelete form is still under development.', 'warning');
01360   $form['dmail']['reply']['message'] = array(
01361     '#value' => "You've requested to undelete item: $header_id",
01362   );
01363   return $form;
01364 }
01365 
01369 function mfm_dmail_flag_item(&$form_state, $header_id) {
01370   global $user;
01371   mfn_dmail_security_check();
01372   drupal_set_message('The Important form is still under development.', 'warning');
01373   $form['dmail']['reply']['message'] = array(
01374     '#value' => "You've requested to mark the item as important: $header_id",
01375   );
01376   return $form;
01377 }
01378 
01382 function mfm_dmail_unflag_item(&$form_state, $header_id) {
01383   global $user;
01384   mfn_dmail_security_check();
01385   drupal_set_message('The Normal form is still under development.', 'warning');
01386   $form['dmail']['reply']['message'] = array(
01387     '#value' => "You've requested to mark the item as normal: $header_id",
01388   );
01389   return $form;
01390 }
01391 
01395 function mfm_dmail_seen_item(&$form_state, $header_id) {
01396   global $user;
01397   mfn_dmail_security_check();
01398   drupal_set_message('The Seen form is still under development.', 'warning');
01399   $form['dmail']['reply']['message'] = array(
01400     '#value' => "You've requested to mark the item seen: $header_id",
01401   );
01402   return $form;
01403 }
01404 
01408 function mfm_dmail_unseen_item(&$form_state, $header_id) {
01409   global $user;
01410   mfn_dmail_security_check();
01411   drupal_set_message('The Unseen form is still under development.', 'warning');
01412   $form['dmail']['reply']['message'] = array(
01413     '#value' => "You've requested to mark the item unseen: $header_id",
01414   );
01415   return $form;
01416 }
01417 
01421 function mfm_dmail_copy_item(&$form_state, $header_id) {
01422   global $user;
01423   mfn_dmail_security_check();
01424   drupal_set_message('The Copy form is still under development.', 'warning');
01425   $form['dmail']['reply']['message'] = array(
01426     '#value' => "You've requested to copy item: $header_id",
01427   );
01428   return $form;
01429 }
01430 
01434 function mfm_dmail_move_item(&$form_state, $header_id) {
01435   global $user;
01436   mfn_dmail_security_check();
01437   drupal_set_message('The Move form is still under development.', 'warning');
01438   $form['dmail']['reply']['message'] = array(
01439     '#value' => "You've requested to move item: $header_id",
01440   );
01441   return $form;
01442 }
01443 
01447 function mfm_dmail_friendly_addr(&$form_state, $personal, $address) {
01448   global $user;
01449   mfn_dmail_security_check();
01450   drupal_set_message('The Friendly Address form is still under development.', 'warning');
01451   if (empty($address)) {
01452     $address = $personal;
01453     $personal = NULL;
01454   }
01455   $form['dmail']['reply']['message'] = array(
01456     '#value' => "You've requested $personal &lt;$address&gt; be identified as friendly.",
01457   );
01458   return $form;
01459 }
01460 
01464 function mfm_dmail_unfriendly_addr(&$form_state, $personal, $address) {
01465   global $user;
01466   mfn_dmail_security_check();
01467   drupal_set_message('The Unfriendly Address form is still under development.', 'warning');
01468   if (empty($address)) {
01469     $address = $personal;
01470     $personal = NULL;
01471   }
01472   $form['dmail']['reply']['message'] = array(
01473     '#value' => "You've requested $personal &lt;$address&gt; be identified as unfriendly.",
01474   );
01475   return $form;
01476 }
01477 
01481 function mfm_dmail_send_item(&$form_state, $personal, $address) {
01482   global $user;
01483   mfn_dmail_security_check();
01484   drupal_set_message('The Send form is still under development.', 'warning');
01485   if (empty($address)) {
01486     $address = $personal;
01487     $personal = NULL;
01488   }
01489   $form['dmail']['reply']['message'] = array(
01490     '#value' => "You've requested to send mail to: $personal &lt;$address&gt;",
01491   );
01492   return $form;
01493 }
01494 
01504 function mfm_dmail_attachment(&$form_state, $item, $attidx) {
01505   global $user;
01506   mfn_dmail_security_check();
01507   $cache = dcache_get(array('form', 'item'), DCACHE_SESSION);
01508   $attach =& $cache['attach'][$attidx];
01509   drupal_set_header('Content-Type: application/' . strtolower($attach->subtype));
01510   drupal_set_header('Cache-Control: private, must-revalidate, post-check=0, pre-check=0');
01511   drupal_set_header('Content-Disposition: attachment; filename="' . $attach->filename . '"');
01512   print $attach->contents;
01513 }
01514 
01515 /******************************************************************************
01516  * Module theme implementations
01517  */
01518 
01522 function theme_mfm_dmail_identities($form) {
01523   $header = mfn_dmail_list_headers('dmail_identities', $form);
01524   $output = NULL;
01525   $rows = array();
01526   foreach (element_children($form['dmail']['identity']['list']['id']) as $key) {
01527     $rows[] = array(
01528       drupal_render($form['dmail']['identity']['list']['identities'][$key]),
01529       drupal_render($form['dmail']['identity']['list']['id'][$key]),
01530       drupal_render($form['dmail']['identity']['list']['name'][$key]),
01531       drupal_render($form['dmail']['identity']['list']['lastchkd'][$key]),
01532       drupal_render($form['dmail']['identity']['list']['messages'][$key]),
01533       drupal_render($form['dmail']['identity']['list']['recent'][$key]),
01534       drupal_render($form['dmail']['identity']['list']['operations'][$key]),
01535     );
01536   }
01537   if (!count($rows)) {
01538     $rows[] = array(array('data' => t('No identities to list.'), 'colspan' => '7'));
01539   }
01540   $output .= theme('table', $header, $rows);
01541   $output .= drupal_render($form);
01542   return $output;
01543 }
01544 
01548 function theme_mfm_dmail_display_headers($form) {
01549   $output = NULL;
01550   $pager = NULL;
01551   $rows = array();
01552   if (isset($form['dmail']['headers']['msgno'])) {
01553   foreach (element_children($form['dmail']['headers']['msgno']) as $key) {
01554     $rows[] = array(
01555       drupal_render($form['dmail']['headers']['msgno'][$key]),
01556       drupal_render($form['dmail']['headers']['received'][$key]),
01557       drupal_render($form['dmail']['headers']['from'][$key]),
01558       drupal_render($form['dmail']['headers']['subject'][$key]),
01559       drupal_render($form['dmail']['headers']['operations'][$key]),
01560     );
01561     unset($form['dmail']['headers']['headers']);
01562   }
01563   if ($form['dmail']['headers']['pager']['#value']) {
01564     $pager = drupal_render($form['dmail']['headers']['pager']);
01565   }
01566   }
01567   else {
01568     $rows[] = array(array('data' => t('No items in this mailbox folder.'), 'colspan' => '5'));
01569   }
01570   $header = mfn_dmail_items_list_header();
01571   $output = $pager;
01572   $output .= theme('table', $header, $rows);
01573   $output .= $pager;
01574   $output .= drupal_render($form);
01575   return $output;
01576 }
01577 
01578 /******************************************************************************
01579  * Module functions
01580  */
01581 
01588 function mfn_dmail_get_newmail($identity) {
01589   global $user, $imap;
01590   //* Only an authenticated user can call this function.
01591   mfn_dmail_security_check();
01592   if ($identity->user_id !=  $user->uid) {
01593     exit;
01594   }
01595   $lastchkd = date('Y-m-d H:i:s');
01596   $mbox = mfn_dmail_db_mbox_select_by_name($identity->id, $identity->inbox);
01597   $res = mfn_dmail_imap_open($identity);
01598   $status = $imap->status();
01599   if ($status->messages) {
01600     $mbox->messages = $status->messages;
01601     $mbox->recent = $status->recent;
01602     $mbox->unseen = $status->unseen;
01603     $mbox->lastchkd = $lastchkd;
01604     mfn_dmail_db_mboxes_update($mbox->id, $mbox);
01605     $headers = $imap->fetch_overview("1:{$status->messages}");
01606     foreach ($headers as $header) {
01607       mfn_dmail_process_header($mbox, $header, $lastchkd);
01608     }
01609   }
01610   mfn_dmail_db_identity_update_lastchkd($identity->id, $lastchkd);
01611 }
01612 
01628 function mfn_dmail_imap_open($identity, $mbox_name = NULL, $mode = OP_READONLY) {
01629   global $imap;
01630   if (is_numeric($identity)) {
01631     $identity = mfn_dmail_db_identity_select($identity);
01632   }
01633 
01634   $imap = new IMAP(
01635     $identity->user,
01636     mfn_dmail_decrypt($identity->pass),
01637     $identity->host,
01638     $identity->port,
01639     $identity->service,
01640     $identity->delimiter,
01641     $identity->encryption,
01642     $identity->vld8cert,
01643     $identity->readonly
01644   );
01645   if ($mbox_name) {
01646     $imap->mailbox = $mbox_name;
01647   }
01648   $result = $imap->open($mode);
01649 
01650   return $result;
01651 }
01652 
01659 function mfn_dmail_get_mailboxes($identity_id) {
01660   global $imap;
01661   $identity = mfn_dmail_db_identity_select($identity_id);
01662   mfn_dmail_imap_open($identity);
01663   $mboxes = $imap->list_mboxes();
01664   foreach ($mboxes as $mbox) {
01665     mfn_dmail_process_mbox($identity, $mbox);
01666   }
01667 }
01668 
01679 function mfn_dmail_get_headers($mbox, $identity = NULL) {
01680   global $imap;
01681   if (is_numeric($mbox)) {
01682     $mbox = mfn_dmail_db_mbox_select($mbox);
01683   }
01684   if (empty($identity)) {
01685     $identity = $mbox->id;
01686   }
01687   if (is_numeric($identity)) {
01688     $identity = mfn_dmail_db_identity_select($identity);
01689   }
01690   mfn_dmail_imap_open($identity);
01691   $status = $imap->status($mbox->name);
01692   if ($status->messages != $mbox->messages) {
01693     $mbox->messages = $status->messages;
01694     $mbox->recent = $status->recent;
01695     $mbox->unseen = $status->unseen;
01696     $mbox->lastchkd = date('Y-m-d H:i:s');
01697     mfn_dmail_process_mbox($identity, $mbox);
01698   }
01699   $headers = $imap->list_headers($mbox->name);
01700   foreach ($headers as $header) {
01701     mfn_dmail_process_header($mbox, $header, $mbox->lastchkd);
01702   }
01703 }
01704 
01711 function mfn_dmail_remove_identity($identity_id) {
01712   $identity = mfn_dmail_db_identity_select($identity_id);
01713   unset($_SESSION['dmail']['db']['mboxes']);
01714   $mboxes = mfn_dmail_db_mboxes_select($identity_id);
01715   unset($_SESSION['dmail']['db']['headers']);
01716   foreach ($mboxes as $mbox) {
01717     $headers = mfn_dmail_db_headers_select($mbox->id);
01718     foreach ($headers as $header) {
01719       mfn_dmail_db_header_delete($header->id);
01720     }
01721     mfn_dmail_db_mbox_delete($mbox->id);
01722   }
01723   mfn_dmail_db_identity_delete($identity->id);
01724 }
01725 
01732 function mfn_dmail_get_mail($identity_id) {
01733   global $user, $imap;
01734   $identity = mfn_dmail_db_identity_select($identity_id);
01735   if (is_object($identity)) {
01736     $result = mfn_dmail_imap_open($identity);
01737     if (is_resource($result)) {
01738       $lastchkd = date('Y-m-d H:i:s');
01739       $mboxes = $imap->list_mboxes();
01740       foreach ($mboxes as $mbox) {
01741         mfn_dmail_process_mbox($identity, $mbox);
01742       }
01743       $mboxes = mfn_dmail_db_mboxes_select($identity_id);
01744       foreach ($mboxes as $mbox) {
01745         if ($mbox->messages) {
01746           $headers = $imap->list_headers($mbox->name);
01747           foreach ($headers as $header) {
01748             mfn_dmail_debug(__FILE__, __LINE__, __FUNCTION__, 'mbox', $mbox);
01749             set_time_limit(20);
01750             mfn_dmail_process_header($mbox, $header, $lastchkd);
01751           }
01752         }
01753       }
01754     }
01755     $imap->close();
01756     mfn_dmail_db_identity_update_lastchkd($identity->id, $lastchkd);
01757     drupal_set_message('Message headers for ' . $identity->name . ' have been retrieved.');
01758   }
01759   else {
01760     drupal_set_message('The identity record was not retrieved!', 'error');
01761   }
01762 }
01763 
01773 function mfn_dmail_process_mbox($identity, $mbox) {
01774   list(, $mbox_name) = explode('}', $mbox->name);
01775   if (empty($mbox_name)) {
01776     $mbox_name = $mbox->name;
01777   }
01778   $mbox_result = mfn_dmail_db_mbox_select_by_name($identity->id, $mbox_name);
01779   if ($mbox_result === FALSE) {
01780     mfn_dmail_db_mboxes_add($identity, $mbox);
01781   }
01782   else {
01783     mfn_dmail_db_mboxes_update($mbox_result->id, $mbox);
01784   }
01785 }
01786 
01799 function mfn_dmail_process_header($mbox, $header, $lastchkd) {
01800   mfn_dmail_debug(__FILE__, __LINE__, __FUNCTION__, 'header', $header);
01801   set_time_limit(20);
01802   $msgid = mfn_dmail_msgid($header);
01803   $message_header = mfn_dmail_db_message_header_select($msgid);
01804   $mbox_message_header = mfn_dmail_db_mbox_message_header_select($mbox->id, $msgid);
01805   $header->mbox_id = $mbox->id;
01806   $header->msgid = $msgid;
01807   if ($message_header === FALSE) {
01808     mfn_dmail_db_message_header_add($header);
01809   }
01810   else {
01811     mfn_dmail_db_message_header_update($header);
01812   }
01813   if ($mbox_message_header === FALSE) {
01814     $header->display = TRUE;
01815     mfn_dmail_db_mbox_message_header_add($header);
01816   }
01817   else {
01818     mfn_dmail_db_mbox_message_header_update($header);
01819   }
01820 }
01821 
01825 function mfn_dmail_refresh() {
01826   global $user;
01827   mfn_dmail_security_check();
01828   $identities = mfn_dmail_db_identities_select($user->uid);
01829   foreach ($identities as $identity) {
01830     mfn_dmail_refresh_check($identity);
01831   }
01832 }
01833 
01841 function mfn_dmail_refresh_check($identity) {
01842   $time = time();
01843   $refresh = FALSE;
01844   $checkevery = empty($identity->checkevery) ? 600 : $identity->checkevery;
01845   $semaphore = duvar_get('refreshSemaphore', FALSE);
01846   if ($semaphore) {
01847     if ($time - $semaphore > duvar_get('safeRefreshThreshold', $checkevery * 2)) {
01848       watchdog('dmail refresh', 'Refresh has been running %time seconds and may be stuck.', array('%time' => $checkevery * 2));
01849       duvar_del('refreshSemaphore');
01850     }
01851   }
01852   else {
01853     $last = strtotime($identity->lastchkd);
01854     if ($time - $last > $checkevery) {
01855       watchdog('dmail refresh', "@time @identity", array('@time' => date('H:i:s'), '@identity' => $identity->name));
01856       duvar_set('refreshSemaphore', $time);
01857       mfn_dmail_get_newmail($identity);
01858       duvar_del('refreshSemaphore');
01859     }
01860   }
01861 }
01862 
01870 function mfn_dmail_callback_director($form_state) {
01871   global $user;
01872   $args = arg();
01873   if (isset($args[4])) {
01874     $breadcrumbs[] = l(t('Email'), 'user/' . $user->uid . '/email/identities'); 
01875     drupal_set_breadcrumb($breadcrumbs);
01876     switch ($args[4]) {
01877       case 'edit': {
01878         drupal_set_title(t('Edit Identity'));
01879         return drupal_get_form('mfm_dmail_identities_edit', $args[3]);
01880       }
01881       case 'get': {
01882         drupal_set_title(t('Get Mail'));
01883         mfn_dmail_get_mail($args[3]);
01884         drupal_goto('user/' . $user->uid . '/email/identities');
01885       } break;
01886       case 'expunge': {
01887         drupal_set_title(t('Expunge'));
01888         mfn_dmail_expunge_mailboxes($args[3]);
01889         drupal_goto('user/' . $user->uid . '/email/identities');
01890       }
01891       case 'mailboxes': {
01892         drupal_set_title(t('Get Mailboxes'));
01893         mfn_dmail_get_mailboxes($args[3]);
01894         drupal_goto('user/' . $user->uid . '/email/identities');
01895       } break;
01896       case 'sanitize': {
01897         drupal_set_title(t('Sanitize'));
01898         mfn_dmail_sanitize_mailboxes($args[3]);
01899         drupal_goto('user/' . $user->uid . '/email/identities');
01900       }
01901       case 'remove': {
01902         drupal_set_title(t('Remove Identity'));
01903         mfn_dmail_remove_identity($args[3]);
01904         drupal_goto('user/' . $user->uid . '/email/identities');
01905       }
01906       case 'folders': {
01907         drupal_set_title(t('Folders'));
01908         return drupal_get_form('mfm_dmail_display_folders', $args[3]);
01909       } break;
01910       case 'compose': {
01911         drupal_set_title(t('Compose Message'));
01912         return drupal_get_form('mfm_dmail_compose_item', $args[3]);
01913       } break;
01914       case 'mbox': {
01915         $breadcrumbs[] = l(t('Folders'), 'user/' . $user->uid . '/email/' . $args[3] . '/folders'); 
01916         if (isset($args[6])) {
01917           $breadcrumbs[] = l(t('Mailbox Items'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5], mfn_dmail_orderby()); 
01918           drupal_set_breadcrumb($breadcrumbs);
01919           switch ($args[6]) {
01920             case 'recent': {
01921               drupal_set_title(t('Recent Items'));
01922               return drupal_get_form('mfn_dmail_display_recent', $args[5]);
01923             } break;
01924             case 'view': {
01925               drupal_set_title(t('View Item'));
01926               return drupal_get_form('mfm_dmail_display_item', $args[5], $args[7]);
01927             } break;
01928             case 'html': {
01929               drupal_set_title(t('View HTML'));
01930               return drupal_get_form('mfm_dmail_display_item', $args[5], $args[7], TRUE);
01931             }
01932             case 'delete': {
01933               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
01934               drupal_set_breadcrumb($breadcrumbs);
01935               drupal_set_title(t('Delete Item'));
01936               return drupal_get_form('mfm_dmail_delete_item', $args[7]);
01937             } break;
01938             case 'undelete': {
01939               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
01940               drupal_set_breadcrumb($breadcrumbs);
01941               drupal_set_title(t('Undelete Item'));
01942               return drupal_get_form('mfm_dmail_undelete_item', $args[7]);
01943             }
01944             case 'seen': {
01945               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
01946               drupal_set_breadcrumb($breadcrumbs);
01947               drupal_set_title(t('Flag Item as Seen'));
01948               return drupal_get_form('mfm_dmail_seen_item', $args[7]);
01949             }
01950             case 'unseen': {
01951               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
01952               drupal_set_breadcrumb($breadcrumbs);
01953               drupal_set_title(t('Flag Item as Not Seen'));
01954               return drupal_get_form('mfm_dmail_unseen_item', $args[7]);
01955             }
01956             case 'flag': {
01957               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
01958               drupal_set_breadcrumb($breadcrumbs);
01959               drupal_set_title(t('Flag Item Important'));
01960               return drupal_get_form('mfm_dmail_flag_item', $args[7]);
01961             }
01962             case 'unflag': {
01963               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
01964               drupal_set_breadcrumb($breadcrumbs);
01965               drupal_set_title(t('Flag Item Normal'));
01966               return drupal_get_form('mfm_dmail_unflag_item', $args[7]);
01967             }
01968             case 'copy': {
01969               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
01970               drupal_set_breadcrumb($breadcrumbs);
01971               drupal_set_title(t('Copy Item'));
01972               return drupal_get_form('mfm_dmail_copy_item', $args[7]);
01973             } break;
01974             case 'move': {
01975               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
01976               drupal_set_breadcrumb($breadcrumbs);
01977               drupal_set_title(t('Move Item'));
01978               return drupal_get_form('mfm_dmail_move_item', $args[7]);
01979             } break;
01980             case 'forward': {
01981               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
01982               drupal_set_breadcrumb($breadcrumbs);
01983               drupal_set_title(t('Forward Item'));
01984               return drupal_get_form('mfm_dmail_forward_item', $args[7]);
01985             } break;
01986             case 'junk': {
01987               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
01988               drupal_set_breadcrumb($breadcrumbs);
01989               drupal_set_title(t('Junk Item'));
01990               return drupal_get_form('mfm_dmail_junk_item', $args[7]);
01991             } break;
01992             case 'reply': {
01993               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
01994               drupal_set_breadcrumb($breadcrumbs);
01995               drupal_set_title(t('Reply'));
01996               return drupal_get_form('mfm_dmail_reply_item', $args[7]);
01997             } break;
01998             case 'replylist': {
01999               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
02000               drupal_set_breadcrumb($breadcrumbs);
02001               drupal_set_title(t('List Reply'));
02002               return drupal_get_form('mfm_dmail_replylist_item', $args[7]);
02003             } break;
02004             case 'replyall': {
02005               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
02006               drupal_set_breadcrumb($breadcrumbs);
02007               drupal_set_title(t('Reply All'));
02008               return drupal_get_form('mfm_dmail_replyall_item', $args[7]);
02009             } break;
02010             case 'replyto': {
02011               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
02012               drupal_set_breadcrumb($breadcrumbs);
02013               drupal_set_title(t('Reply To'));
02014               return drupal_get_form('mfm_dmail_replyto_item', $args[7], $args[8], $args[9]);
02015             } break;
02016             case 'friendly': {
02017               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
02018               drupal_set_breadcrumb($breadcrumbs);
02019               drupal_set_title(t('Friendly Address'));
02020               return drupal_get_form('mfm_dmail_friendly_addr', $args[8], $args[9]);
02021             } break;
02022             case 'unfriendly': {
02023               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
02024               drupal_set_breadcrumb($breadcrumbs);
02025               drupal_set_title(t('Unfriendly Address'));
02026               return drupal_get_form('mfm_dmail_unfriendly_addr', $args[8], $args[9]);
02027             } break;
02028             case 'send': {
02029               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
02030               drupal_set_breadcrumb($breadcrumbs);
02031               drupal_set_title(t('Send Mail'));
02032               return drupal_get_form('mfm_dmail_send_item', $args[8], $args[9]);
02033             } break;
02034             case 'attachment': {
02035               $breadcrumbs[] = l(t('Item'), 'user/' . $user->uid . '/email/' . $args[3] . '/mbox/' . $args[5] . '/view/' . $args[7]);
02036               drupal_set_breadcrumb($breadcrumbs);
02037               drupal_set_title(t('Attachment'));
02038               return drupal_get_form('mfm_dmail_attachment', $args[7], $args[8]);
02039             } break;
02040             case 'empty': {
02041               drupal_set_breadcrumb($breadcrumbs);
02042               drupal_set_title(t('Empty deleted items'));
02043               return drupal_get_form('mfm_dmail_empty_deleted', $args[5]);
02044             }
02045           }
02046         }
02047         else {
02048           drupal_set_title(t('Mailbox Items'));
02049           drupal_set_breadcrumb($breadcrumbs);
02050           return drupal_get_form('mfm_dmail_display_headers', $args[5]);
02051         }
02052       }
02053     }
02054   }
02055 }
02056 
02070 function mfn_dmail_transform_addr($type, $header) {
02071   global $user;
02072   $xform = array();
02073   $val = $header->$type;
02074   if (!is_array($val)) {
02075     $val = array($val);
02076   }
02077   foreach ($val as $el => $one) {
02078     list($name, $addr) = mfn_dmail_explode_addr($one);
02079     $xform[$el] = mfn_dmail_l('user/' . $user->uid . '/email/' . $header->identity_id . '/mbox/' . $header->mbox_id . '/send/' . $header->id . '/' . $name . '/' . $addr, $name, array('description' => 'Compose new mail to !name', 'data' => array('!name' => $name))) . " &lt;$addr&gt;";
02080   }
02081   return $xform;
02082 }
02083 
02087 function mfn_dmail_get_headerinfo($header) {
02088   $headerinfo = mfn_dmail_db_headerinfo_select($header->msgid);
02089   if ($headerinfo === FALSE) {
02090     $headerinfo = mfn_dmail_get_imap_headerinfo($header);
02091     mfn_dmail_db_headerinfo_add($headerinfo);
02092     $headerinfo = mfn_dmail_db_headerinfo_select($header->msgid);
02093   }
02094   return $headerinfo;
02095 }
02096 
02106 function mfn_dmail_get_imap_headerinfo($header) {
02107   global $imap;
02108   $headerinfo = $imap->fetchheader($header->msgno);
02109   watchdog('dmail debug', 'imap_headerinfo<pre>'.print_r($headerinfo,true).'</pre>');
02110   $lines = explode("\n", $headerinfo);
02111   $hlines = array();
02112   $lcnt = 0;
02113   foreach ($lines as $line) {
02114     $lcnt++;
02115     $ord = ord($line);
02116     watchdog('dmail ord', $lcnt . ': ' . $ord);
02117     if (in_array($ord, array(0, 9, 13, 32))) {
02118       watchdog('dmail ord', $lcnt . ': in array');
02119       $hlines[count($hlines) - 1] .= $line;
02120     }
02121     else {
02122       $hlines[] = $line;
02123     }
02124   }
02125   $headers = new stdClass;
02126   foreach ($hlines as $line) {
02127     list($key, $value) = explode(':', $line, 2);
02128     if (empty($key)) {
02129       drupal_set_message("Invalid message, please try again!", 'error');
02130       drupal_goto();
02131     }
02132     $key = strtolower(str_replace(array('-', ' '), '_', $key));
02133     $headers->$key = $value;
02134   }
02135   $headers->msgid = $header->msgid;
02136   watchdog('dmail debug', 'imap_headerinfo headers<pre>'.print_r($headers,true).'</pre>');
02137   watchdog('dmail debug', 'imap_headerinfo lines<pre>'.print_r($lines,true).'<pre>');
02138   watchdog('dmail debug', 'imap_headerinfo hlines<pre>'.print_r($hlines,true).'<pre>');
02139   return $headers;
02140 }
02141 
02163 function mfn_dmail_options_addr($type, $header, $has_html = FALSE, $address = 0, $html = FALSE) {
02164   global $user;
02165   $args = arg();
02166   $urlf = 'user/' . $user->uid . '/email/' . $header->identity_id . '/mbox/' . $header->mbox_id;
02167   switch ($type) {
02168     case 'options': {
02169       $headers = mfn_dmail_db_mbox_message_headers_select_ordered($header->mbox_id);
02170       $urlt = $header->id;
02171       $out = NULL;
02172       $attr = array();
02173       $orderby = mfn_dmail_orderby();
02174       if ($header->prev_id !== NULL) {
02175         $prev_header_id = $headers[$header->prev_id]->id;
02176         $out .= mfn_dmail_l($urlf . '/' . $args[6] . '/' . $prev_header_id, 'Prev', 'View the previous item.', $attr, $orderby, array('type' => 'action', 'file' => 'prev.png')) . ' | ';
02177       }
02178       if ($header->next_id !== NULL) {
02179         $next_header_id = $headers[$header->next_id]->id;
02180         $out .= mfn_dmail_l($urlf . '/' . $args[6] . '/' . $next_header_id, 'Next', 'View the next item.', $attr, $orderby, array('type' => 'action', 'file' => 'next.png')) . ' | ';
02181       }
02182       if (isset($header->list_id)) {
02183         $out .= mfn_dmail_l($urlf . '/replylist/' . $urlt, 'List Reply', 'Reply to the list address about this item.', $attr, $orderby, array('type' => 'action', 'file' => 'replylist.png')) . ' | ';
02184       }
02185       else {
02186         $out .= mfn_dmail_l($urlf . '/reply/' . $urlt, 'Reply', 'Reply about this item.', $attr, $orderby, array('type' => 'action', 'file' => 'reply.png')) . ' | ';
02187       }
02188       $out .= mfn_dmail_l($urlf . '/replyall/' . $urlt, 'Reply All', 'Reply to every address about this item.', $attr, $orderby, array('type' => 'action', 'file' => 'replyall.png')) . ' | ';
02189       $out .= mfn_dmail_l($urlf . '/forward/' . $urlt, 'Forward', 'Forward this item to another mailbox.', $attr, $orderby, array('type' => 'action', 'file' => 'forward.png')) . ' | ';
02190       if (mfn_dmail_is_junk($header->message_id)) {
02191         $out .= mfn_dmail_l($urlf . '/unjunk/' . $urlt, 'Unjunk', 'Identify this item as not Junk (i.e. not SPAM).', $attr, $orderby, array('type' => 'aciton', 'file' => 'unjunk.png')) . ' | ';
02192       }
02193       else {
02194         $out .= mfn_dmail_l($urlf . '/junk/' . $urlt, 'Junk', 'Identify this item as Junk (i.e. SPAM).', $attr, $orderby, array('type' => 'action', 'file' => 'junk.png')) . ' | ';
02195       }
02196       if ($header->deleted) {
02197         $out .= mfn_dmail_l($urlf . '/undelete/' . $urlt, 'Undelete', 'Flag this item as undeleted.', $attr, $orderby, array('type' => 'action', 'file' => 'undelete.png')) . ' | ';
02198       }
02199       else {
02200         $out .= mfn_dmail_l($urlf . '/delete/' . $urlt, 'Delete', 'Flag this item as deleted.', $attr, $orderby, array('type' => 'action', 'file' => 'delete.png')) . ' | ';
02201       }
02202       if ($header->flagged) {
02203         $out .= mfn_dmail_l($urlf . '/unflag/' . $urlt, 'Normal', 'Flag this item as unimportant.', $attr, $orderby, array('type' => 'action', 'file' => 'unimportant.png')) . ' | ';
02204       }
02205       else {
02206         $out .= mfn_dmail_l($urlf . '/flag/' . $urlt, 'Important', 'Flag this item as important.', $attr, $orderby, array('type' => 'action', 'file' => 'important.png')) . ' | ';
02207       }
02208       if ($header->seen) {
02209         $out .= mfn_dmail_l($urlf . '/unseen/' . $urlt, 'Unseen', 'Flag this item as unread.', $attr, $orderby, array('type' => 'action', 'file' => 'flag_unseen.png')) . ' | ';
02210       }
02211       else {
02212         $out .= mfn_dmail_l($urlf . '/seen/' . $urlt, 'Seen', 'Flag this item as read.', $attr, $orderby, array('type' => 'action', 'file' => 'flag_seen.png')) . ' | ';
02213       }
02214       $out .= mfn_dmail_l($urlf . '/copy/' . $urlt, 'Copy', 'Copy this item to another folder.', $attr, $orderby, array('type' => 'action', 'file' => 'copy.png')) . ' | ';
02215       $out .= mfn_dmail_l($urlf . '/move/' . $urlt, 'Move', 'Move this item to another folder.', $attr, $orderby, array('type' => 'action', 'file' => 'move.png')) . ' | ';
02216       if ($html) {
02217         $out .= mfn_dmail_l($urlf . '/view/' . $urlt, 'View PLAIN', 'View the plain text version of this email.', $attr, $orderby, array('type' => 'mime', 'file' => 'text.png')) . ' | ';
02218       }
02219       else {
02220         if ($has_html) {
02221           $out .= mfn_dmail_l($urlf . '/html/' . $urlt, 'View HTML', 'View the HTML version of this email.', $attr, $orderby, array('type' => 'mime', 'file' => 'html.png')) . ' | ';
02222         }
02223       }
02224       if (mfn_dmail_access($user->uid, DMAIL_POST_ROLE)) {
02225         $out .= mfn_dmail_l($urlf . '/post/' . $urlt, 'Post', 'Post this message to Drupal.', $attributes, $orderby, array('type' => 'action', 'file' => 'post.png')) . ' | ';
02226       }
02227       $return = $out;
02228     } break;
02229     case 'list options': {
02230       if (isset($header->list_id)) {
02231         $return = 'I need to program the list options.';
02232       }
02233     } break;
02234     default: {
02235       $addresses = $header->$type;
02236       if (!is_array($addresses)) {
02237         $addresses = array($addresses);
02238       }
02239       $address = $addresses[$address];
02240       list($name, $addr) = explode('<', $address);
02241       if (empty($addr)) {
02242         $addr = $name;
02243         $name = NULL;
02244       }
02245       else {
02246         list($addr) = explode('>', $addr);
02247       }
02248       if (empty($name)) {
02249         list($name) = explode('@', $addr);
02250         $name = strtoupper($name);
02251       }
02252       $name = check_plain(trim($name));
02253       $addr = check_plain(trim($addr));
02254       $urlt = $header->id . '/' . $name . '/' . $addr;
02255       if (mfn_dmail_is_friendly($addr)) {
02256         $friendly = mfn_dmail_l($urlf . '/unfriendly/' . $urlt, 'Unfriendly', 'This address is NOT friendly.  Used by the junk mail control to indicate that mail from this address may contain SPAM.', $attr, $orderby, array('type' => 'action', 'file' => 'unfriendly.png')) . ' | ';
02257       }
02258       else {
02259         $friendly = mfn_dmail_l($urlf . '/friendly/' . $urlt, 'Friendly', 'This address is friendly.  Used by the junk mail control to indicate that mail from this address is likely not to be SPAM.', $attr, $orderby, array('type' => 'action', 'file' => 'friendly.png')) . ' | ';
02260       }
02261       $replyto = mfn_dmail_l($urlf . '/replyto/' . $urlt, 'Reply', 'Reply about this email to this address.', $attr, $orderby, array('type' => 'action', 'file' => 'replyto.png'));
02262       $return = $friendly . $replyto;
02263     } break;
02264   }
02265   return $return;
02266 }
02267 
02275 function mfn_dmail_preprocess_mboxes($identity) {
02276   $mboxes = mfn_dmail_db_mboxes_select($identity->id);
02277   foreach ($mboxes as $mbox) {
02278     mfn_dmail_preprocess_headers($mbox);
02279     mfn_dmail_db_mbox_delete($mbox->id);
02280   }
02281 }
02282 
02290 function mfn_dmail_preprocess_headers($mbox) {
02291   $headers = mfn_dmail_db_headers_select($mbox->id);
02292   foreach ($headers as $header) {
02293     mfn_dmail_db_header_delete($header->id);
02294   }
02295 }
02296 
02303 function mfn_dmail_check_mail($identity) {
02304   if (empty($identity->checkevery)) {
02305     $identity->checkevery = 600;
02306   }
02307   if ($identity->lastchkd == '0000-00-00 00:00:00' || time() - strtotime($identity->lastchkd) >= $identity->checkevery) {
02308     mfn_dmail_get_mail($identity->id);
02309   }
02310 }
02311 
02324 function mfn_dmail_decode_str($str, $charset = 'UTF-8') {
02325   $return = NULL;
02326   $lastchr = strlen($str) - 1;
02327   if ($str[$lastchr] === '=' && $str[$lastchr - 1] === '=') {
02328     $tstr = base64_decode($str);
02329     if ($str !== FALSE) {
02330       $str = $tstr;
02331     }
02332   }
02333   if ($str[0] === '=' && $str[1] === '?' && $str[$lastchr] === '=' && $str[$lastchr - 1] === '?') {
02334     $tstr = imap_utf8($str);
02335     if ($tstr !== FALSE) {
02336       $str = $tstr;
02337     }
02338   }
02339   $elem = imap_mime_header_decode($str);
02340 
02341   foreach ($elem as $e) {
02342     if ($e->charset == 'default') {
02343       $e->charset = 'iso-8859-1';
02344     }
02345 
02346     $return .= iconv($e->charset, $charset, $e->text);
02347   }
02348 
02349   return $return;
02350 }
02351 
02361 function mfn_dmail_encrypt($str) {
02362   $crypt = mcrypt_module_open(MCRYPT_3DES, NULL, MCRYPT_MODE_CBC, NULL);
02363   $ret[0] = mcrypt_create_iv(mcrypt_enc_get_iv_size($crypt), MCRYPT_RAND);
02364   $ret[1] = mcrypt_enc_get_key_size($crypt);
02365   $ret[2] = date("D.M.j.G.i.s.T.Y");
02366   $key = substr(md5($ret[0] . $ret[2]), 0, $ret[1]);
02367   mcrypt_generic_init($crypt, $key, $ret[0]);
02368   $ret[3] = mcrypt_generic($crypt, $str);
02369   mcrypt_generic_deinit($crypt);
02370   mcrypt_module_close($crypt);
02371   return base64_encode(gzcompress(serialize($ret)));
02372 }
02373 
02383 function mfn_dmail_decrypt($str) {
02384   if (mfn_dmail_is_encoded($str)) {
02385     $str = unserialize(gzuncompress(base64_decode($str)));
02386     $crypt = mcrypt_module_open(MCRYPT_3DES, NULL, MCRYPT_MODE_CBC, NULL);
02387     $key = substr(md5($str[0] . $str[2]), 0, $str[1]);
02388     mcrypt_generic_init($crypt, $key, $str[0]);
02389     $ret = mdecrypt_generic($crypt, $str[3]);
02390     mcrypt_generic_deinit($crypt);
02391     mcrypt_module_close($crypt);
02392   }
02393   else {
02394     $ret = $str;
02395   }
02396   return $ret;
02397 }
02398 
02408 function mfn_dmail_is_encoded($str) {
02409     $str = @gzuncompress(@base64_decode($str));
02410     $parts = explode(':', $str);
02411     return $parts[0] === 'a' && $parts[1] == 4; 
02412 }
02413 
02434 function mfn_dmail_format_body($body, $length = 75, $linebreak = "\n", $cut_long = TRUE) {
02435   $paras = explode("\r\n\r\n", $body);
02436   foreach ($paras as $k1 => $para) {
02437     $lines = explode("\n", $para);
02438     foreach ($lines as $k2 => $line) {
02439       $lines[$k2] = mfn_dmail_format_line($line, $length);
02440     }
02441     $paras[$k1] = '<p>' . implode("\r\n", $lines) . '</p>';
02442     if (trim($paras[$k1]) == '<p><br/></p>') {
02443       unset($paras[$k1]);
02444     }
02445   }
02446   return mfn_dmail_format_body_clickable(implode("\r\n", $paras));
02447 }
02448 
02458 function mfn_dmail_format_attachments($attachments) {
02459   if (!is_array($attachments)) {
02460     return;
02461   }
02462 
02463   $args = arg();
02464   $urlf = $args[0]
02465         . '/' . $args[1]
02466         . '/' . $args[2]
02467         . '/' . $args[3]
02468         . '/' . $args[4]
02469         . '/' . $args[5]
02470         . '/' . 'attachment'
02471         . '/' . $args[7]
02472         ;
02473   $ret = NULL;
02474 
02475   foreach ($attachments as $item => $attachment) {
02476     if ($ret) {
02477       $ret .= ' | ';
02478     }
02479     $ret .= mfn_dmail_l(array(
02480       'url' => "$urlf/$item", 
02481       'title' => $attachment->name,
02482       'description' => $attachment->filename,
02483       'image' => array('type' => 'mime', 'file' => 'attachment.png', 'position' => 'prefix'),
02484     ));
02485   }
02486   if ($ret) {
02487     $ret = t('Attached: ') . $ret;
02488   }
02489   return $ret;
02490 }
02491 
02506 function mfn_dmail_format_line($line, $length = 75) {
02507   $ret = wordwrap($line, $length, '<br/>', FALSE);
02508   $ret .= '<br/>';
02509   return $ret;
02510 }
02511 
02521 function mfn_dmail_format_body_clickable($text) { 
02522   $args = arg();
02523 
02524   // Copied from http://jmrware.com/articles/2010/linkifyurl/linkify.html
02525   // Released as open source under the MIT License
02526   //   http://www.opensource.org/licenses/mit-license.php
02527   $url_pattern = '/# Rev:20100913_0900 github.com\/jmrware\/LinkifyURL
02528 # Match http & ftp URL that is not already linkified.
02529     # Alternative 1: URL delimited by (parentheses).
02530     (\()                     # $1  "(" start delimiter.
02531     ((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]+)  # $2: URL.
02532     (\))                     # $3: ")" end delimiter.
02533   | # Alternative 2: URL delimited by [square brackets].
02534     (\[)                     # $4: "[" start delimiter.
02535     ((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]+)  # $5: URL.
02536     (\])                     # $6: "]" end delimiter.
02537   | # Alternative 3: URL delimited by {curly braces}.
02538     (\{)                     # $7: "{" start delimiter.
02539     ((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]+)  # $8: URL.
02540     (\})                     # $9: "}" end delimiter.
02541   | # Alternative 4: URL delimited by <angle brackets>.
02542     (<|&(?:lt|\#60|\#x3c);)  # $10: "<" start delimiter (or HTML entity).
02543     ((?:ht|f)tps?:\/\/[a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]+)  # $11: URL.
02544     (>|&(?:gt|\#62|\#x3e);)  # $12: ">" end delimiter (or HTML entity).
02545   | # Alternative 5: URL not delimited by (), [], {} or <>.
02546     (                        # $13: Prefix proving URL not already linked.
02547       (?: ^                  # Can be a beginning of line or string, or
02548       | [^=\s\'"\]]          # a non-"=", non-quote, non-"]", followed by
02549       ) \s*[\'"]?            # optional whitespace and optional quote;
02550     | [^=\s]\s+              # or... a non-equals sign followed by whitespace.
02551     )                        # End $13. Non-prelinkified-proof prefix.
02552     ( \b                     # $14: Other non-delimited URL.
02553       (?:ht|f)tps?:\/\/      # Required literal http, https, ftp or ftps prefix.
02554       [a-z0-9\-._~!$\'()*+,;=:\/?#[\]@%]+ # All URI chars except "&" (normal*).
02555       (?:                    # Either on a "&" or at the end of URI.
02556         (?!                  # Allow a "&" char only if not start of an...
02557           &(?:gt|\#0*62|\#x0*3e);                  # HTML ">" entity, or
02558         | &(?:amp|apos|quot|\#0*3[49]|\#x0*2[27]); # a [&\'"] entity if
02559           [.!&\',:?;]?        # followed by optional punctuation then
02560           (?:[^a-z0-9\-._~!$&\'()*+,;=:\/?#[\]@%]|$)  # a non-URI char or EOS.
02561         ) &                  # If neg-assertion true, match "&" (special).
02562         [a-z0-9\-._~!$\'()*+,;=:\/?#[\]@%]* # More non-& URI chars (normal*).
02563       )*                     # Unroll-the-loop (special normal*)*.
02564       [a-z0-9\-_~$()*+=\/#[\]@%]  # Last char can\'t be [.!&\',;:?]
02565     )                        # End $14. Other non-delimited URL.
02566   /imx';
02567   $url_replace = '$1$4$7$10$13<a href="$2$5$8$11$14" target="_dmail_link">$2$5$8$11$14</a>$3$6$9$12';
02568 
02569   $text= preg_replace($url_pattern, $url_replace, $text);
02570 
02571   $text= preg_replace("/([a-z0-9&\-_\.]+?)@([\w\-]+\.([\w\-\.]+)+)((\?*)(subject=)*([a-zA-Z0-9\-_\.]*))/i", "<a href=\"/user/{$args[1]}/email/{$args[3]}/mbox/{$args[5]}/send/{$args[7]}//$1@$2/$7\" target=\"_dmail_link\" >$1@$2$4</a>", $text);
02572   return $text; 
02573 }
02574 
02586 function mfn_dmail_is_junk($message_id) {
02587   $junk = mfn_dmail_db_junk_message_select(md5($message_id));
02588   return $junk !== FALSE;
02589 }
02590 
02599 function mfn_dmail_expunge_mailboxes($identity_id) {
02600   global $imap;
02601   $identity = mfn_dmail_db_identity_select($identity_id);
02602   if ($identity->readonly) {
02603     drupal_set_message(t('Expunge operation cannot be performed in readonly mode.'), 'error');
02604     return;
02605   }
02606 }
02607 
02616 function mfn_dmail_sanitize_mailboxes($identity_id) {
02617   global $imap;
02618   $identity = mfn_dmail_db_identity_select($identity_id);
02619   if ($identity->readonly) {
02620     drupal_set_message(t('Sanitize operation cannot be performed in readonly mode.'), 'error');
02621     return;
02622   }
02623   $mboxes = mfn_dmail_db_mboxes_select($identity_id);
02624   foreach ($mboxes as $mbox) {
02625     mfn_dmail_imap_open($identity, $mbox->name);
02626   }
02627 }
02628 
02638 function mfn_dmail_xform_header(&$header, $headerinfo) {
02639   foreach ((array)$headerinfo->headers as $key => $val) {
02640     if (!isset($header->$key)) {
02641       $header->$key = $val;
02642     }
02643     else {
02644       switch ($key) {
02645         case 'cc':
02646         case 'to': {
02647           // @todo - Need to modify the formatting code for multiple addresses.
02648           $header->$key = explode(',', $val);
02649         } break;
02650       }
02651     }
02652   }
02653 }
02654 
02666 function mfn_dmail_is_friendly($address) {
02667   return FALSE;
02668 }
02669 
02683 function mfn_dmail_reply_from($header) {
02684   $identities = mfn_dmail_db_identities_select();
02685   $from = array();
02686   $mapped = mfn_dmail_addrmap(trim($header->delivered_to));
02687   if ($mapped !== trim($header->delivered_to)) {
02688     $from[] = $mapped;
02689   }
02690   if (!in_array(trim($header->delivered_to), $from)) {
02691     if (isset($header->delivered_to)) {
02692       $from[] = trim($header->delivered_to);
02693     }
02694     else {
02695       $from[] = mfn_dmail_addrmap(trim($header->to[0]));
02696     }
02697   }
02698   foreach ($identities as $identity) {
02699     $mapped = mfn_dmail_addrmap($identity->user);
02700     if ($mapped !== $identity->user && !in_array($mapped, $from)) {
02701       $from[] = $mapped;
02702     }
02703     if (!in_array($identity->user, $from)) {
02704       $from[] = $identity->user;
02705     }
02706   }
02707   return $from;
02708 }
02709 
02720 function mfn_dmail_addrmap($addr) {
02721   $map = mfn_dmail_db_addrmap_select($addr);
02722   if ($map === FALSE) {
02723     return $addr;
02724   }
02725   else {
02726     return $map->preferred;
02727   }
02728 }
02729 
02730 
02743 function mfn_dmail_reply_to($type, $header) {
02744   $ret = array();
02745   switch ($type) {
02746     case 'replylist': {
02747       if (isset($header->list_post)) {
02748         $lpostitems = explode(',', $header->list_post);
02749         foreach ($lpostitems as $lpostitem) {
02750           $lpostitem = trim($lpostitem);
02751           $lpostitem[0] = ' ';
02752           $lpostitem[strlen($lpostitem) - 1] = ' ';
02753           $lpostitem = trim($lpostitem);
02754           list($m, $addr) = explode(':', $lpostitem);
02755           if ($m == 'mailto') {
02756             break;
02757           }
02758         }
02759       }
02760       else {
02761         $addr = 'No post to this list permitted.';
02762       }
02763       list($name, ) = explode('<', $header->list_id);
02764       $cl = new stdClass;
02765       $cl->hval = 'to';
02766       $cl->recipient = trim($name) . ' <' . $addr . '>';
02767       $ret[] = $cl;
02768       $cl = new stdClass;
02769       $cl->hval = 'rt';
02770       $cl->recipient = trim($name) . ' <' . $addr . '>';
02771       $ret[] = $cl;
02772     } break;
02773     case 'reply': {
02774       $ret[] = mfn_dmail_mail_address_object('to', $header->reply_to ? $header->reply_to : $header->from);
02775     } break;
02776     case 'replyall': {
02777       if ($header->reply_to) {
02778         $ret[] = mfn_dmail_mail_address_object('to', $header->reply_to);
02779         $ret[] = mfn_dmail_mail_address_object('cc', $header->from);
02780       }
02781       else {
02782         $ret[] = mfn_dmail_mail_address_object('to', $header->from);
02783       }
02784       if (is_array($header->to)) {
02785         foreach ($header->to as $addr) {
02786           $ret[] = mfn_dmail_mail_address_object('cc', $addr);
02787         }
02788       }
02789       else {
02790         $ret[] = mfn_dmail_mail_address_object('cc', $header->to);
02791       }
02792       if ($header->cc) {
02793         if (is_array($header->cc)) {
02794           foreach ($header->cc as $addr) {
02795             $ret[] = mfn_dmail_mail_address_object('cc', $addr);
02796           }
02797         }
02798         else {
02799           $ret[] = mfn_dmail_mail_address_object('cc', $header->cc);
02800         }
02801       }
02802     } break;
02803     case 'replyto': {
02804     } break;
02805   }
02806   return $ret;
02807 }
02808 
02824 function mfn_dmail_mail_address_object($hval, $addr) {
02825   $obj = new stdClass;
02826   list ($name, ) = explode('<', $addr);
02827   if (empty($name)) {
02828     list($name, ) = explode('@', $addr);
02829     $mail = $addr;
02830   }
02831   else {
02832     list(, $mail) = explode('<', $addr);
02833     $mail = substr($mail, 0, -1);
02834   }
02835   $obj->hval = $hval;
02836   $obj->recipient = trim($name) . ' <' . $mail . '>';
02837   return $obj;
02838 }
02839 
02849 function mfn_dmail_reply_subject($header) {
02850   $subject = trim($header->subject);
02851   if (isset($header->in_reply_to)) {
02852     $ret = $subject;
02853   }
02854   else {
02855     $ret = "Re: $subject";
02856   }
02857   return trim($ret);
02858 }
02859 
02873 function mfn_dmail_reply_body($header, $wrap_width = 72) {
02874   $item = dcache_get(array('form', 'item'), DCACHE_SESSION);
02875   $ret = NULL;
02876   if ($item['header_id'] === $header->id) {
02877     $lines = explode("\n", $item['bodyplain']);
02878     foreach ($lines as $key => $line) {
02879       $lastchr = strlen($line) - 1;
02880       if ($line[$lastchr] === "\r") {
02881         $line = substr($line, 0, $lastchr);
02882       }
02883       if ($line[0] == '>') {
02884         $lines[$key] = mfn_dmail_wordwrap(">$line", $wrap_width);
02885       }
02886       else {
02887         $lines[$key] = mfn_dmail_wordwrap("> $line", $wrap_width);
02888       }
02889     }
02890     array_unshift($lines, '');
02891     list($name) = mfn_dmail_explode_addr($header->from);
02892     $t = t('---In response to message sent by !name---', array('!name' => $name));
02893     array_unshift($lines, $t);
02894     $ret = implode("\r\n", $lines);
02895     $ret .= "\r\n\r\n";
02896     $ret .= mfn_dmail_signature($item['identity_id']);
02897   }
02898   else {
02899     exit;
02900   }
02901   return $ret;
02902 }
02903 
02919 function mfn_dmail_wordwrap($str, $wrap_width = 72) {
02920   if (strlen($str) > $wrap_width) {
02921     $i = 0;
02922     while ($str[$i] === '>') {
02923       $i++;
02924     }
02925     $quote = substr($str, 0, $i);
02926     $tstr = wordwrap($str, $wrap_width, "\n");
02927     $tlines = explode("\n", $tstr);
02928     $fline = array_shift($tlines);
02929     foreach ($tlines as $tkey => $tline) {
02930       $tlines[$tkey] = "$quote $tline";
02931     }
02932     array_unshift($tlines, $fline);
02933     $str = implode("\r\n", $tlines);
02934   }
02935   return $str;
02936 }
02937 
02948 function mfn_dmail_explode_addr($string) {
02949   $string = mfn_dmail_decode_str($string);
02950   list($name, $addr) = explode('<', $string);
02951   if (empty($addr)) {
02952     $addr = $name;
02953     $name = NULL;
02954   }
02955   else {
02956     list($addr) = explode('>', $addr);
02957   }
02958   if (empty($name)) {
02959     list($name, $host) = explode('@', $addr);
02960     $name = strtoupper($name);
02961     if (empty($host)) {
02962       $addr = "$addr@.invalid.addr";
02963     }
02964   }
02965   $name = mfn_dmail_check_string(trim($name));
02966   $addr = check_plain(trim($addr));
02967   return array($name, $addr);
02968 }
02969 
02979 function mfn_dmail_signature($identity_id) {
02980   $ret = NULL;
02981   $identity = mfn_dmail_db_identity_select($identity_id);
02982   if ($identity->signature_id) {
02983     $signature = mfn_dmail_db_signature_select($identity->signature_id);
02984     if ($signature !== FALSE) {
02985       $ret = $signature->signature;
02986     }
02987   }
02988   return $ret;
02989 }
02990 
03001 function mfn_dmail_readonly_check($set_message = TRUE) {
03002   $identity = mfn_dmail_db_identity_select(arg(3));
03003   if ($identity->readonly) {
03004     if ($set_message === TRUE) {
03005       drupal_set_message(t('This identity is set to read only!'), 'warning', FALSE);
03006     }
03007     elseif ($set_message) {
03008       drupal_set_message($set_message, 'error', FALSE);
03009     }
03010     return TRUE;
03011   }
03012   return FALSE;
03013 }
03014 
03018 function mfn_dmail_items_list_header() {
03019   return array(
03020     array('data' => t('##'), 'field' => 'msgno'),
03021     array('data' => t('Received'), 'field' => 'date'),
03022     array('data' => t('From'), 'field' => 'from'),
03023     array('data' => t('Subject'), 'field' => 'subject'),
03024     t('Operations'),
03025   );
03026 }
All Data Structures Files Functions Variables Enumerations