· 5 years ago · Jun 23, 2020, 07:32 AM
1<?php
2
3$bpath = "/mnt/backup/";
4
5/*
6
7CREATE DATABASE IF NOT EXISTS `mailarchive`
8USE `mailarchive`;
9
10CREATE TABLE IF NOT EXISTS `logins` (
11 `id` int(11) NOT NULL AUTO_INCREMENT,
12 `username` varchar(50) DEFAULT NULL,
13 `password` varchar(50) DEFAULT NULL COMMENT 'PW im Klartext',
14 `port` smallint(6) DEFAULT NULL COMMENT 'Serverport',
15 `mailaddress` varchar(50) DEFAULT NULL COMMENT 'Im Prinzip der Ordnername in dem die Mails gespeichert werden',
16 `hostname` varchar(50) DEFAULT NULL COMMENT 'Mailservername',
17 `ssl` tinyint(1) DEFAULT NULL COMMENT 'Wert 1 für SSL aktiv, sonst freilassen',
18 `active` tinyint(1) NOT NULL DEFAULT '1',
19 PRIMARY KEY (`id`)
20) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4;
21
22CREATE TABLE IF NOT EXISTS `mails` (
23 `id` int(11) NOT NULL AUTO_INCREMENT,
24 `login_id` int(11) DEFAULT NULL,
25 `mid` text,
26 `oid` varchar(50) NOT NULL DEFAULT '0',
27 `datetime` bigint(14) NOT NULL DEFAULT '0',
28 `importdt` bigint(14) NOT NULL DEFAULT '0',
29 `subject_short` varchar(50) NOT NULL DEFAULT '0',
30 `subject` text,
31 `filename` text NOT NULL,
32 `fromaddress` text,
33 `froma` text,
34 `senderaddress` text,
35 `sendera` text,
36 PRIMARY KEY (`id`),
37 KEY `loginid` (`login_id`),
38 CONSTRAINT `loginid` FOREIGN KEY (`login_id`) REFERENCES `logins` (`id`)
39) ENGINE=InnoDB AUTO_INCREMENT=1482 DEFAULT CHARSET=utf8mb4;
40
41*/
42
43$dbo = new PDO( "mysql:host=localhost;dbname=mailarchive" , "USERNAME", "PASSWORD" );
44
45function flatMimeDecode($string) {
46 $string = mb_convert_encoding($string, "utf-8", "UTF7-IMAP");
47 $array = imap_mime_header_decode($string);
48 $str = "";
49 foreach ($array as $key => $part) {
50 $str .= $part->text;
51 }
52 return $str;
53}
54
55function dt_now() { return date('Y').date('m').date('d').date('H').date('i').date('s'); }
56
57// 26 Zeichen, = 30 Zeichen insgesammt
58function gds($length) {
59 $signs = '0123456789';
60 $signs .= 'abcdef';
61 $str = '';
62 $anz = strlen($signs);
63 for ($i=0; $i<$length; $i++) {
64
65 $str .= $signs[rand(0,$anz-1)];
66 if($i==3) { $str .= '-'; }
67 if($i==9) { $str .= '-'; }
68 if($i==15) { $str .= '-'; }
69 if($i==21) { $str .= '-'; }
70 if($i==27) { $str .= '-'; }
71
72 }
73 return $str;
74}
75
76$LoadAllLogins = $dbo->prepare("SELECT * FROM logins WHERE active = 1");
77$LoadAllLogins->execute();
78while($login = $LoadAllLogins->fetchObject()) {
79
80 $mailserver = $login->hostname;
81 $port = $login->port;
82 $username = $login->username;
83 $password = $login->password;
84 $mailaddress = $login->mailaddress;
85 $ssl = $login->ssl;
86 $loginid = $login->id;
87
88 if(isset($ssl)) { $ssl = "/imap/ssl/novalidate-cert"; } else { $ssl = ""; }
89
90 // Definition php mail3.php HOSTNAME PORT USERNAME PASSWORD MAILADRESSE SSLTRUE
91 $imap = imap_open("{".$mailserver.":".$port.$ssl."}INBOX", $username, $password) or die("imap connection error");
92 $msgcount = 0;
93 $message_count = imap_num_msg($imap);
94 $rows = 0;
95 for ($mid = 1; $mid <= $message_count; ++$mid){
96
97 $uid = gds(26);
98
99 $rfc822header = @imap_fetchheader($imap, $mid) or die("Couldn't retrieve RFC822 header info on IMAP server: " . imap_last_error());
100 $h = @imap_rfc822_parse_headers($rfc822header) or die("Couldn't parse RFC822 header info on IMAP server: " . imap_last_error());
101 #var_dump ($h);
102 $fpath = $bpath.$mailaddress;
103 if( !is_dir($fpath) ) {
104 mkdir($fpath, 0777, true);
105 }
106 $exclude = array("/","\\",":","*","?","\"","<",">","|","=","$");
107
108 if(isset($h->message_id)) {
109 //echo $h->message_id." ";
110 $senderaddress = $h->senderaddress;
111 $fromaddress = $h->fromaddress;
112 $sender = $h->sender[0]->mailbox."@".$h->sender[0]->host;
113 $from = $h->from[0]->mailbox."@".$h->from[0]->host;
114
115 $message_id = explode("@", str_replace($exclude, "", $h->message_id))[0];
116 #echo $message_id."\n";
117 $subcom = flatMimeDecode($h->subject);
118 $safesubject = substr(str_replace(" ", "_", str_replace($exclude, "", $h->subject )), 0, 50);
119
120 $neweml = $fpath."/".date("YmdHis", strtotime($h->Date))."-".$uid."_".$safesubject.".eml";
121
122 $check_entry = $dbo->prepare("SELECT 1 from mails WHERE mid = :mid");
123 $check_entry->bindValue(":mid",$message_id);
124 $check_entry->execute();
125 $row = $check_entry->rowCount();
126 $rows += $row;
127
128 #echo $mid;
129
130 if($row == 0) {
131
132
133 $save = @imap_savebody($imap, $neweml, $mid ) or die("Couldn't download message from IMAP server: " . imap_last_error());
134 $fe = file_exists($neweml);
135 if($fe == 1) {
136 // Mail wurde gespeichert
137
138 #$dbo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
139 #$dbo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
140 $insert = $dbo->prepare("INSERT INTO mails (login_id,mid,oid,datetime,importdt,subject,subject_short,filename,fromaddress,froma,senderaddress,sendera) VALUES(:lid,:mid,:oid,:dt,:idt,:s,:ss,:fn,:fa,:fr,:sa,:se)");
141 $insert->bindValue("lid",$loginid);
142 $insert->bindValue(":mid",$message_id);
143 $insert->bindValue(":oid",$uid);
144 $insert->bindValue(":dt",date("YmdHis", strtotime($h->Date)));
145 $insert->bindValue(":idt",dt_now());
146 $insert->bindValue(":s",$subcom);
147 $insert->bindValue(":ss",$safesubject);
148 $insert->bindValue(":fn",$neweml);
149 $insert->bindValue(":fa",flatMimeDecode($fromaddress));
150 $insert->bindValue(":fr",$from);
151 $insert->bindValue(":sa",flatMimeDecode($senderaddress));
152 $insert->bindValue(":se",$sender);
153 $insert->execute();
154 #$insert->debugDumpParams();
155
156 $msgcount++;
157
158 }
159
160 }
161
162 } else {
163 // Für Mails ohne MessageID
164
165 $senderaddress = $h->senderaddress;
166 $fromaddress = $h->fromaddress;
167 $sender = $h->sender[0]->mailbox."@".$h->sender[0]->host;
168 $from = $h->from[0]->mailbox."@".$h->from[0]->host;
169
170 $subcom = flatMimeDecode($h->subject);
171 $safesubject = substr(str_replace(" ", "_", str_replace($exclude, "", $h->subject )), 0, 50);
172 $msgdt = date("YmdHis", strtotime($h->Date));
173 $neweml = $fpath."/".$msgdt."-".$uid."_".$safesubject.".eml";
174
175 $check_entry = $dbo->prepare("SELECT 1 from mails WHERE subject_short = :sub AND datetime = :dt");
176 $check_entry->bindValue(":sub",$safesubject);
177 $check_entry->bindValue(":dt",$msgdt);
178 $check_entry->execute();
179 $row = $check_entry->rowCount();
180 $rows += $row;
181
182 if($row == 0) {
183
184 $save = @imap_savebody($imap, $neweml, $mid ) or die("Couldn't download message from IMAP server: " . imap_last_error());
185 $fe = file_exists($neweml);
186 if($fe == 1) {
187
188 // Mail wurde gespeichert
189 $insert = $dbo->prepare("INSERT INTO mails (login_id,oid,datetime,importdt,subject,subject_short,filename,fromaddress,froma,senderaddress,sendera) VALUES(:lid,:oid,:dt,:idt,:s,:ss,:fn,:fa,:fr,:sa,:se)");
190 $insert->bindValue("lid",$loginid);
191 $insert->bindValue(":oid",$uid);
192 $insert->bindValue(":dt",$msgdt);
193 $insert->bindValue(":idt",dt_now());
194 $insert->bindValue(":s",$subcom);
195 $insert->bindValue(":ss",$safesubject);
196 $insert->bindValue(":fn",$neweml);
197 $insert->bindValue(":fa",flatMimeDecode($fromaddress));
198 $insert->bindValue(":fr",$from);
199 $insert->bindValue(":sa",flatMimeDecode($senderaddress));
200 $insert->bindValue(":se",$sender);
201 $insert->execute();
202
203 $msgcount++;
204
205 }
206
207 }
208
209 }
210
211 #if($rows == 0) { $rows = $msgcount; }
212 #echo $rows." Nachrichten auf dem Server.\n".$msgcount." neue Nachrichten für ".$mailaddress." hinzugefügt\n\n";
213
214 }
215}