From e1a37bf1a37f1a1254a6f93a4617d4fc29f6b817 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Wed, 20 Jul 2016 09:57:01 +0200 Subject: [PATCH] Initial commit for CSV mailbox import tool. --- mailbox_import_from_csv/README | 22 +++ mailbox_import_from_csv/install.sh | 9 + mailbox_import_from_csv/mailbox_import.htm | 56 ++++++ .../mailbox_import.menu.php | 22 +++ mailbox_import_from_csv/mailbox_import.php | 161 ++++++++++++++++++ mailbox_import_from_csv/test.csv | 3 + 6 files changed, 273 insertions(+) create mode 100644 mailbox_import_from_csv/README create mode 100644 mailbox_import_from_csv/install.sh create mode 100644 mailbox_import_from_csv/mailbox_import.htm create mode 100644 mailbox_import_from_csv/mailbox_import.menu.php create mode 100644 mailbox_import_from_csv/mailbox_import.php create mode 100644 mailbox_import_from_csv/test.csv diff --git a/mailbox_import_from_csv/README b/mailbox_import_from_csv/README new file mode 100644 index 0000000..c4bf0aa --- /dev/null +++ b/mailbox_import_from_csv/README @@ -0,0 +1,22 @@ + +Author: Till Brehm, ISPConfig UG + https://git.ispconfig.org/u/tbrehm + +ISPConfig version: 3.0.5 + +This addon is a CSV style importer for Email accounts. It creates mailboxes based +on an account list in CSV format. Email domains get added automatically when they +do not exist. + + +Installation +-------------------- + +Download the addon to your server and run the install.sh script to install it. + + +Usage +-------------------- + +The tool installs itself into the tools menu in ISPConfig. An example CSV file +that shows the required format for the Mailbox import is part of the addon. diff --git a/mailbox_import_from_csv/install.sh b/mailbox_import_from_csv/install.sh new file mode 100644 index 0000000..d1c0c97 --- /dev/null +++ b/mailbox_import_from_csv/install.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +mv -f mailbox_import.php /usr/local/ispconfig/interface/web/tools/ +mv -f mailbox_import.htm /usr/local/ispconfig/interface/web/tools/templates/ +mv -f mailbox_import.menu.php /usr/local/ispconfig/interface/web/tools/lib/menu.d/ + +chown ispconfig:ispconfig /usr/local/ispconfig/interface/web/tools/mailbox_import.php +chown ispconfig:ispconfig /usr/local/ispconfig/interface/web/tools/templates/mailbox_import.htm +chown ispconfig:ispconfig /usr/local/ispconfig/interface/web/tools/lib/menu.d/mailbox_import.menu.php \ No newline at end of file diff --git a/mailbox_import_from_csv/mailbox_import.htm b/mailbox_import_from_csv/mailbox_import.htm new file mode 100644 index 0000000..8c9df40 --- /dev/null +++ b/mailbox_import_from_csv/mailbox_import.htm @@ -0,0 +1,56 @@ +

+

+ +
+ +
+
Mailbox Import +
+ + +
+
+

Client

+
+ +
+
+
+

Test only

+
+ (run a test without creating the accounts) +
+
+
+ +
+ + + + + + + + + + + + + + + + + +
NameEmailPasswordQuotaStatus
MB
+
+
+ + + +
+ + +
+
+ +
diff --git a/mailbox_import_from_csv/mailbox_import.menu.php b/mailbox_import_from_csv/mailbox_import.menu.php new file mode 100644 index 0000000..2689c0a --- /dev/null +++ b/mailbox_import_from_csv/mailbox_import.menu.php @@ -0,0 +1,22 @@ +auth->is_admin()) { + +$items = array(); + +$items[] = array( 'title' => 'Mailbox import', + 'target' => 'content', + 'link' => 'tools/mailbox_import.php'); + + +$module['nav'][] = array( 'title' => 'Import', + 'open' => 1, + 'items' => $items); + +unset($items); +} + +?> \ No newline at end of file diff --git a/mailbox_import_from_csv/mailbox_import.php b/mailbox_import_from_csv/mailbox_import.php new file mode 100644 index 0000000..5de5ee7 --- /dev/null +++ b/mailbox_import_from_csv/mailbox_import.php @@ -0,0 +1,161 @@ +auth->check_module_permissions('admin'); + +//* This is only allowed for administrators +if(!$app->auth->is_admin()) die('only allowed for administrators.'); + +$app->uses('tpl'); + +$app->tpl->newTemplate('form.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/mailbox_import.htm'); +$msg = ''; +$error = ''; + + +if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name'])) { + $lines = file($_FILES['file']['tmp_name']); + unset($lines[0]); + + $email_list = array(); + $sys_groupid = intval($_POST['groupid']); + //$server_id = 1; + $sys_user = $app->db->queryOneRecord("SELECT * FROM sys_user WHERE default_group = $sys_groupid"); + $sys_userid = $sys_user['userid']; + + // get the default mailserver of the client + $tmp = $app->db->queryOneRecord('SELECT default_mailserver FROM sys_group,client WHERE sys_group.client_id = client.client_id and sys_group.groupid = '.$sys_groupid); + $server_id = intval($tmp['default_mailserver']); + unset($tmp); + + if($server_id == 0) die('Invalid server ID'); + + foreach($lines as $line) { + $parts = explode(';',$line); + + // login name; full name; mail address;password;mailbox quota + $login_name = $app->db->quote(trim($parts[0])); + $name = $app->db->quote(trim($parts[1])); + $email = strtolower(trim($parts[2])); + $password = $app->db->quote(trim($parts[3])); + $quota = intval($parts[4]); + $email_parts = $parts = explode('@',$email); + $user = $app->db->quote($email_parts[0]); + $domain = $app->db->quote($email_parts[1]); + + // Check if email domain exists + $domain_rec = $app->db->queryOneRecord("SELECT * FROM mail_domain WHERE domain = '$domain'"); + if($_POST['test'] != 1 && !is_array($domain_rec)) { + $insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `domain`, `active`) + VALUES($sys_userid, $sys_groupid, 'riud', 'riud', '', $server_id, '$domain', 'y')"; + $app->db->datalogInsert('mail_domain', $insert_data, 'domain_id'); + } + + // encrypt the password + $salt="$1$"; + $base64_alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + for ($n=0;$n<8;$n++) { + //$salt.=chr(mt_rand(64,126)); + $salt.=$base64_alphabet[mt_rand(0,63)]; + } + $salt.="$"; + $password_enc = crypt($password,$salt); + + $rec = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE email = '".$user.'@'.$domain."'"); + if($rec['number'] > 0) { + $status = 'Duplicate'; + } else { + $status = 'OK'; + if($_POST['test'] == 1) $status = 'Test: OK'; + } + + $tmp = array(); + $tmp['name'] = $name; + $tmp['email'] = $user.'@'.$domain; + $tmp['quota'] = $quota; + $tmp['password'] = $password; + $tmp['status'] = $status; + + $email_list[] = $tmp; + + if($_POST['test'] != 1 && $status = 'OK') { + + $app->uses('getconf'); + $mail_config = $app->getconf->get_server_config($server_id,'mail'); + $maildir = str_replace("[domain]",$domain,$mail_config["maildir_path"]); + $maildir = str_replace("[localpart]",strtolower($user),$maildir); + $homedir = $mail_config["homedir_path"]; + $uid = $mail_config["mailuser_uid"]; + $gid = $mail_config["mailuser_gid"]; + $quota_bytes = $quota*1024*1024; + + $insert_data = "(sys_userid,sys_groupid,sys_perm_user,sys_perm_group,sys_perm_other,server_id, + email,`password`,name,uid,gid,maildir,quota,homedir,postfix,access) + VALUES ('$sys_userid','$sys_groupid','riud','riud','','$server_id','".$user.'@'.$domain."','$password_enc', + '$name','$uid','$gid','$maildir','$quota_bytes','$homedir','y','n')"; + + //die('INSERT INTO mail_user '.$insert_data); + + $app->db->datalogInsert('mail_user', $insert_data, 'mailuser_id'); + } + } + + $app->tpl->setLoop('email_list',$email_list); + $app->tpl->setVar('has_emails',1); + +} + +$app->tpl->setVar('msg',$msg); +$app->tpl->setVar('error',$error); + +// Set the client list +$clients = $app->db->queryAllRecords("SELECT groupid,name FROM sys_group WHERE 1"); +$clientlist = ''; +foreach($clients as $c) { + $clientlist .= ""; +} +$app->tpl->setVar('clientlist',$clientlist); + +//* load language file +/* +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_mailbox_import.lng'; +include($lng_file); +$app->tpl->setVar($wb); +*/ + +$app->tpl_defaults(); +$app->tpl->pparse(); + + +?> \ No newline at end of file diff --git a/mailbox_import_from_csv/test.csv b/mailbox_import_from_csv/test.csv new file mode 100644 index 0000000..9f7169d --- /dev/null +++ b/mailbox_import_from_csv/test.csv @@ -0,0 +1,3 @@ +login name; full name; mail address;password;mailbox quota +johnlogin; John Doe; john@johnsdomain.tld;12345;28 +janelogin; Jane Doe; jane@janesdomain.tld;12345;6 \ No newline at end of file -- GitLab