3

I am running a script to log into an IMAP/POP mailbox, forward the content to a new email address, and then remove them from the mailbox.

It's almost working now, except that for some odd, inexplicable reason, forwarded attached images that are send to our Ning site look squashed, whereas emails with image attachments sent directly to Ning's uploading email address, appear perfectly formed. So something about our forwarded email format is different. As if the images in the attachments are not exactly the same as they originally were.

An example of a squashed image upload http://members.bigmanwalking.com/photo/a-test-photo?context=latest

Any help would be great... It's a puzzle why images should have lost their shape suddenly by going through this script.

<?php

      // Change to your mail server
      $host = "pop.1and1.co.uk";

      // Connecting to POP3 email server.
      $connection = imap_open("{" . $host . ":110/pop3/notls}", 'test@bigmanwalking.com', 'xxxx');

      // Total number of messages in Inbox
      $count = imap_num_msg($connection);
      echo $count . " messages found<br />";

      // Read Messages in Loop, Forward it to Actual User email and than delete it from current email account.
      for ($i = 1; $i <= $count; $i++) {
          $headers = imap_headerinfo($connection, $i);

          $subject = $headers->subject;

          $from = $headers->from[0]->mailbox . '@' . $headers->from[0]->host;
          if ($headers->cc[0]->mailbox)
              $cc = $headers->cc[0]->mailbox . '@' . $headers->cc[0]->host;
          $subject = $headers->subject;

          $structure = imap_fetchstructure($connection, $i);
          //$type = $this->get_mime_type($structure);

          // GET HTML BODY
          //$body = $this->get_part($connection, $i, "");

          $raw_body = imap_body($connection, $i);

          $attachments = array();

          if (isset($structure->parts) && count($structure->parts)) {
              for ($e = 0; $e < count($structure->parts); $e++) {
                  $attachments[$e] = array('is_attachment' => false, 'filename' => '', 'name' => '', 'attachment' => '');

                  if ($structure->parts[$e]->ifdparameters) {
                      foreach ($structure->parts[$e]->dparameters as $object) {
                          if (strtolower($object->attribute) == 'filename') {
                              $attachments[$e]['is_attachment'] = true;
                              $attachments[$e]['filename'] = $object->value;
                          } //if (strtolower($object->attribute) == 'filename')
                      } //foreach ($structure->parts[$e]->dparameters as $object)
                  } //if ($structure->parts[$e]->ifdparameters)

                  if ($structure->parts[$e]->ifparameters) {
                      foreach ($structure->parts[$e]->parameters as $object) {
                          if (strtolower($object->attribute) == 'name') {
                              $attachments[$e]['is_attachment'] = true;
                              $attachments[$e]['name'] = $object->value;
                          } //if (strtolower($object->attribute) == 'name')
                      } //foreach ($structure->parts[$e]->parameters as $object)
                  } //if ($structure->parts[$e]->ifparameters)

                  if ($attachments[$e]['is_attachment']) {
                      $attachments[$e]['attachment'] = @imap_fetchbody($connection, $i, $e + 1);
                      if ($structure->parts[$e]->encoding == 3) {
                          // 3 = BASE64
                          $attachments[$e]['attachment'] = base64_decode($attachments[$e]['attachment']);
                      } //if ($structure->parts[$e]->encoding == 3)
                      elseif ($structure->parts[$e]->encoding == 4) {
                          // 4 = QUOTED-PRINTABLE
                          $attachments[$e]['attachment'] = quoted_printable_decode($attachments[$e]['attachment']);
                      } //elseif ($structure->parts[$e]->encoding == 4)
                  } //if ($attachments[$e]['is_attachment'])

                  if ($attachments[$e]['is_attachment']) {
                      $filename = $attachments[$e]['filename'];
                      $filename = $attachments[$e]['name'];
                      $filecontent = $attachments[$e]['attachment'];
                  } //if ($attachments[$e]['is_attachment'])
              } //for ($e = 0; $e < count($structure->parts); $e++)
          } //if (isset($structure->parts) && count($structure->parts))



          echo "<pre>";
          echo "From: " . $headers->Unseen . "<br />";
          echo "From: " . $from . "<br />";
          echo "Cc: " . $cc . "<br />";
          echo "Subject: " . $subject . "<br />";
          echo "Content Type: " . $type . "<br />";
          echo "Body: " . $body . "<br />";


          $mail = new Zend_Mail();

          $mail->settype(Zend_Mime::MULTIPART_MIXED);

          for ($k = 0; $k < count($attachments); $k++) {
              $filename = $attachments[$k]['name'];
              $filecontent = $attachments[$k]['attachment'];

              if ($filename && $filecontent) {
                  $file = $mail->createAttachment($filecontent);
                  $file->filename = $filename;
              } //if ($filename && $filecontent)
          } //for ($k = 0; $k < count($attachments); $k++)


          $mail->setFrom($from);
          $mail->addTo('test@members.bigmanwalking.com');
          if ($cc)
              $mail->addCc($cc);
          $mail->setSubject($subject);
          $mail->setBodyHtml($body);
          $mail->send();

          // Mark the email messages once read
          imap_delete($connection, $i);

      } //for ($i = 1; $i <= $count; $i++)
      // Delete all marked message from current email account.

      imap_expunge($connection);

?>

Nimloc
  • 73
  • 1
  • 6
  • I've narrowed down the issue to not applying a MIME type to attachments in the above script. – Nimloc Jun 28 '12 at 21:54

1 Answers1

2

Found the answer. It was to detect Mime types of the attachments, and add the Mime types to the attachments in the outgoing email. Once this was done, the photos appeared on Ning in the correct proportion.

The help I needed was found here http://php.net/manual/en/function.imap-fetchstructure.php

Nimloc
  • 73
  • 1
  • 6
  • Hey @Nimloc I know this is an old thread, but I need this exact solution. Do you still have a copy of your final script lying around? – Matt Glover Mar 30 '19 at 09:05