2013-01-02 102 views
0

我遇到了一個問題,在最後期限之後讓問題變得更糟。以下代碼已在我的舊Web服務器上成功運行。當它移動到亞馬遜EC2但是它會導致它被呼叫的頁面不能打開超出它(即它不工作)。我已確保993端口是開放的EC2但由於我是新的服務器設置我可能失去了一些東西:從EC2連接到Gmail

function downloadData($emailAddress, $reportUrl, $reportType) 
{ 
    $result = "error"; 
    // DOWNLOAD DATA 
    // the max time allows for the email to download 
    set_time_limit(3000); 

    // connect to gmail with your credentials 
    $hostname = '{imap.gmail.com:993/imap/ssl}INBOX'; 
    $username = $emailAddress; # e.g [email protected] 
    $password = '*************'; 


    // try to connect 
    $inbox = imap_open($hostname,$username,$password) or die('Cannot download information: ' . imap_last_error()); 


    /* get all new emails. If set to 'ALL' instead 
    * of 'NEW' retrieves all the emails, but can be 
    * resource intensive, so the following variable, 
    * $max_emails, puts the limit on the number of emails downloaded. 
    * 
    */ 
    $emails = imap_search($inbox,'ALL'); 

    // useful only if the above search is set to 'ALL' 
    $max_emails = 5; 


    // if any emails found, iterate through each email 
    if($emails) 
     { 
      $count = 1; 

      // put the newest emails on top 
      rsort($emails); 

      // for every email... 
      foreach($emails as $email_number) 
       { 
        // get information specific to this email 
        $overview = imap_fetch_overview($inbox,$email_number,0); 

        // get mail message 
        $message = imap_fetchbody($inbox,$email_number,2); 

        // get mail structure 
        $structure = imap_fetchstructure($inbox, $email_number); 

        $attachments = array(); 

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

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

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

          if($attachments[$i]['is_attachment']) 
           { 
            $attachments[$i]['attachment'] = imap_fetchbody($inbox, $email_number, $i+1); 

            // 4 = QUOTED-PRINTABLE encoding 
            if($structure->parts[$i]->encoding == 3) 
             { 
              $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']); 
             } 
            // 3 = BASE64 encoding 
            elseif($structure->parts[$i]->encoding == 4) 
             { 
              $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']); 
             } 
               //imap_delete($inbox,$email_number); 
               imap_mail_move($inbox, $email_number,'[Gmail]/Bin'); 
             } 
           } 
          } 

        // iterate through each attachment and save it 
        foreach($attachments as $attachment) 
         { 
          if($attachment['is_attachment'] == 1) 
           { 
            // SCAN REPORT SET OUTSIDE OF FUNCTION 
            $filename = $reportUrl; 
            if(empty($filename)) $filename = $attachment['filename']; 
            if(empty($filename)) $filename = time() . ".dat"; 

            /* prefix the email number to the filename in case two emails 
            * have the attachment with the same file name. 
            */ 
            $fp = fopen($filename, "w+"); 
            fwrite($fp, $attachment['attachment']); 
            fclose($fp); 
            $result = "success"; 
           } 

         } 
        if($count++ >= $max_emails) break; 
       } 
     } 
    // close the connection 
    imap_close($inbox,CL_EXPUNGE); 
    return $result; 
} 

雖然沒有錯誤出現這樣(的頁面是不從那裏加載函數被調用)控制檯返回這個錯誤:500(內部服務器錯誤)

任何建議,我可能會失蹤?

編輯: 似乎只有當以下的代碼段包括在功能頁面錯誤:

 // try to connect 
    $inbox = imap_open($hostname,$username,$password) or die('Cannot download information: ' . imap_last_error()); 

    // close the connection 
    imap_close($inbox,CL_EXPUNGE); 

建議,我認爲這個問題是端口雖然根據我的EC2安全組正確的端口(993)已打開。有沒有其他的端口應該在這樣的過程中打開?

+1

什麼是錯誤信息? – nnevala

+0

對不起,我覺得我不夠清楚。沒有錯誤消息,在頁面中使用的函數不會執行任何操作,而是在被調用之後的任何代碼都不會被讀取,因此它最終成爲半載頁面,因爲只有在函數被使用之前的代碼中。 –

+0

控制檯正在收到此錯誤:500(內部服務器錯誤),但只有在調用該函數時。 –

回答

0

確保EC2不在VPC上!當EC2實例在VPC內部時;它需要特殊的配置才能連接到互聯網(通過NAT實例等)。

我覺得你應該做的第一個考驗就是做「SSH您的EC2實例」,然後從那裏嘗試檢查,如果你能在993端口訪問谷歌..你可以嘗試ping imap.google.com

+0

你可能會對此有所瞭解。我試圖ping imap.google.com,但得到'ping:unknown host imap.google.com',雖然沒有將VPC ID分配給實例 –

+0

看起來像您的EC2實例在VPC後面。檢查你的EC2細節;如果它位於VPC後面,您將看到「VPC-id」。因此,更簡單的解決方案可能是您將EC2移出VPC。現在的問題是非常基本的,這是你的EC2實例沒有連接到外部互聯網 – Deepak

+0

沒有VPC ID分配給實例 –