Проблемы с отправкой вложений в PHP через Google SMTP - PullRequest
0 голосов
/ 13 апреля 2011

Привет, я не могу перекомпилировать PHP на сервере, над которым я работаю, поэтому я считаю, что мой лучший вариант для обработки этой функциональности (наша компания недавно перешла на GoogleApps для электронной почты) - через электронную почту на основе сокетов.Кажется, проблема в том, что когда я отправляю письмо, заголовки и сообщение отображаются в виде встроенного, а не в виде вложения.Я думаю, что это, вероятно, легко исправить, и я просто что-то упускаю

Я скачал отличный почтовый класс smtp, но у него не было никакой функциональности для вложений, поэтому мне пришлось вручную изменить класс.Этот класс был изначально написан @author wooptoo, http://wooptoo.com. Чтобы не показывать их работы в Интернете, я собираюсь опубликовать только соответствующие части кода:

function attach($attachments){  
$semi_rand = md5(time());  
$this->mimeBoundary = "==Multipart_Boundary_x{$semi_rand}x";  
$fileatt = $attachments[0]["file"]; // Path to the file    
$fileatt_type = $attachments[0]["content_type"]; // File Type    
$fileatt_name = basename($attachments[0]["file"]); // Filename that will be used for the file as the attachment    
$file = fopen($fileatt,'rb');  
$data = fread($file,filesize($fileatt));  
fclose($file);  
$data = chunk_split(base64_encode($data));  
$email_message = "--{$this->mimeBoundary}\n" .  
"Content-Type: {$fileatt_type};\n" .  
" name=\"{$fileatt_name}\"\n" .  
//"Content-Disposition: attachment;\n" .  
//" filename=\"{$fileatt_name}\"\n" .  
"Content-Transfer-Encoding: base64\n\n" .  
    $data . "\n\n" .  
    "--$this->mimeBoundary\n";  
$this->hasAttachment = '1';  
$this->attachmentData = $email_message;  
}

Вышеуказанное устанавливает вложение к почтовому объекту, а приведенный ниже код отправляет его

function send($from, $to, $subject, $message, $headers=null) {
if($this->hasAttachment == '1')
{
    $headers .=  "\nMIME-Version: 1.0\n" .
    "Content-Type: multipart/mixed;\n" .
    " boundary=\"{$this->mimeBoundary}\"";
    $message .= "This is a multi-part message in MIME format.\n\n" .
    "--{$this->mimeBoundary}\n" .
    "Content-Type:text/plain; charset=\"iso-8859-1\"\n" .
    "Content-Transfer-Encoding: 7bit\n\n" . $message ."\n\n" . 
    $this->attachmentData;
}
    fputs($this->conn, 'MAIL FROM: <'. $from .'>'. $this->nl);
    fgets($this->conn);
    fputs($this->conn, 'RCPT TO: <'. $to .'>'. $this->nl);
    fgets($this->conn);
    fputs($this->conn, 'DATA'. $this->nl);
    fgets($this->conn);
    fputs($this->conn,
        'From: '. $from .$this->nl.
        'To: '. $to .$this->nl.
        'Subject: '. $subject .$this->nl.
        $headers .$this->nl.
        $this->nl.
        $message . $this->nl.
        '.' .$this->nl
    );

    fgets($this->conn);
    return;
}

1 Ответ

0 голосов
/ 13 апреля 2011

Если вам интересно, я написал Фасад для Swiftmailer. Ниже приведен пример:

$transport = new Swift_SmtpTransport(...);

SwiftMail::setDefaultTransport($transport);

SwiftMail::newInstance($subject, $message)
  ->attachFile($path, $contentType)
  ->setFrom(...)
  ->setTo(...)
  ->send();
...