PHP中的MIME多部分消息未发送

时间:2014-07-16 16:35:55

标签: php email mime

我正在尝试在PHP中发送MIME多部分消息但它没有发送。我得出的结论是,这可能是因为某处的MIME语法存在问题,但我不知道在哪里。

以下是代码:

$Subject = "****** Contact Form";
$Name = trim(stripslashes($_POST['Name'])); 
$Email = trim(stripslashes($_POST['Email'])); 
$Message = nl2br(trim(stripslashes($_POST['Message'])));
$MessagePlain = trim(stripslashes($_POST['Message']));
$ReferredBy = $_POST['referredby']; 
$Other = trim(stripslashes($_POST['othertext'])); 
$Day = $_POST['Day']; 
$Month = $_POST['month']; 
$Year = $_POST['year']; 

if ($Month = 1) {
        $Month = 'January';
    } elseif ($Month = 2) {
        $Month = 'February';
    } elseif ($Month = 3) {
        $Month = 'March';
    } elseif ($Month = 4) {
        $Month = 'April';
    } elseif ($Month = 5) {
        $Month = 'May';
    } elseif ($Month = 6) {
        $Month = 'June';
    } elseif ($Month = 7) {
        $Month = 'July';
    } elseif ($Month = 8) {
        $Month = 'August';
    } elseif ($Month = 9) {
        $Month = 'September';
    } elseif ($Month = 10) {
        $Month = 'October';
    } elseif ($Month = 11) {
        $Month = 'November';
    } elseif ($Month = 12) {
        $Month = 'December';
}

$MIMEBoundary = md5(uniqid(rand()));

// prepare email headers
$Headers  = "MIME-Version: 1.0\r\n";
$Headers .= "From: ******\r\n";
$Headers .= "Reply-To: ****** <******@hotmail.com>\r\n";
$Headers .= "Content-type: multipart/alternative; boundary=$MIMEBoundary\r\n";

// prepare email body text
$Body = "--" . $MIMEBoundary . "\r\n";
$Body .= "Content-type: text/html;charset=\"ISO-8859-1\"\r\n";
$Body .= "Content-Transfer-Encoding: base64\r\n\r\n";
$Body .= '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Thank you for your message!</title><style type="text/css"> @media only screen and (max-width: 647px){#container{padding:0 !important;}#header, #header-content, #body, #content, #info, #body-message{width:100% !important;}#body-message, #quote{padding:20px !important;}} </style></head><body style="margin:0;"><table width="100%" height="100%" style="background-color:#fafafa;font-family:Helvetica Neue, Helvetica, sans-serif;padding:45px;" cellpadding="0" cellspacing="0" id="container"><tr><td><table align="center" cellpadding="0" cellspacing="0" border="0" id="rounded-border-top"><tr><td><img src="http://******"/></td></tr></table><table align="center" cellpadding="0" cellspacing="0" border="0" style="border-left:solid 1px #e6e6e6;border-right:solid 1px #e6e6e6;" id="content"><tr><td style="width:600px;background-color:#ffffff;" id="body"><table cellpadding="0" cellspacing="0" border="0" style="padding:45px;color:#303030;line-height:140%;" id="body-message"><tr><td>Hi '.$Name.',<br/><br/> Thank you for your message! I will endeavour to reply to your message within 24 hours. If you have any queries, please feel free to contact me on 07783 962 578.<br/><br/> As a first thanks, here is a free copy of the \'10 top wedding-planning tips\'. It covers the 10 essentials to wedding planning and common mistakes that can be made. Wedding planning is often very stressful, with so many things to think about. So hopefully this little companion will help lessen the load!<br/><br/><a href="downloadfreecopy.html"><img src="http://******" alt="Download Free Copy" style="border:0;"/></a><br/><br/> Best Wishes,<br/><br/><img src="http://******" alt="******"></td></tr></table></td></tr></table><table align="center" cellpadding="0" cellspacing="0" border="0" id="rounded-border-bottom"><tr><td><img src="http://******" align="left"></td></tr></table></td></tr></table></body></html>';
$Body .= "\r\n\r\n--' . $MIMEBoundary . '\r\n";
$Body .= "Content-type: text/plain;charset=\"ISO-8859-1\"\r\n";
$Body .= "Content-Transfer-Encoding: base64\r\n\r\n";
$Body .= 'Hi '.$Name.',

Thank you for your message! I will endeavour to reply to your message within 24 hours. If you have any queries, please feel free to contact me on 07783 962 578.\r\n\r\nAs a first thanks, here is a free copy of the \'10 top wedding-planning tips\'. It covers the 10 essentials to wedding planning and common mistakes that can be made. Wedding planning is often very stressful, with so many things to think about. So hopefully this little companion will help lessen the load!

http://******

Best Wishes,
******';
$Body .= "\r\n\r\n--" . $MIMEBoundary;

$Body2 = "--" . $MIMEBoundary . "\r\n";
$Body2 .= "Content-type: text/html;charset=\"ISO-8859-1\"\r\n";
$Body2 .= "Content-Transfer-Encoding: base64\r\n\r\n";
$Body2 .= '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Thank you for your message!</title><style type="text/css"> @media only screen and (max-width: 647px){#container{padding:0 !important;}#header, #header-content, #body, #content, #info, #body-message{width:100% !important;}#body-message, #quote{padding:20px !important;}} </style></head><body style="margin:0;"><table width="100%" height="100%" style="background-color:#fafafa;font-family:Helvetica Neue, Helvetica, sans-serif;padding:45px;" cellpadding="0" cellspacing="0" id="container"><tr><td><table align="center" cellpadding="0" cellspacing="0" border="0" id="rounded-border-top"><tr><td><img src="http://******"/></td></tr></table><table align="center" cellpadding="0" cellspacing="0" border="0" style="border-left:solid 1px #e6e6e6;border-right:solid 1px #e6e6e6;" id="content"><tr><td style="width:600px;background-color:#ffffff;" id="body"><table cellpadding="0" cellspacing="0" border="0" style="padding:45px;color:#303030;line-height:140%;" id="body-message"><tr><td>New Message<br/><br/><table width="100%" cellpadding="0" cellspacing="10" border="0" style="width:510px;" id="info"><tr><td width="50%"><strong>Question</strong></td><td width="50%"><strong>Answer</strong></td></tr><tr><td>Name:</td><td>'.$Name.'</td></tr><tr><td>Email:</td><td>'.$Email.'</td><tr><td>Phone:</td><td>'.$Telephone.'</td></tr><tr><td>Referred By:</td><td>'.$ReferredBy.'</td></tr><tr><td>Date:</td><td>'.$Day.' '.$Month.' '.$Year.'</td></tr><tr><td colspan="2">Message:<br/><br/><table width="100%" cellpadding="45" cellspacing="0" border="0" style="background-color:#fafafa;color:#505050;font-size:14px;line-height:140%;"><tr><td>'.$MessagePlain.'</td></tr></table></td></tr></table></td></tr></table></td></tr></table><table align="center" cellpadding="0" cellspacing="0" border="0" id="rounded-border-bottom"><tr><td><img src="http://******" align="left"></td></tr></table></td></tr></table></body></html>';
$Body2 .= "Content-type: text/plain;charset=\"ISO-8859-1\"\r\n";
$Body2 .= "Content-Transfer-Encoding: base64\r\n\r\n";
$Body2 .= 'New Message

Question Answer
Name: '.$Name.'
Email: '.$Email.'
Phone: '.$Telephone.'
Referred By: '.$ReferredBy.'
Date: '.$Day.' '.$Month.' '.$Year.'
Message:
' . $MessageAdmin;
$Body2 .= "\r\n\r\n--" . $MIMEBoundary;

//Send email to user
mail($Email, $Subject, $Body, $Headers);

// send email to admin
mail('******@hotmail.com', $Subject, $Body2, $Headers);


?>

1 个答案:

答案 0 :(得分:1)

问题

您的代码存在一些问题:

  • 第一个和第二个身体部位之间的分隔符不正确

    $Body .= "\r\n\r\n--' . $MIMEBoundary . '\r\n";
    

    上面的行将输出单引号和点。它应该是:

    $Body .= "\r\n\r\n--" . $MIMEBoundary . "\r\n";
    

    $Body .= "\r\n\r\n--$MIMEBoundary\r\n";
    
  • 两封电子邮件中的近似分隔符不正确

    $Body .= "\r\n\r\n--" . $MIMEBoundary;
    $Body2 .= "\r\n\r\n--" . $MIMEBoundary;
    

    close-delimiter必须以两个破折号结尾,因此上面的行应为:

    $Body .= "\r\n\r\n--" . $MIMEBoundary . "--";
    $Body2 .= "\r\n\r\n--" . $MIMEBoundary . "--";
    

    $Body .= "\r\n\r\n--$MIMEBoundary--";
    $Body2 .= "\r\n\r\n--$MIMEBoundary--";
    
  • 内容编码错误

    如果您指定Content-Transfer-Encoding: base64,则还必须base64_encode()(和chunk_split())该正文部分。

另请参阅下面的最终注释

MIME语法

根据RFC 2046,这是多部分消息体结构的摘录。(BNF语法略有简化。)

multipart-body := [preamble CRLF]
                  dash-boundary CRLF
                  body-part *encapsulation
                  close-delimiter
                  [CRLF epilogue]

dash-boundary := "--" boundary

body-part := MIME-part-headers [CRLF *OCTET]

encapsulation := delimiter
                 CRLF body-part

delimiter := CRLF dash-boundary

close-delimiter := delimiter "--"

参考

最终笔记

  • 应使用htmlspecialchars()转义在HTML电子邮件正文中扩展的变量(例如$Name等)。
  • 如果将每个正文部分存储在变量中,那么理解电子邮件的结构会容易得多:

    $Body  = "--$MIMEBoundary\r\n"; /* First dash-boundary */
    $Body .= "Content-type: text/html;charset=\"ISO-8859-1\"\r\n";
    $Body .= "Content-Transfer-Encoding: base64\r\n";
    $Body .= "\r\n";
    $Body .= $Body_part1;
    $Body .= "\r\n--$MIMEBoundary\r\n"; /* delimiter */
    $Body .= "Content-type: text/plain;charset=\"ISO-8859-1\"\r\n";
    $Body .= "Content-Transfer-Encoding: base64\r\n";
    $Body .= "\r\n";
    $Body .= $Body_part2;
    $Body .= "\r\n--$MIMEBoundary--"; /* close-delimiter */
    /* You only need a single CRLF between body part and delimiter. */
    
  • 就个人而言,我会在使用之前测试MIME边界字符串是否出现在任何正文部分中,但我还会使用个较短的边界字符串。但那只是我。普通人不这样做。

相关问题