Index: devel.mail.inc =================================================================== RCS file: devel.mail.inc diff -N devel.mail.inc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ devel.mail.inc 6 Nov 2009 06:50:16 -0000 @@ -0,0 +1,74 @@ + $value) { + $mimeheaders[] = $name . ': ' . mime_header_encode($value); + } + + $line_endings = variable_get('mail_line_endings', MAIL_LINE_ENDINGS); + $output = join($line_endings, $mimeheaders) . $line_endings; + $output .= $message['subject'] . $line_endings; + $output .= preg_replace('@\r?\n@', $line_endings, $message['body']); + return $output; + } + + public function getFileName($message) { + $output_directory = $this->getOutputDirectory(); + $this->makeOutputDirectory($output_directory); + + $output_file_format = variable_get('devel_debug_mail_file_format', '%to-%subject-%datetime.mail.txt'); + $tokens = array( + '%to' => $message['to'], + '%subject' => $message['subject'], + '%datetime' => date('y-m-d_his'), + ); + return $output_directory . '/' . $this->dirify(str_replace(array_keys($tokens), array_values($tokens), $output_file_format)); + } + + private function dirify($string) { + return preg_replace('/[^a-zA-Z0-9_\-\.@]/', '_', $string); + } + /** + * Save an e-mail message to a file, using Drupal variables and default settings. + * + * @see http://php.net/manual/en/function.mail.php + * @see drupal_mail() + * + * @param $message + * A message array, as described in hook_mail_alter(). + * @return + * TRUE if the mail was successfully accepted, otherwise FALSE. + */ + public function mail(array $message) { + $output = $this->composeMessage($message); + $output_file = $this->getFileName($message); + + file_put_contents($output_file, $output); + return $output; + } + + protected function makeOutputDirectory($output_directory) { + if (!is_dir($output_directory)) { + mkdir ($output_directory); + } + if (!is_writable($output_directory)) { + // No need to t() this up IMO. + throw new Exception("Unable to continue sending mail, $output_directory is not writable"); + } + } + + public function getOutputDirectory() { + return variable_get('devel_debug_mail_directory', file_directory_path() . '/mails'); + } +} +?> Index: devel.info =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/devel/devel.info,v retrieving revision 1.9 diff -u -p -r1.9 devel.info --- devel.info 17 Jul 2009 11:54:59 -0000 1.9 +++ devel.info 6 Nov 2009 06:50:16 -0000 @@ -6,3 +6,5 @@ dependencies[] = menu core = 7.x files[] = devel.module files[] = devel.install +files[] = devel.test +files[] = devel.mail.inc Index: devel.test =================================================================== RCS file: devel.test diff -N devel.test --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ devel.test 6 Nov 2009 06:50:16 -0000 @@ -0,0 +1,51 @@ + 'Devel Mail interface', + 'description' => 'Test sending mails with debug interface', + 'group' => 'Devel', + ); + } + + function setUp() { + parent::setUp(); + } + + /** + * Test mail logging functionality. + */ + function testMail() { + require_once ('devel.mail.inc'); + $message = array(); + $message['to'] = 'drupal@example.com'; + $message['subject'] = 'Test mail'; + $message['headers'] = array( + 'From' => 'postmaster@example.com', + 'X-stupid' => 'dumb', + ); + $message['body'] = "I am the body of this message"; + $d = new DevelMailLog(); + + $filename = $d->getFileName($message); + $content = $d->composeMessage($message); + $expected_filename = $d->getOutputDirectory() . '/drupal@example.com-Test_mail-' . date('y-m-d_his') . '.mail.txt'; + $this->assertEqual($filename, $expected_filename); + $this->assertEqual($content, 'From: postmaster@example.com +X-stupid: dumb +To: drupal@example.com +Test mail +I am the body of this message'); + } + +}