'textfield',
'#title' => t('E-mail address'),
'#default_value' => $edit['mail'],
'#description' => t('The e-mail address to which users should send their submissions.'),
'#required' => TRUE,
);
$form['mailto'] = array(
'#type' => 'textfield',
'#title' => t('Second E-mail address'),
'#default_value' => $edit['mailto'],
'#description' => t('Optional. The e-mail address to which modules should send generated content.'),
);
$form['folder'] = array(
'#type' => 'textfield',
'#title' => t('Folder'),
'#default_value' => $edit['folder'],
'#description' => t('Optional. The folder where the mail is stored. If you want this mailbox to read from a local folder, give the full path. Leave domain, port, name, and pass empty below. Remember to set the folder to readable and writable by the webserver.'),
);
$form['imap'] = array(
'#type' => 'select',
'#title' => t('POP3 or IMAP Mailbox'),
'#options' => array('POP3', 'IMAP'),
'#default_value' => $edit['imap'],
'#description' => t('If you wish to retrieve mail from a POP3 or IMAP mailbox instead of a Folder, select POP3 or IMAP. Also, complete the Mailbox items below.'),
);
$form['domain'] = array(
'#type' => 'textfield',
'#title' => t('Mailbox domain'),
'#default_value' => $edit['domain'],
'#description' => t('The domain of the server used to collect mail.'),
);
$form['port'] = array(
'#type' => 'textfield',
'#title' => t('Mailbox port'),
'#size' => 5, '#maxlength' => 5,
'#default_value' => $edit['port'],
'#description' => t('The port of the mailbox used to collect mail (usually 110 for POP3, 143 for IMAP).'),
);
$form['name'] = array(
'#type' => 'textfield',
'#title' => t('Mailbox username'),
'#default_value' => $edit['name'],
'#description' => t('This username is used while logging into this mailbox during mail retrieval.'),
);
$form['pass'] = array(
'#type' => 'textfield',
'#title' => t('Mailbox password'),
'#default_value' => $edit['pass'],
'#description' => t('The password corresponding to the username above. Consider using a non-vital password, since this field is stored without encryption in the database.'),
);
// Allow administrators to configure the mailbox with extra IMAP commands (notls, novalidate-cert etc.)
$form['extraimap'] = array(
'#type' => 'textfield',
'#title' => t('Extra commands'),
'#default_value' => $edit['extraimap'],
'#description' => t('Optional. In some circumstances you need to issue extra commands to connect to your mail server (e.g. "/notls", "/novalidate-cert" etc.). See documentation for imap_open. Begin the string with a "/", separating each subsequent command with another "/".'),
);
$form['mime'] = array(
'#type' => 'select',
'#title' => t('Mime preference'),
'#options' => array(
'TEXT/HTML,TEXT/PLAIN' => 'HTML',
'TEXT/PLAIN,TEXT/HTML' => t('Plain text'),
),
'#default_value' => $edit['mime'],
'#description' => t('When a user sends an e-mail containing both HTML and plain text parts, use this part as the node body.'),
);
$form['security'] = array(
'#type' => 'radios',
'#title' => t('Security'),
'#options' => array(t('Disabled'), t('Require password')),
'#default_value' => isset($edit['security']) ? $edit['security'] : 0,
'#description' => t('Disable security if your site does not require a password in the Commands section of incoming e-mails. Note: Security=Enabled and Mime preference=HTML is an unsupported combination.')
);
$form['replies'] = array('#type' => 'radios', '#title' => t('Send error replies'), '#options' => array(t('Disabled'), t('Enabled')), '#default_value' => $edit['replies'], '#description' => t('Send helpful replies to all unsuccessful e-mail submissions. Consider disabling when a listserv posts to this mailbox.'));
$form['fromheader'] = array('#type' => 'textfield', '#title' => t('From header'), '#default_value' => $edit['fromheader'], '#description' => t('Use this e-mail header to determine the author of the resulting node. Admins usually leave this field blank (thus using the From header), but Sender is also useful when working with listservs.'));
$form['commands'] = array('#type' => 'textarea', '#title' => t('Default commands'), '#default_value' => $edit['commands'], '#description' => t('A set of commands which are added to each message. One command per line. See Commands.', array('@link' => url('admin/help/mailhandler/#commands'))));
$form['sigseparator'] = array('#type' => 'textfield', '#title' => t('Signature separator'), '#default_value' => $edit['sigseparator'], '#description' => t('All text after this string will be discarded. A typical value is "-- " that is two dashes followed by a blank in an otherwise empty line. Leave blank to include signature text in nodes.'));
$form['delete_after_read'] = array('#type' => 'checkbox', '#title' => t('Delete messages after they are processed?'), '#default_value' => $edit['delete_after_read'], '#description' => t('Uncheck this box to leave read messages in the mailbox. They will not be processed again unless they become marked as unread.'));
$form['enabled'] = array('#type' => 'radios', '#title' => t('Cron processing'), '#options' => array(t('Disabled'), t('Enabled')), '#default_value' => $edit['enabled'], '#description' => t('Select disable to temporarily stop cron processing for this mailbox.'));
// Allow administrators to select the format of saved nodes/comments
$form['format'] = filter_form($edit['format']);
$form['actions'] = array('#prefix' => '
', '#suffix' => '
');
$form['mid'] = array(
'#type' => 'hidden',
'#value' => $mid,
);
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t('Save mailbox'),
);
$form['actions']['test'] = array(
'#type' => 'submit',
'#value' => t('Test connection'),
);
if ($mid) {
$form['actions']['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete mailbox'),
'#submit' => array('mailhandler_delete_mailbox_submit'),
'#validate' => array(),
);
}
$form['actions']['cancel'] = array(
'#value' => l(t('Cancel'), 'admin/content/mailhandler'),
);
return $form;
}
/**
* Verify that the Mailbox is valid, and save it to the database.
*/
function mailhandler_add_edit_mailbox_validate($form, &$form_state) {
// Check for valid email address
if ($error = user_validate_mail($form_state['values']['mail'])) {
form_set_error('mail', $error);
}
if ($form_state['values']['mailto'] && ($error = user_validate_mail($form_state['values']['mailto']))) {
form_set_error('mailto', $error);
}
// Test POP/IMAP settings, and store result
$mailbox_appears_ok = TRUE;
if ($form_state['values']['domain'] && $form_state['values']['port'] && !is_numeric($form_state['values']['port'])) { // assume external mailbox
form_set_error('port', t('Mailbox port must be an integer.'));
$mailbox_appears_ok = FALSE;
}
if (!$form_state['values']['domain'] && !$form_state['values']['port'] && $form_state['values']['folder']) { // assume local folder
// check read and write permission
if (!is_readable($form_state['values']['folder']) || !is_writable($form_state['values']['folder'])) {
form_set_error('port', t('The local folder has to be readable and writable by owner of the webserver process, e.g. nobody.'));
$mailbox_appears_ok = FALSE;
}
}
// Test POP/IMAP settings are valid in all cases, and test connection if requested
if ($mailbox_appears_ok && $form_state['clicked_button']['#value'] == t('Test connection')) {
// Call the test function
mailhandler_test_mailbox($form_state);
// We don't want to save, so we set an 'invisible error' that means the form is not submitted
form_set_error('mailhandler');
}
}
/**
* Save a mailbox to the database - determine whether adding or editing by checking for a mailbox id (mid)
*/
function mailhandler_add_edit_mailbox_submit($form, &$form_state) {
// TODO: try to rewrite these monsters wth drupal_write_record();
if ($form_state['values']['mid']) {
db_query("UPDATE {mailhandler} SET mail = '%s', mailto = '%s', domain = '%s', port = %d, folder = '%s', name = '%s', pass = '%s', extraimap = '%s', mime = '%s', imap = '%s', security = %d, replies = %d, fromheader = '%s', commands = '%s', sigseparator = '%s', enabled = %d, delete_after_read = %d, format = %d WHERE mid = %d", $form_state['values']['mail'], $form_state['values']['mailto'], $form_state['values']['domain'], $form_state['values']['port'], $form_state['values']['folder'], $form_state['values']['name'], $form_state['values']['pass'], $form_state['values']['extraimap'], $form_state['values']['mime'], $form_state['values']['imap'], $form_state['values']['security'], $form_state['values']['replies'], $form_state['values']['fromheader'], $form_state['values']['commands'], $form_state['values']['sigseparator'], $form_state['values']['enabled'], $form_state['values']['delete_after_read'], $form_state['values']['format'], $form_state['values']['mid']);
drupal_set_message(t('Mailbox %mailbox updated.', array('%mailbox' => $form_state['values']['mail'])));
}
else {
db_query("INSERT INTO {mailhandler} (mail, mailto, domain, port, folder, name, pass, extraimap, mime, imap, security, replies, fromheader, commands, sigseparator, enabled, delete_after_read, format) VALUES ('%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', %d, %d, %d)", $form_state['values']['mail'], $form_state['values']['mailto'], $form_state['values']['domain'], $form_state['values']['port'], $form_state['values']['folder'], $form_state['values']['name'], $form_state['values']['pass'], $form_state['values']['extraimap'], $form_state['values']['mime'], $form_state['values']['imap'], $form_state['values']['security'], $form_state['values']['replies'], $form_state['values']['fromheader'], $form_state['values']['commands'], $form_state['values']['sigseparator'], $form_state['values']['enabled'], $form_state['values']['delete_after_read'], $form_state['values']['format']);
drupal_set_message(t('Mailbox %mailbox added.', array('%mailbox' => $form_state['values']['mail'])));
}
$form_state['redirect'] = 'admin/content/mailhandler';
return;
}
/**
* Submit handler for mailbox delete button
* Redirect to delete handler if delete is clicked
*/
function mailhandler_delete_mailbox_submit($form, &$form_state) {
$form_state['redirect'] = array('admin/content/mailhandler/delete/'.$form_state['values']['mid']);
}
/**
* Confirm/Delete Mailbox
*/
function mailhandler_admin_delete_confirm($form_state, $mid) {
$info = db_fetch_object(db_query("SELECT mid, mail FROM {mailhandler} WHERE mid = %d", $mid));
$form['mid'] = array(
'#type' => 'hidden',
'#value' => $mid,
);
return confirm_form(
$form,
t('Do you wish to delete mailbox %mailbox?', array('%mailbox' => $info->mail)),
'admin/content/mailhandler',
t('This action cannot be undone.'),
t('Delete'),
t('Cancel')
);
}
function mailhandler_admin_delete_confirm_submit($form, &$form_state) {
$info = db_fetch_object(db_query("SELECT mid, mail FROM {mailhandler} WHERE mid = %d", $form_state['values']['mid']));
db_query("DELETE FROM {mailhandler} WHERE mid = %d", $form_state['values']['mid']);
watchdog('mailhandler', 'Mailhandler: Mailbox %mailbox deleted', array('%mailbox' => $info->mail), WATCHDOG_INFO);
drupal_set_message(t('Mailbox %mailbox deleted', array('%mailbox' => $info->mail)));
$form_state['redirect'] = 'admin/content/mailhandler';
return;
}
/**
* Test connection to a mailbox, and output results as a message
*/
function mailhandler_test_mailbox(&$form_state) {
$mailbox = $form_state['values'];
$result = mailhandler_open_mailbox($mailbox);
if ($result) {
drupal_set_message('Mailhandler was able to connect to the mailbox.');
imap_close($result);
}
else {
if ($mailbox['domain']) {
form_set_error('mailhandler', t('%c connection to %m failed.', array('%c' => ($mailbox['imap'] ? 'IMAP' : 'POP3'), '%m' => $mailbox['mail'])));
}
else {
form_set_error('mailhandler', t('Mailhandler could not access local folder: %m', array('%m' => $mailbox['mail'])));
}
}
return;
}
function mailhandler_list_mailboxes() {
$header = array(t('Mailbox'), t('Folder'), array('data' => t('Operations'), 'colspan' => 3));
$rows = array();
$result = db_query('SELECT * FROM {mailhandler} ORDER BY mail');
while ($mailbox = db_fetch_object($result)) {
$rows[] = array(
''. $mailbox->mail .'',
$mailbox->folder ? check_plain($mailbox->folder) : '',
l(t('retrieve'), 'admin/content/mailhandler/retrieve/'.$mailbox->mid, array('title' => t('Retrieve and process pending e-mails in this mailbox')), $destination),
l(t('edit'), 'admin/content/mailhandler/edit/'.$mailbox->mid, array('title' => t('Edit this mailbox configuration')), $destination),
l(t('delete'), 'admin/content/mailhandler/delete/'.$mailbox->mid, array('title' => t('Delete this mailbox')), $destination),
);
}
if (empty($rows)) {
$rows[] = array(array('data' => ''. t('No mailboxes have been defined.') .'', 'colspan' => 4));
}
return theme('table', $header, $rows);
}
/**
* Return the settings page for mailhandler
*/
function mailhandler_admin_settings() {
$form['mailhandler_default_type'] = array(
'#type' => 'radios',
'#title' => t('Default content type'),
'#options' => node_get_types('names'),
'#default_value' => mailhandler_default_type(),
'#description' => t('If an incoming message does not specify a particular content type, then use this type as a default.'),
);
$form['mailhandler_max_retrieval'] = array(
'#type' => 'textfield',
'#title' => t('Cron maximum message retrieval'),
'#default_value' => variable_get('mailhandler_max_retrieval', 0),
'#description' => t('To prevent timeout errors from large mailboxes you can limit the maximum number of messages that will be processed during each cron run. This is a global setting and applies to all mailboxes. A value of zero means that no limit will be applied. Some trial and error may be needed to find the optimum setting.'),
);
$form['#validate'][] = 'mailhandler_admin_settings_validate';
return system_settings_form($form);
}
/**
* Validation for mailhandler settings page
*/
function mailhandler_admin_settings_validate($form, &$form_state) {
if (empty($form_state['values']['mailhandler_max_retrieval'])) {
$form_state['values']['mailhandler_max_retrieval'] = 0;
}
if (
!is_numeric($form_state['values']['mailhandler_max_retrieval']) ||
$form_state['values']['mailhandler_max_retrieval'] < 0 ||
$form_state['values']['mailhandler_max_retrieval'] <> intval($form_state['values']['mailhandler_max_retrieval'])
) {
form_set_error('mailhandler_max_retrieval', t('The value should a positive integer, or zero.'));
}
}