Използване на Mail_Mime за изпращане на прикачен файл към GMail, получаване на прикачен файл noname

Имам доста проста форма за уебсайт, която може да приема прикачени файлове. Изпраща до gmail адрес с помощта на smtp на gmail. Всичко работи чудесно, освен че файлът пристига като "noname" - без име на файл или разширение. Ако изтеглите прикачения файл и го преименувате с правилното име на файл, файлът се отваря добре.

Опитах се да добавя още аргументи към addAttachment(), като типа на файла и името на файла, но те не се показват в имейла. Когато щракна върху „Покажи оригинала“ в gmail, това е всичко, което виждам в секцията с прикачени файлове (те изобщо не се променят, без значение какви аргументи използвам):

Content-Transfer-Encoding: base64
Content-Type: application/octet-stream
Content-Disposition: attachment

Ето съответната част от моя код:

require_once 'Mail.php';
require_once 'mime.php';

$ToEmail = '***@***.com'; 
$EmailSubject = '*** contact form';
$Filename = basename($_FILES['uploaded_file']['name']);

$host = "ssl://smtp.gmail.com";
$port = "465"; 
$username = "***@***.com";
$password = "***";

$MESSAGE_BODY = "Blah blah blah";

$Uploads_folder = "../uploads/";
$Filepath = $Uploads_folder.$Filename;
$tmp_path = $_FILES["uploaded_file"]["tmp_name"];

if(is_uploaded_file($tmp_path)) {
    if(!copy($tmp_path, $Filepath)) {
        echo 'Sorry, there was an error in uploading the file. Please go back and try  again.';
        exit();
    }
}

$headers = array ('From' => $username,
    'To' => $ToEmail,
    'Subject' => $EmailSubject);

$mime = new Mail_mime();
$mime->setHTMLBody($MESSAGE_BODY);
$mime->addAttachment($Filepath);

$body = $mime->get();
$headers = $mime->headers($headers);

$smtp = Mail::factory('smtp',
    array ('host' => $host,
        'port' => $port,
        'auth' => true,
        'username' => $username,
        'password' => $password));

$mail = $smtp->send($ToEmail, $headers, $body);

Всяка помощ е високо ценена!


person CLB    schedule 11.07.2011    source източник


Отговори (2)


Опитахте ли да добавите Content-Type променлива към вашия списък с addAttachment() аргументи? Например, ако знаете, че потребителят качва .pdf документи, бихте направили следното:

$Filepath = $Uploads_folder.$Filename;
$content_type = "Application/pdf";
$mime->addAttachment($Filepath, $content_type);
person Jon    schedule 16.07.2011

Наскоро ми се наложи да внедря услуга, която изпраща имейл от приложението за android чрез мой apache сървър.

Този сървър изпълнява услугата sendmail.

Тествах 3 домейна.

  1. @naver.com
  2. @gmail.com
  3. @does.kr

Тествах няколко кода и осъзнах, че заглавката 'boundary' има толкова голямо значение.


Първата ми граница беше нищо.

Content-Type: multipart/mixed; boundary=;

Изпратих имейли с 2 прикачени файла и този хедър.

Имейлът изглеждаше добре в do.kr и naver.com.

Но не беше в gmail.com. Видях 'noname' файлове, което е проблем, който все още не е решен от 2007 г., доколкото знам.


Втората ми граница беше "----=part56d7fa8d7a369", направена от unique() на php.

Content-Type: multipart/mixed; boundary=----=part56d7fa8d7a369;

Изпратих имейли със същите файлове с изключение на заглавката.

Имейлът изглеждаше добре в do.kr и gmail.com.

Но не беше в naver.com. Не видях нищо освен заглавие в naver.com.


Единствената разлика беше тази „граница“ и резултатът беше съвсем различен.

И така, трябваше да разклоня кода си, за да направя различна „граница“ в зависимост от имейл адреса.

И се получи чудесно.

person Al.T.Os    schedule 03.03.2016