aboutsummaryrefslogtreecommitdiffstats
path: root/include/email.php
blob: c0fe17cc6b90e624fa92b420860247c38b60143a (plain) (blame)
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
<?php

function email_connect($mailbox,$username,$password) {
	if(! function_exists('imap_open'))
		return false;

	$mbox = imap_open($mailbox,$username,$password);

	return $mbox;
}

function email_poll($mbox,$email_addr) {

	if(! ($mbox && $email_addr))
		return array();;

	$search = imap_search($mbox,'FROM "' . $email_addr . '"', SE_UID);
	return (($search) ? $search : array());
}


function construct_mailbox_name($mailacct) {
	$ret = '{' . $mailacct['server'] . (($mailacct['port']) ? ':' . $mailacct['port'] : '');
	$ret .= (($mailacct['ssltype']) ?  '/' . $mailacct['ssltype'] . '/novalidate-cert' : '');
	$ret .= '}' . $mailacct['mailbox'];
	return $ret;
}


function email_msg_meta($mbox,$uid) {
	$ret = (($mbox && $uid) ? imap_fetch_overview($mbox,$uid,FT_UID) : array(array()));
	return ((count($ret)) ? $ret[0] : array());
}


function email_get_msg($mbox,$uid) {
	$ret = array();

	$struc = (($mbox && $uid) ? imap_fetchstructure($mbox,$uid,FT_UID) : null);

	if(! $struc)
		return $ret;

	if(! $struc->parts) {
		$ret['body'] = email_get_part($mbox,$uid,$struc,0);
	}
	else {
		foreach($struc->parts as $ptop => $p) {
			$x = email_get_part($mbox,$uid,$p,$ptop + 1);
			if($x)
				$ret['body'] = $x;
		}
	}
	return $ret;
}

// At the moment - only return plain/text.
// Later we'll repackage inline images as data url's and make the HTML safe

function email_get_part($mbox,$uid,$p,$partno) {
    // $partno = '1', '2', '2.1', '2.1.3', etc for multipart, 0 if simple
    global $htmlmsg,$plainmsg,$charset,$attachments;

	echo $partno;

    // DECODE DATA
    $data = ($partno)
		? imap_fetchbody($mbox,$uid,$partno, FT_UID|FT_PEEK)
        : imap_body($mbox,$uid,FT_UID|FT_PEEK);

    // Any part may be encoded, even plain text messages, so check everything.
    if ($p->encoding==4)
        $data = quoted_printable_decode($data);
    elseif ($p->encoding==3)
        $data = base64_decode($data);

    // PARAMETERS
    // get all parameters, like charset, filenames of attachments, etc.
    $params = array();
    if ($p->parameters)
        foreach ($p->parameters as $x)
            $params[strtolower($x->attribute)] = $x->value;
    if ($p->dparameters)
        foreach ($p->dparameters as $x)
            $params[strtolower($x->attribute)] = $x->value;

    // ATTACHMENT
    // Any part with a filename is an attachment,
    // so an attached text file (type 0) is not mistaken as the message.

    if ($params['filename'] || $params['name']) {
        // filename may be given as 'Filename' or 'Name' or both
        $filename = ($params['filename'])? $params['filename'] : $params['name'];
        // filename may be encoded, so see imap_mime_header_decode()
        $attachments[$filename] = $data;  // this is a problem if two files have same name
    }

    // TEXT
    if ($p->type == 0 && $data) {
        // Messages may be split in different parts because of inline attachments,
        // so append parts together with blank row.
        if (strtolower($p->subtype)=='plain')
            return (trim($data) ."\n\n");
        else
			$data = '';

 //           $htmlmsg .= $data ."<br><br>";
        $charset = $params['charset'];  // assume all parts are same charset
    }

    // EMBEDDED MESSAGE
    // Many bounce notifications embed the original message as type 2,
    // but AOL uses type 1 (multipart), which is not handled here.
    // There are no PHP functions to parse embedded messages,
    // so this just appends the raw source to the main message.
//    elseif ($p->type==2 && $data) {
//        $plainmsg .= $data."\n\n";
//    }

    // SUBPART RECURSION
    if ($p->parts) {
        foreach ($p->parts as $partno0=>$p2) {
            $x =  email_get_part($mbox,$uid,$p2,$partno . '.' . ($partno0+1));  // 1.2, 1.2.1, etc.
			if($x)
				return $x;
		}
    }
}