mailDecoding_functions.php
上传用户:gzy2002
上传日期:2010-02-11
资源大小:1785k
文件大小:4k
源码类别:

电子政务应用

开发平台:

Java

  1. <?php
  2. /**
  3. * Filename.......: decode.php
  4. * Project........: Mail decoding function
  5. * Last Modified..: $Date: 2002/12/23 22:26:39 $
  6. * CVS Revision...: $Revision: 1.1 $
  7. * Copyright......: 2001, 2002 Richard Heyes
  8. */
  9. /**
  10. * Some globals
  11. */
  12. $GLOBALS['decodeMail_output']    = new stdClass;
  13. $GLOBALS['decodeMail_inRelated'] = false;
  14. /**
  15. * Decodes a mail and returns the various parts.
  16. *
  17. * @param string The raw mail text
  18. */
  19. function decodeMail($input)
  20. {
  21. $output = &$GLOBALS['decodeMail_output'];
  22. $decode_params['input']          = $input;
  23. $decode_params['include_bodies'] = true;
  24. $decode_params['decode_bodies']  = true;
  25. $decode_params['decode_headers'] = true;
  26. $structure = Mail_mimeDecode::decode($decode_params);
  27. decodeMail_traverseStructure($structure);
  28. // Sizes
  29. $output->textSize = strlen(@$output->text);
  30. $output->htmlSize = strlen(@$output->html);
  31. // Headers
  32. $output->headers = $structure->headers;
  33. // From name/email
  34. if (!empty($output->headers['from'])) {
  35. $from = Mail_RFC822::parseAddressList($output->headers['from'], null, null, false);
  36. $output->fromEmail = sprintf('%s@%s', $from[0]->mailbox, $from[0]->host);
  37. $output->fromName  = preg_replace('/^"(.*)"$/', '1', $from[0]->personal);
  38. } else {
  39. $output->fromEmail = '';
  40. $output->fromName  = '';
  41. }
  42. // Return address
  43. if (!empty($output->headers['reply-to'])) {
  44. $output->returnAddress = $output->headers['reply-to'];
  45. } elseif (!empty($output->headers['sender'])) {
  46. $output->returnAddress = $output->headers['sender'];
  47. } elseif (!empty($output->headers['from'])) {
  48. $output->returnAddress = $output->headers['from'];
  49. } elseif (!empty($output->headers['return-path'])) {
  50. $output->returnAddress = $output->headers['return-path'];
  51. }
  52. // Recipient addresses
  53. foreach (array('to', 'cc') as $header) {
  54. if (!empty($output->headers[$header])) {
  55. $to = Mail_RFC822::parseAddressList($output->headers[$header], null, null, false);
  56. for ($i=0; $i<count($to); $i++) {
  57. if ($to[$i]) {
  58. $recipients[] = sprintf('%s@%s', $to[$i]->mailbox, $to[$i]->host);
  59. }
  60. }
  61. }
  62. }
  63. $output->recipientAddresses = $recipients;
  64. return $output;
  65. }
  66. /**
  67. * Traverses the decoded structure and adds the various
  68. * parts to the global var.
  69. */
  70. function decodeMail_traverseStructure($structure)
  71. {
  72. $output = &$GLOBALS['decodeMail_output'];
  73. $ctype  = strtolower(@$structure->ctype_primary) . '/' . strtolower(@$structure->ctype_secondary);
  74. if (!$ctype) {
  75. $ctype = 'text/plain';
  76. }
  77. switch ($ctype) {
  78. case 'text/html':
  79. case 'text/plain':
  80. if (!empty($structure->disposition) AND $structure->disposition == 'attachment') {
  81. decodeMail_addAttachment($structure);
  82. } else {
  83. $var = $ctype == 'text/html' ? 'html' : 'text';
  84. @$output->$var .= $structure->body;
  85. }
  86. break;
  87. case 'multipart/report':
  88. case 'multipart/signed':
  89. case 'multipart/mixed':
  90. case 'multipart/alternative':
  91. case 'multipart/related':
  92. case 'multipart/digest':
  93. case 'multipart/parallel':
  94. case 'message/rfc822':
  95. case 'message/disposition-notification':
  96. if (!empty($structure->parts)) {
  97. if ($ctype == 'multipart/related') {
  98. $GLOBALS['decodeMail_inRelated'] = true;
  99. }
  100. for ($i=0; $i<count($structure->parts); $i++) {
  101. decodeMail_traverseStructure($structure->parts[$i]);
  102. }
  103. $GLOBALS['decodeMail_inRelated'] = false;
  104. }
  105. break;
  106. default:
  107. decodeMail_addAttachment($structure);
  108. }
  109. }
  110. /**
  111. * Private function used by the traverse function (above)
  112. * to add an attachment to the output object.
  113. */
  114. function decodeMail_addAttachment($structure)
  115. {
  116. $output = &$GLOBALS['decodeMail_output'];
  117. // Determine filename and extension
  118. if (!empty($structure->d_parameters['filename'])) {
  119. $filename = $structure->d_parameters['filename'];
  120. if (preg_match('/^.+.(w{3,4})$/', $filename, $matches)) {
  121. $extension = $matches[1];
  122. } else {
  123. $extension = '';
  124. }
  125. } else {
  126. $filename  = '';
  127. $extension = '';
  128. }
  129. // Attachment or embedded?
  130. $var = $GLOBALS['decodeMail_inRelated'] ? 'embedded' : 'attachments';
  131. $output->{$var}[] = array('data'      => @$structure->body,
  132.                           'size'      => @strlen($structure->body),
  133.   'filename'  => $filename,
  134.   'extension' => $extension);
  135. }
  136. ?>