Mailer.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             $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                     $cdata['mimetype'],
150                     $cid.'.'.$cdata['ext'],
151                     true,
152                     $cid
153                 );
154             }
155             $parts[2] = $mime->get();
156             $parts[1] = $mime->headers($parts[1]);
157         
158         }
159         
160         
161         
162        // list($recipents,$headers,$body) = $parts;
163         return array(
164             'recipents' => $parts[0],
165             'headers' => $parts[1],
166             'body' => $parts[2]
167         );
168     }
169     function send()
170     {
171         
172         $email = $this->toData();
173         if (is_a($email, 'PEAR_Error')) {
174             return $email;
175         }
176         ///$recipents = array($this->email);
177         $mailOptions = PEAR::getStaticProperty('Mail','options');
178         $mail = Mail::factory("SMTP",$mailOptions);
179         $headers['Date'] = date('r');
180         if (PEAR::isError($mail)) {
181             return $mail;
182         } 
183         $oe = error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT);
184         $ret = $mail->send($email['recipents'],$email['headers'],$email['body']);
185         error_reporting($oe);
186        
187         return $ret;
188     }
189     
190     function htmlbodytoCID($html)
191     {
192         $dom = new DOMDocument;
193         $dom->loadHTML($html);
194         $imgs= $dom->getElementsByTagName('img');
195         
196         foreach ($imgs as $i=>$img) {
197             $url  = $img->getAttribute('src');
198             $conv = $this->fetchImage($url);
199             $this->images[$conv['contentid']] = $conv;
200             
201             $img->setAttribute('src', 'cid:' . $conv['contentid']);
202             
203             
204         }
205         return $dom->saveHTML();
206         
207         
208         
209     }
210     function fetchImage($url)
211     {
212         
213         if ($url[0] == '/') {
214             $file = $this->page->rootDir . $url;
215             require_once 'File/MimeType.php';
216             $m  = new File_MimeType();
217             $mt = $m->fromFilename($file);
218             $ext = $m->toExt($mt); 
219             
220             return array(
221                     'mimetype' => $mt,
222                    'ext' => $ext,
223                    'contentid' => md5($file),
224                    'file' => $file
225             );
226             
227             
228             
229         }
230         
231         print_R($url);
232         
233         exit;
234         if (preg_match('#^file:///#', $url)) {
235             $file = preg_replace('#^file://#', '', $url);
236             require_once 'File/MimeType.php';
237             $m  = new File_MimeType();
238             $mt = $m->fromFilename($file);
239             $ext = $m->toExt($mt); 
240             
241             return array(
242                     'mimetype' => $mt,
243                    'ext' => $ext,
244                    'contentid' => md5($file),
245                    'file' => $file
246             );
247             
248         }
249         
250         // CACHE???
251         // 2 files --- the info file.. and the actual file...
252         $cache = ini_get('session.save_path').'/Pman_Core_Mailer/' . md5($url);
253         if (file_exists($cache) and filemtime($cache) > strtotime('NOW - 1 WEEK')) {
254             $ret =  json_decode($cache);
255             $ret['file'] = $cache . '.data';
256             return $ret;
257         }
258         if (!file_exists(dirname($cache))) {
259             mkdir(dirname($cache),0666, true);
260         }
261         
262         require_once 'HTTP/Request.php';
263         $a = new HTTP_Request($url);
264         $a->sendRequest();
265         file_put_contents($cache .'.data', $a->getResponseBody());
266         
267         $mt = $a->getResponseHeader('Content-Type');
268         
269         require_once 'File/MimeType.php';
270         $m  = new File_MimeType();
271         $ext = $m->toExt($mt);
272         
273         $ret = array(
274             'mimetype' => $mt,
275             'ext' => $ext,
276             'contentid' => md5($url)
277             
278         );
279         
280         file_put_contents($cache, json_encode($ret));
281         $ret['file'] = $cache . '.data';
282         return $ret;
283     }  
284     
285     
286     
287 }