【问题标题】:Php mail() email sendouts arriving in gmail account but not in regular email accountsPhp mail() 电子邮件发送到达 gmail 帐户但不在常规电子邮件帐户中
【发布时间】:2009-09-13 01:11:19
【问题描述】:

我有一个 php 脚本,一旦人们提交了一些信息,它就会发送带有附件的电子邮件。我在我的 gmail 收件箱中收到这些电子邮件没有问题。但是,当我使用我的个人电子邮件地址或工作电子邮件地址时,电子邮件永远不会送达。这是我的脚本(如下)或我在服务器上的某些设置的问题吗?我认为这可能是标题的问题,但是每次我更改标题时,它们都会破坏电子邮件,并且所有内容都会出现在邮件正文中。有谁知道如何解决这一问题? 服务器是客户端管理的带有 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";

【问题讨论】:

  • 嗨,德鲁。当您发送到其他非 gmail 帐户时,输出“邮件已发送”或“邮件失败”。您是否尝试发送到另一个 gmail 帐户?
  • 每次发送邮件时输出

标签: php email


【解决方案1】:

试试这个多部分替代版本。它接受纯文本和 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";

【讨论】:

  • 感谢您。唉,我在 gmail 帐户上没有收到任何消息,在其他任何事情上都没有收到任何消息
【解决方案2】:

检查您在其他帐户上的垃圾邮件文件夹。有时,如果邮件针对电子邮件帐户提供商使用的任何垃圾邮件过滤软件触发过多警告,则邮件最终可能会成为垃圾邮件。

【讨论】:

  • 感谢您的建议,但可惜这是我看的第一个地方!
【解决方案3】:

mail() 函数非常有用,除非您必须处理标题。大多数电子邮件都会被没有正确标题的垃圾邮件机器人拒绝。

我建议使用 PHPMailer 类并让它完成所有工作。自己做一个很痛苦,不推荐。

https://github.com/PHPMailer/PHPMailer

它具有许多出色的功能,可以为您解决所有这些问题:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-15
    • 2013-03-24
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多