DMail Milestone 1.0
Drupal Mail Client
|
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) . ' ' . $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' => ' ', 00666 ); 00667 $form['dmail']['headers']['received'][$header->id] = array( 00668 '#value' => $header->date, 00669 '#prefix' => ' ' . $bspan, 00670 '#suffix' => ' ' . $espan, 00671 ); 00672 $form['dmail']['headers']['from'][$header->id] = array( 00673 '#value' => mfn_dmail_decode_str($header->from), 00674 '#prefix' => ' ' . $bspan, 00675 '#suffix' => ' ' . $espan, 00676 ); 00677 $form['dmail']['headers']['subject'][$header->id] = array( 00678 '#value' => mfn_dmail_decode_str($header->subject), 00679 '#prefix' => ' ' . $bspan, 00680 '#suffix' => ' ' . $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' => ' ' . $bspan, 00747 '#suffix' => ' ' . $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 = ' &'; 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 = ' &'; 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 <$address> 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 <$address> 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 <$address> 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 <$address>", 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))) . " <$addr>"; 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 }