forked from christianchristensen/iPhone-IMAP-Notes
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNotes.php
136 lines (121 loc) · 4.26 KB
/
Notes.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<?php
use Zend\Mail\Headers;
use Zend\Mail\Message;
use Zend\Mail\Storage;
use Zend\Mail\Storage\Imap;
use Zend\Mail;
class Notes
{
const xUUID = 'X-Universally-Unique-Identifier';
const xUType = 'X-Uniform-Type-Identifier';
const xUTypeField = 'com.apple.mail-note';
/**
* IMAP Protocol
* @var \Zend\Mail\Protocol\Imap
*/
protected $_imap;
/**
* IMAP storage interaction
* @var Imap
*/
protected $_storage;
function __construct($host = NULL, $user = NULL, $pass = NULL, $basefolder = NULL, $port = NULL, $ssl = FALSE) {
if (!is_null($host) && !is_null($user) && !is_null($pass)) {
$this->_imap = new \Zend\Mail\Protocol\Imap($host, $port, $ssl);
$this->_imap->login($user, $pass);
$this->_storage = new Imap($this->_imap);
// Get a list of folders, look for Notes; if not then add it and be ready to go!
if (!is_null($basefolder)) {
$this->_storage->selectFolder($basefolder . '.Notes');
}
else {
$this->_storage->selectFolder('Notes');
}
}
else {
throw new Exception('IMAP communication is unable to be initialized.');
}
}
function __destruct() {
$this->_storage->close();
$this->_imap->logout();
}
public function count() {
return $this->_storage->count();
}
public function index() {
// TODO: Schema-ize this
$index = array();
foreach ($this->_storage as $messageNum => $message) {
if (!$message->hasFlag(Storage::FLAG_DELETED)) {
$headers = $message->getHeaders();
$index[] = array(
'num' => $messageNum,
'uuid' => $headers[strtolower(self::xUUID)],
'subject' => $message->subject,
'body' => $message->getContent(),
);
}
}
return $index;
}
public function create($msg = '') {
$uuid = UUID::mint()->string;
$subj = trim(strtok($msg, "\n"));
if (empty($subj)) {
throw new Exception('Empty message creation is not permitted.');
}
$body = '';
foreach (explode("\n", $msg) as $line) {
if (empty($line)) {
$line = '<br>';
}
$body .= '<div>' . trim(str_replace("\n", "", $line)) . '</div>';
}
$message = new Message();
$message->setSubject($subj)
->setBody($body);
//->addFrom('Notes App');
//->setEncoding("UTF-8");
$message->headers()->addHeaderLine(self::xUUID, $uuid);
$message->headers()->addHeaderLine(self::xUType, self::xUTypeField);
$message->headers()->addHeaderLine('Content-Type', 'text/html');
// TODO: catch what might go wrong here...
$this->_storage->appendMessage($message->toString(), NULL, array(Storage::FLAG_SEEN));
return $uuid;
}
public function retrieve($msgid = NULL) {
$messageNum = $this->getMessageNum($msgid);
$message = $this->_storage[$messageNum];
$headers = $message->getHeaders();
return array(
'num' => $messageNum,
'uuid' => $headers[strtolower(self::xUUID)],
'subject' => $message->subject,
'body' => $message->getContent(),
);
}
public function update($msgid = NULL, $msg = '') {
$uuid = $this->create($msg);
$this->delete($msgid);
return $uuid;
}
public function delete($msgid = NULL) {
$messageNum = $this->getMessageNum($msgid);
$this->_storage->setFlags($messageNum, array(Storage::FLAG_DELETED, Storage::FLAG_SEEN));
$this->_storage->removeMessage($messageNum);
return TRUE;
}
private function getMessageNum($msgid) {
// TODO: Better detection of UUID's
if (strpos($msgid, '-') && strlen($msgid) > 30) {
// NOTE: search() is marked as "internal" as it may be unstable
// http://tools.ietf.org/html/rfc3501#section-6.4.4
$search = $this->_imap->search(array('HEADER '.self::xUUID.' '.$msgid));
return $search[0];
}
else {
return $msgid;
}
}
}