简体   繁体   English

php mail()电子邮件发送到gmail帐户,但不在常规电子邮件帐户中

[英]Php mail() email sendouts arriving in gmail account but not in regular email accounts

I have a php script that sends out emails with attachments once people have submitted some information. 我有一个php脚本,一旦人们提交了一些信息,该脚本就会发送带有附件的电子邮件。 I receive these emails in my gmail inbox with no problem. 我在Gmail收件箱中收到的这些电子邮件没有问题。 However, when I use my personal email address or my work email address the email is never delivered. 但是,当我使用个人电子邮件地址或工作电子邮件地址时,电子邮件永远不会传递。 Is this a problem with my script (below) or some setting I have on the server? 这是我的脚本(以下)或服务器上的某些设置有问题吗? I think it might be a problem with the headers, but everytime I change the headers, they break the email and everything appears in the message body. 我认为标题可能有问题,但是每次更改标题时,它们都会破坏电子邮件,并且一切都出现在邮件正文中。 Does anyone know how to fix this? 有谁知道如何解决这一问题? The server is the clients managed linux server with a plesk control panel so I don't have access to the php ini file. 该服务器是具有plesk控制面板的客户端管理的linux服务器,因此我无权访问php ini文件。

//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";

Try this multipart alternative version. 尝试此多部分替代版本。 It accepts both plaintext and html messages and allows the mail client to choose which to display. 它接受纯文本和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";

Check your spam folder on the other accounts. 检查其他帐户上的垃圾邮件文件夹。 Sometimes, mail can end up in spam if it triggers too many warnings for whatever spam-filtering software the e-mail account provider is using. 有时,如果电子邮件帐户提供商使用的任何垃圾邮件过滤软件触发了太多警告,则邮件可能最终成为垃圾邮件。

The mail() function is very useful except for when you had to deal with headers. mail()函数非常有用,除了您必须处理标头时。 Most e-mails will be rejected by spam bots without proper headers. 没有适当标题的垃圾邮件机器人将拒绝大多数电子邮件。

I would recommending using the PHPMailer class and have that do all the work. 我建议使用PHPMailer类,并完成所有工作。 Making one yourself is a pain and not recommended. 自己做是一种痛苦,不建议这样做。

https://github.com/PHPMailer/PHPMailer https://github.com/PHPMailer/PHPMailer

This comes with many wonderful features and will save your life of all these problems :) 它具有许多出色的功能,可以挽救所有这些问题的生命:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM