Использование Mail_Mime для отправки вложения в GMail, получение вложения без имени

У меня есть довольно простая форма веб-сайта, которая может принимать вложения. Он отправляет на адрес gmail, используя smtp gmail. Все работает отлично, за исключением того, что файл приходит как «без имени» - без имени файла или расширения. Если вы загрузите вложение и переименуете его, указав правильное имя файла, файл откроется нормально.

Я пытался добавить дополнительные аргументы в 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 прикрепленными файлами и этим заголовком.

Электронная почта выглядела нормально на dos.kr и naver.com.

Но этого не было в gmail.com. Я видел файлы 'noname', и насколько я знаю, эта проблема не решалась с 2007 года.


Моя вторая граница была "----=part56d7fa8d7a369", сделанная из unique() из php.

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

Я отправлял электронные письма с теми же файлами, кроме заголовка.

Электронная почта выглядела нормально на dos.kr и gmail.com.

Но этого не было в naver.com. Я не видел ничего, кроме заголовка на naver.com.


Единственная разница заключалась в том, что «граница» и результат были совсем другими.

Итак, мне пришлось разветвить свой код, чтобы сделать разные «границы» в зависимости от адреса электронной почты.

И это сработало отлично.

person Al.T.Os    schedule 03.03.2016