我有一个php脚本,一旦人们提交了一些信息,就会发送带附件的电子邮件。我在我的Gmail收件箱中收到这些电子邮件没有问题。但是,当我使用我的个人电子邮件地址或工作电子邮件地址时,电子邮件永远不会发送。这是我的脚本(下面)或我在服务器上的一些设置的问题吗?我认为它可能是标题的问题,但每次我更改标题时,它们都会破坏电子邮件,所有内容都会显示在邮件正文中。有谁知道如何解决这一问题? 服务器是客户端管理的Linux服务器,带有plesk控制面板,所以我无法访问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";
答案 0 :(得分:2)
试试这个多部分替代版本。它接受明文和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";
答案 1 :(得分:0)
检查其他帐户的垃圾邮件文件夹。有时,如果邮件对电子邮件帐户提供商正在使用的任何垃圾邮件过滤软件发出过多警告,邮件就会以垃圾邮件结束。
答案 2 :(得分:0)
除了必须处理标题之外,mail()函数非常有用。大多数电子邮件都会被没有合适标题的垃圾邮件机构拒绝。
我建议使用PHPMailer类并完成所有工作。自己制作一个是痛苦的,不推荐。
https://github.com/PHPMailer/PHPMailer
这有许多精彩的功能,可以挽救你所有这些问题的生命:)