post('/mailgun', function() use($app) { $params = $app->request()->params(); // Find the user for this email if(!preg_match('/([^ <>]+)@'.Config::$hostname.'/', $params['To'], $match)) { $app->response()->body('invalid recipient'); return; } $user = ORM::for_table('users')->where('email_username', $match[1])->find_one(); if(!$user) { $app->response()->body('user not found'); return; } if(!$user->micropub_access_token) { $app->response()->body('user has no access token'); return; } $data = array( 'published' => (k($params, 'Date') ? date('c', strtotime(k($params, 'Date'))) : date('c')) ); if(k($params, 'Subject')) $data['name'] = trim(k($params, 'Subject')); if(k($params, 'body-plain')) $data['content'] = trim(k($params, 'body-plain')); // Set tags for any hashtags used in the body if(preg_match_all('/#([^ ]+)/', $data['content'], $matches)) { $tags = array(); foreach($matches[1] as $m) $tags[] = trim($m); if($tags) { if($user->send_category_as_array != 1) { $data['category'] = $tags; } else { $data['category'] = implode(',', $tags); } } } // Handle attachments $filename = false; foreach($_FILES as $file) { // If a photo was included, set the filename to the downloaded file if(preg_match('/image/', $file['type'])) { $filename = $file['tmp_name']; } // Sometimes MMSs are sent with a txt file attached instead of in the body if(preg_match('/text\/plain/', $file['type'])) { $content = trim(file_get_contents($file['tmp_name'])); if($content) { $data['content'] = $content; } } } $r = micropub_post_for_user($user, $data, $filename); if(k($r, 'location')) $result = 'created post at ' . $r['location']; else $result = 'error creating post'; $app->response()->body($result); });