Images.php
[Pman.Core] / Mailer.php
1 <?php
2
3 /**
4  *
5  *  code that used to be in Pman (sendTemplate / emailTemplate)
6  *
7  *  usage:
8  *
9  *
10  *  $x= new Pman_Core_Mailer($opts)
11  *
12  *  $opts[
13        page => 
14        contents
15        template
16        replaceImages => true|false
17     ]
18  *
19  *  $x->asData(); // returns data needed for notify?? - notify should really
20  *                  // just use this to pass around later..
21  *
22  *  $x->send();
23  *
24  */
25
26 class Pman_Core_Mailer {
27     
28     var $page           = false; /* usually a html_flexyframework_page */
29     var $contents       = false; /* object or array */
30     var $template       = false; /* string */
31     var $replaceImages  = false; /* boolean */
32     
33     
34     var $images         = array(); // generated list of cid images for sending
35     
36     
37     function Pman_Core_Mailer($args) {
38         foreach($args as $k=>$v) {
39             // a bit trusting..
40             $this->$k =  $v;
41         }
42     }
43      
44     /**
45      * ---------------- Global Tools ---------------   
46      */
47     
48     function toData()
49     {
50     
51         $templateFile = $this->template;
52         $args = $this->contents;
53         
54         $content  = clone($this->page);
55         
56         foreach((array)$args as $k=>$v) {
57             $content->$k = $v;
58         }
59         
60         $content->msgid = empty($content->msgid ) ? md5(time() . rand()) : $content->msgid ;
61         
62         $ff = HTML_FlexyFramework::get();
63         $http_host = isset($_SERVER["HTTP_HOST"]) ? $_SERVER["HTTP_HOST"] : 'pman.HTTP_HOST.not.set';
64         if (isset($ff->Pman['HTTP_HOST'])) {
65             $http_host  = $ff->Pman['HTTP_HOST'];
66         }
67         
68         
69         $content->HTTP_HOST = $http_host;
70         
71         
72         
73         // this should be done by having multiple template sources...!!!
74         
75         require_once 'HTML/Template/Flexy.php';
76         
77         $htmlbody = false;
78         $htmltemplate = new HTML_Template_Flexy(  );
79
80         if (is_string($htmltemplate->resolvePath('mail/'.$templateFile.'.body.html')) ) {
81             // then we have a multi-part email...
82             
83             
84             $htmltemplate->compile('mail/'. $templateFile.'.body.html');
85             $htmlbody =  $htmltemplate->bufferedOutputObject($content);
86             
87             // for the html body, we may want to convert the attachments to images.
88             
89             $htmlbody = $this->htmlbodytoCID($htmlbody);
90             
91              
92         }
93         
94         
95         
96         $template = new HTML_Template_Flexy( array(
97                 'nonHTML' => true,
98         ));
99         
100         $template->compile('mail/'. $templateFile.'.txt');
101         
102         /* use variables from this object to ouput data. */
103         $mailtext = $template->bufferedOutputObject($content);
104         
105         
106         
107         
108         
109         
110         
111         
112         
113         
114         //echo "<PRE>";print_R($mailtext);
115         
116         /* With the output try and send an email, using a few tricks in Mail_MimeDecode. */
117         require_once 'Mail/mimeDecode.php';
118         require_once 'Mail.php';
119         
120         $decoder = new Mail_mimeDecode($mailtext);
121         $parts = $decoder->getSendArray();
122         if (PEAR::isError($parts)) {
123             return $parts;
124             //echo "PROBLEM: {$parts->message}";
125             //exit;
126         } 
127         
128         
129         
130         
131         $parts[1]['Message-Id'] = '<' .   $content->msgid   .
132                                      '@' . $content->HTTP_HOST .'>';
133         
134         
135         
136         
137         if ($htmlbody !== false) {
138             require_once 'Mail/mime.php';
139             $mime = new Mail_mime(array('eol' => "\n"));
140             
141             $mime->setTXTBody($parts[2]);
142             $mime->setHTMLBody($htmlbody);
143             
144             foreach($this->images as $cid=>$cdata) { 
145             
146                 $mime->addHTMLImage(
147                     $cdata['file'],
148                      $cdata['mimetype'],
149                      $cid.'.'.$cdata['ext'],
150                     true,
151                     $cdata['contentid']
152                 );
153             }
154             $parts[2] = $mime->get();
155             $parts[1] = $mime->headers($parts[1]);
156         
157         }
158         
159         
160         
161        // list($recipents,$headers,$body) = $parts;
162         return array(
163             'recipents' => $parts[0],
164             'headers' => $parts[1],
165             'body' => $parts[2]
166         );
167     }
168     function send()
169     {
170         
171         $email = $this->toData();
172         if (is_a($email, 'PEAR_Error')) {
173             return $email;
174         }
175         ///$recipents = array($this->email);
176         $mailOptions = PEAR::getStaticProperty('Mail','options');
177         $mail = Mail::factory("SMTP",$mailOptions);
178         $headers['Date'] = date('r');
179         if (PEAR::isError($mail)) {
180             return $mail;
181         } 
182         $oe = error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT);
183         $ret = $mail->send($email['recipents'],$email['headers'],$email['body']);
184         error_reporting($oe);
185        
186         return $ret;
187     }
188     
189     function htmlbodytoCID($html)
190     {
191         $dom = new DOMDocument;
192         $dom->loadHTML($html);
193         $imgs= $dom->getElementsByTagName('img');
194         
195         foreach ($imgs as $i=>$img) {
196             $url  = $img->getAttribute('src');
197             $conv = $this->fetchImage($url);
198             $this->images[$conv['contentid']] = $conv;
199             
200             $img->setAttribute('src', 'cid:' . $conv['contentid']);
201             
202             
203         }
204         return $dom->saveHTML();
205         
206         
207         
208     }
209     function fetchImage($url)
210     {
211         
212         if ($url[0] == '/') {
213             $file = $this->page->rootDir . $url;
214             require_once 'File/MimeType.php';
215             $m  = new File_MimeType();
216             $mt = $m->fromFilename($file);
217             $ext = $m->toExt($mt); 
218             
219             return array(
220                     'mimetype' => $mt,
221                    'ext' => $ext,
222                    'contentid' => md5($file),
223                    'file' => $file
224             );
225             
226             
227             
228         }
229         
230         //print_R($url); exit;
231         
232         
233         if (preg_match('#^file:///#', $url)) {
234             $file = preg_replace('#^file://#', '', $url);
235             require_once 'File/MimeType.php';
236             $m  = new File_MimeType();
237             $mt = $m->fromFilename($file);
238             $ext = $m->toExt($mt); 
239             
240             return array(
241                     'mimetype' => $mt,
242                    'ext' => $ext,
243                    'contentid' => md5($file),
244                    'file' => $file
245             );
246             
247         }
248         
249         // CACHE???
250         // 2 files --- the info file.. and the actual file...
251         $cache = ini_get('session.save_path').'/Pman_Core_Mailer/' . md5($url);
252         if (file_exists($cache) and filemtime($cache) > strtotime('NOW - 1 WEEK')) {
253             $ret =  json_decode($cache);
254             $ret['file'] = $cache . '.data';
255             return $ret;
256         }
257         if (!file_exists(dirname($cache))) {
258             mkdir(dirname($cache),0666, true);
259         }
260         
261         require_once 'HTTP/Request.php';
262         $a = new HTTP_Request($url);
263         $a->sendRequest();
264         file_put_contents($cache .'.data', $a->getResponseBody());
265         
266         $mt = $a->getResponseHeader('Content-Type');
267         
268         require_once 'File/MimeType.php';
269         $m  = new File_MimeType();
270         $ext = $m->toExt($mt);
271         
272         $ret = array(
273             'mimetype' => $mt,
274             'ext' => $ext,
275             'contentid' => md5($url)
276             
277         );
278         
279         file_put_contents($cache, json_encode($ret));
280         $ret['file'] = $cache . '.data';
281         return $ret;
282     }  
283     
284     
285     
286 }