Почтовые рассылки Php mail (), поступающие в учетную запись Gmail, но не в обычные почтовые - PullRequest
0 голосов
/ 13 сентября 2009

У меня есть скрипт php, который рассылает электронные письма с вложениями после того, как люди предоставили некоторую информацию. Я получаю эти письма в свой почтовый ящик Gmail без проблем. Однако, когда я использую свой личный адрес электронной почты или рабочий адрес электронной почты, электронное письмо никогда не доставляется. Это проблема с моим сценарием (ниже) или с некоторыми настройками на сервере? Я думаю, что это может быть проблема с заголовками, но каждый раз, когда я меняю заголовки, они ломают электронную почту, и все появляется в теле сообщения. Кто-нибудь знает, как это исправить? Сервер - это управляемый клиентами сервер linux с панелью управления plesk, поэтому у меня нет доступа к ini-файлу php.

//define the receiver of the email
$to = 'test@test.com';
//define the subject of the email
$subject = 'Email with Attachment';
//create a boundary string. It must be unique
//so we use the MD5 algorithm to generate a random hash
$random_hash = md5(date('r', time()));
//define the headers we want passed. Note that they are separated with \r\n
$mime_boundary = "<<<--==+X[".md5(time())."]";

$path = $_SERVER['DOCUMENT_ROOT'].'/two/php/';
$fileContent =  chunk_split(base64_encode(file_get_contents($path.'CTF_brochure.pdf')));


$headers .= "From: info@example.org.uk <info@poundsandpennies.org.uk>\r\n";  

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed;\r\n";
$headers .= " boundary=\"".$mime_boundary."\"";




$message = "This is a multi-part message in MIME format.\r\n";

$message .= "\r\n";
$message .= "--".$mime_boundary."\r\n";

$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n";
$message .= "Content-Transfer-Encoding: 7bit\r\n";
$message .= "\r\n";
$message .= "Email content and what not: \r\n";
$message .= "This is the file you asked for! \r\n";
$message .= "--".$mime_boundary."" . "\r\n";

$message .= "Content-Type: application/octet-stream;\r\n";
$message .= " name=\"CTF-brochure.pdf\"" . "\r\n";
$message .= "Content-Transfer-Encoding: base64 \r\n";
$message .= "Content-Disposition: attachment;\r\n";
$message .= " filename=\"CTF_brochure.pdf\"\r\n";
$message .= "\r\n";
$message .= $fileContent;
$message .= "\r\n";
$message .= "--".$mime_boundary."\r\n";

//send the email
$mail_sent = mail($to, $subject, $message, $headers);
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed"
echo $mail_sent ? "Mail sent" : "Mail failed";

Ответы [ 3 ]

2 голосов
/ 13 сентября 2009

Попробуйте эту многочастную альтернативную версию. Он принимает как текстовые, так и html-сообщения и позволяет почтовому клиенту выбирать, какие из них отображать.


//define the receiver of the email
$to = 'test@test.com';
//define the subject of the email
$subject = 'Email with Attachment';
//create 2 boundary strings. They must be unique
$boundary1 = rand(0,9)."-"
                            .rand(10000000000,9999999999)."-"
                            .rand(10000000000,9999999999)."=:"
                            .rand(10000,99999);
$boundary2 = rand(0,9)."-".rand(10000000000,9999999999)."-"
                            .rand(10000000000,9999999999)."=:"
                            .rand(10000,99999);

$path = $_SERVER['DOCUMENT_ROOT'].'/two/php/';
$fileContent =  chunk_split(base64_encode(file_get_contents($path.'CTF_brochure.pdf')));

$txt_message = "Email content and what not: \r\n";
$txt_message .= "This is the file you asked for! \r\n";

$html_message = "Email content and what not: <br />";
$html_message .= "This is the file you asked for! ";

$headers     =<<<AKAM
From: info@example.org.uk <info@poundsandpennies.org.uk>
MIME-Version: 1.0
Content-Type: multipart/mixed;
    boundary="$boundary1"
AKAM;

$attachment = <<<ATTA
--$boundary1
Content-Type: application/octet-stream;
    name="CTF_brochure.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
    filename="CTF_brochure.pdf"

$fileContent

ATTA;

$body = <<<AKAM
This is a multi-part message in MIME format.

--$boundary1
Content-Type: multipart/alternative;
    boundary="$boundary2"

--$boundary2
Content-Type: text/plain;
    charset=ISO-8859-1;
Content-Transfer-Encoding: 7bit

$txt_message
--$boundary2
Content-Type: text/html;
    charset=ISO-8859-1;
Content-Transfer-Encoding: 7bit

$html_message

--$boundary2--

$attachment
--$boundary1--
AKAM;

//send the email
$mail_sent = @mail($to, $subject, $body, $headers);
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed"
echo $mail_sent ? "Mail sent" : "Mail failed";
0 голосов
/ 14 октября 2014

Функция mail () очень полезна, за исключением случаев, когда вам приходилось иметь дело с заголовками. Большинство электронных писем будут отклоняться спам-ботами без правильных заголовков.

Я бы порекомендовал использовать класс PHPMailer и сделать так, чтобы вся работа выполнялась. Делать его самостоятельно - это боль и не рекомендуется.

https://github.com/PHPMailer/PHPMailer

Это поставляется с множеством замечательных функций и спасет вашу жизнь от всех этих проблем:)

0 голосов
/ 13 сентября 2009

Проверьте папку со спамом на других аккаунтах. Иногда почта может заканчиваться спамом, если она вызывает слишком много предупреждений для любого программного обеспечения для фильтрации спама, которое использует поставщик учетной записи электронной почты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...