[英]MIME Multipart Message in PHP not sending
我正在嘗試在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);
?>
您的代碼有幾個問題:
第一和第二主體部分之間的分隔符不正確
$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;
關閉定界符必須以兩個破折號結尾,因此上面的行應顯示為:
$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()
)。
另請參見下面的最終注釋 。
這是根據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 "--"
$Name
等)應使用htmlspecialchars()
進行轉義。 如果將每個正文部分存儲在變量中,則更容易理解電子郵件的結構:
$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邊界字符串是否出現在身體的任何部位,但隨后我還將使用更短的邊界字符串。 但這就是我。 普通人不會那樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.