· 5 years ago · Jun 18, 2020, 09:58 AM
1<?php
2
3/*
4
5CREATE DATABASE IF NOT EXISTS `mailarchive`
6USE `mailarchive`;
7
8CREATE TABLE IF NOT EXISTS `logins` (
9 `id` int(11) NOT NULL AUTO_INCREMENT,
10 `username` varchar(50) DEFAULT NULL,
11 `password` varchar(50) DEFAULT NULL COMMENT 'PW im Klartext',
12 `port` smallint(6) DEFAULT NULL COMMENT 'Serverport',
13 `mailaddress` varchar(50) DEFAULT NULL COMMENT 'Im Prinzip der Ordnername in dem die Mails gespeichert werden',
14 `hostname` varchar(50) DEFAULT NULL COMMENT 'Mailservername',
15 `ssl` tinyint(1) DEFAULT NULL COMMENT 'Wert 1 für SSL aktiv, sonst freilassen',
16 PRIMARY KEY (`id`)
17) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
18
19CREATE TABLE IF NOT EXISTS `mails` (
20 `id` int(11) NOT NULL AUTO_INCREMENT,
21 `mid` text,
22 `oid` varchar(50) NOT NULL DEFAULT '0',
23 `datetime` bigint(14) NOT NULL DEFAULT '0',
24 `importdt` bigint(14) NOT NULL DEFAULT '0',
25 `subject` varchar(50) NOT NULL DEFAULT '0',
26 `filename` text NOT NULL,
27 PRIMARY KEY (`id`)
28) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
29
30
31*/
32
33
34$dbo = new PDO( "mysql:host=localhost;dbname=mailarchive" , "MYSQLUSER", "MYSQLPW" );
35
36// 26 Zeichen, = 30 Zeichen insgesammt
37function gds($length) {
38 $signs = '0123456789';
39 $signs .= 'abcdef';
40 $str = '';
41 $anz = strlen($signs);
42 for ($i=0; $i<$length; $i++) {
43
44 $str .= $signs[rand(0,$anz-1)];
45 if($i==3) { $str .= '-'; }
46 if($i==9) { $str .= '-'; }
47 if($i==15) { $str .= '-'; }
48 if($i==21) { $str .= '-'; }
49 if($i==27) { $str .= '-'; }
50
51 }
52 return $str;
53}
54
55$LoadAllLogins = $dbo->prepare("SELECT * FROM logins WHERE active = 1");
56$LoadAllLogins->execute();
57while($login = $LoadAllLogins->fetchObject()) {
58
59$mailserver = $login->hostname;
60$port = $login->port;
61$username = $login->username;
62$password = $login->password;
63$mailaddress = $login->mailaddress;
64$ssl = $login->ssl;
65
66if(isset($ssl)) { $ssl = "/imap/ssl/novalidate-cert"; } else { $ssl = ""; }
67
68// Definition php mail3.php HOSTNAME PORT USERNAME PASSWORD MAILADRESSE SSLTRUE
69$imap = imap_open("{".$mailserver.":".$port.$ssl."}INBOX", $username, $password) or die("imap connection error");
70$msgcount = 0;
71$message_count = imap_num_msg($imap);
72$rows = 0;
73for ($mid = 1; $mid <= $message_count; ++$mid){
74
75 $uid = gds(26);
76
77 $rfc822header = @imap_fetchheader($imap, $mid) or die("Couldn't retrieve RFC822 header info on IMAP server: " . imap_last_error());
78 $h = @imap_rfc822_parse_headers($rfc822header) or die("Couldn't parse RFC822 header info on IMAP server: " . imap_last_error());
79
80 $fpath = "/backups/mail/".$mailaddress;
81 if( !is_dir($fpath) ) {
82 mkdir($fpath, 0777, true);
83 }
84 $exclude = array("/","\\",":","*","?","\"","<",">","|","=","$");
85 $message_id = explode("@", str_replace($exclude, "", $h->message_id))[0];
86 $safesubject = substr(str_replace(" ", "_", str_replace($exclude, "", $h->subject )), 0, 30);
87 $emlfile = $fpath."/".date("Y-m-d_H.i.s", strtotime($h->Date))."-".$message_id."_".$safesubject.".eml";
88 $neweml = $fpath."/".date("YmdHis", strtotime($h->Date))."-".$uid."_".$safesubject.".eml";
89
90 $check_entry = $dbo->prepare("SELECT 1 from mails WHERE mid = :mid");
91 $check_entry->bindValue(":mid",$message_id);
92 $check_entry->execute();
93 $rows += $check_entry->rowCount();
94
95
96 if($rows == 0) {
97
98
99 $save = @imap_savebody($imap, $neweml, $mid ) or die("Couldn't download message from IMAP server: " . imap_last_error());
100 $fe = file_exists($neweml);
101 if($save == 1 && $fe == 1) {
102 // Mail wurde gespeichert
103 #$dbo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
104 #$dbo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
105 $insert = $dbo->prepare("INSERT INTO mails (mid,oid,datetime,importdt,subject,filename) VALUES(:mid,:oid,:dt,:idt,:s,:fn)");
106 $insert->bindValue(":mid",$message_id);
107 $insert->bindValue(":oid",$uid);
108 $insert->bindValue(":dt",date("YmdHis", strtotime($h->Date)));
109 $insert->bindValue(":idt",date("YmdHis", strtotime(time())));
110 $insert->bindValue(":s",$safesubject);
111 $insert->bindValue(":fn",$neweml);
112 $insert->execute();
113 #$insert->debugDumpParams();
114
115 $msgcount++;
116
117 }
118
119 }
120
121}
122
123echo $rows." Nachrichten auf dem Server.\n".$msgcount." neue Nachrichten für ".$mailaddress." hinzugefügt\n\n";
124
125}