diff --git a/mailbox_import_from_csv/README b/mailbox_import_from_csv/README
new file mode 100644
index 0000000000000000000000000000000000000000..c4bf0aa76bec04c8d3363759cc42a0168c5562cc
--- /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 0000000000000000000000000000000000000000..d1c0c9782375b1411a4c0c2b8ca50d73def2b739
--- /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 0000000000000000000000000000000000000000..8c9df40d62363c66a61850b4430759986026b678
--- /dev/null
+++ b/mailbox_import_from_csv/mailbox_import.htm
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
Name
+
Email
+
Password
+
Quota
+
Status
+
+
+
+
+
+
+
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 0000000000000000000000000000000000000000..2689c0ade7e6a5e503c2d6050f92188d291afc75
--- /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 0000000000000000000000000000000000000000..5de5ee7c9a7afd726a036e981ba4d8c89acfe4ec
--- /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 0000000000000000000000000000000000000000..9f7169d73805f36985c0ed0fd0012cd7d14b3e52
--- /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