Использование Mail_Mime для отправки вложения в GMail, получение вложения «noname» - PullRequest
4 голосов
/ 12 июля 2011

У меня есть довольно простая форма сайта, которая может принимать вложения. Он отправляет на адрес Gmail, используя SMTP SMTP. Все работает отлично, за исключением того, что файл приходит как «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);

Любая помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 03 марта 2016

Недавно мне пришлось реализовать службу, которая отправляет электронную почту из приложения Android через мой сервер apache.

На этом сервере запущена служба sendmail.

Я протестировал 3 домена.

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

Я протестировал несколько кодов и понял, что 'Граница' Заголовок имеет большое значение.


Моя первая граница была ничем.

Content-Type: multipart/mixed; boundary=;

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

Письмо выглядело отлично в 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.


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

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

И это прекрасно работает.

0 голосов
/ 16 июля 2011

Вы пытались добавить переменную Content-Type в список addAttachment() аргументов? Например, если вы знали, что пользователь загружал документы в формате PDF, вы бы сделали следующее:

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