php: ошибка отправки электронной почты с несколькими вложениями
Я пытаюсь реализовать функциональность почты в php, ее работа отлично работает с одним вложением, но проблема в том, когда я пытаюсь отправить более одного вложения, его не работает. Я использую функцию php mail () для отправки писем, я пытаюсь прикрепить PDF и файл изображения. Если PDF attach, то изображение не будет прикрепляться, если Image attach, то PDF не будет прикрепляться. Есть мысли, где я делаю неправильно?
$header .= 'From: test <noreply@test.ae>' . "rn";
$header .= "MIME-Version: 1.0rn";
$file = '1.png'
$displayname = '1.png';
$file_size = filesize($file);
$handle = fopen($file, "r");
$content = fread($handle, $file_size);
fclose($handle);
$content = chunk_split(base64_encode($content));
$uid = md5(uniqid(time()));
$name = basename($file);
$filepdf = '1.pdf'
$displaynamepdf= '1.pdf';
$file_sizepdf = filesize($filepdf);
$handlepdf = fopen($filepdf, "r");
$contentpdf = fread($handlepdf, $file_sizepdf);
fclose($handlepdf);
$contentpdf = chunk_split(base64_encode($contentpdf));
$name = basename($file);
$header .= "Content-Type: multipart/mixed; boundary="".$uid.""rnrn";
$header .= "This is a multi-part message in MIME format.rn";
$header .= "--".$uid."rn";
$header .= "Content-type:text/plain; charset=iso-8859-1rn";
$header .= "Content-Transfer-Encoding: 7bitrnrn";
$header .= $message."rnrn";
$header .= "--".$uid."rn";
$header .= "Content-Type: application/octet-stream; name="".$displayname.""rn"; // use different content types here
$header .= "Content-Transfer-Encoding: base64rn";
$header .= "Content-Disposition: attachment; filename="".$displayname.""rnrn";
$header .= $content."rnrn";
$header .= "Content-Type: application/octet-stream; name="".$displaynamepdf.""rn"; // use different contentpdf types here
$header .= "Content-Transfer-Encoding: base64rn";
$header .= "Content-Disposition: attachment; filename="".$displaynamepdf.""rnrn";
$header .= $contentpdf."rnrn";
$header .= "--".$uid."--";
if (mail($to, $subject, "", $header)) {
return 'sent';
} else {
return 'not sent';
}
4 ответов
PHPMailer лучше всего использовать для электронной почты.
оформить заказ некоторые ссылкам ниже, которые помогут вам в будущем:
- вложения файлов в PHP Mail с PHPMailer
- вложения PHP mailer
- вложения с помощью phpMailer
- PHPMailer Учебник
- простой пример: отправка электронной почты с вложением С помощью Phpmailer
- PHP отправка электронной почты с несколькими вложениями с помощью PHPMailer с SMTP Проверка подлинности
- отправка электронной почты с несколькими вложениями с PHP
может это поможет вам.
вы $file
и $filepdf
Как установлено в '1.png'. Set $filepdf="1.pdf"
чтобы остальная часть заголовка была правильной.
вот код для нескольких вложений в функции почты..
Я создал функцию для нескольких вложений . и проверь это.
/*
* Function Name: sentMail
* Scope : Sent Mail Function with CC , BCC and Attachment files..
* Input : Recipient Name => $recipientName // (Required)
* Recipient MailId(Many) => $recipientMailId // (Required & Array Format)
* Subject Content => $subjectContent // (Required)
* Message Content => $messageContent // (Required)
* Sender MailId => $senderMailId // (Required)
* Sender Name(Many) => $senderName // (Required)
* Recipient CC MailId => $recipientCCMailId //(Optional & Array Format)
* Recipient BCC MailId => $recipientBCCMailId //(Optional & Array Format)
* Attachment Files => $attachmentFiles //(Optional & Array Format)
* Output : Sent mail to the Recipient.
*/
public function sentMail($recipientName,$recipientMailId,$subjectContent,$messageContent,$senderName,$senderMailId,$recipientCCMailId,$recipientBCCMailId,$attachmentFiles)
{
try
{
/*Get the Mulitple Recipient CC MailId*/
if(isset($recipientCCMailId)){
if(count($recipientCCMailId)>1){
$recipientCCMailId = implode(',',$recipientCCMailId);
}
else{
$recipientCCMailId = $recipientCCMailId[0];
}
}
/*Get the Mulitple Recipient BCC MailId*/
if(isset($recipientBCCMailId)){
if(count($recipientBCCMailId)>1){
$recipientBCCMailId = implode(',',$recipientBCCMailId);
}
else{
$recipientBCCMailId = $recipientBCCMailId[0];
}
}
/*** Mail Contents Starts ***/
$subj = $subjectContent;
$msg ="";
/*Get the Mulitple Recipient BCC MailId*/
if(count($recipientMailId)>1){
$recipientMailId = implode(',',$recipientMailId);
$msg .="Dear, <b>All</b>\r <br>";
}
else{
$recipientMailId = $recipientMailId[0];
$msg .="Dear, <b>".ucwords($user_name)."</b> \r <br>";
}
$msg .=$messageContent."\r <br><br>";
$msg .="Thank you"."\r\n\n <br>";
$msg .=$senderName."\r\n\n <br><br>";
$headers ="";
/** Get the Mulitple Attachment files and Attachment Process Starts **/
if(isset($attachmentFiles)){
$headers .= "From: ".$senderMailId."\r\n";
$headers .= "Cc: ".$recipientCCMailId."\r\n";
$headers .= "Bcc: ".$recipientBCCMailId."\r\n";
// boundary
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
// headers for attachment
$headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\"";
// multipart boundary
$msg .= "--{$mime_boundary}\n" . "Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" . $msg . "\n\n";
// preparing attachments
for($i=0;$i<count($attachmentFiles);$i++)
{
if(is_file($attachmentFiles[$i]))
{
$msg .= "--{$mime_boundary}\n";
$fp = @fopen($attachmentFiles[$i],"rb");
$data = @fread($fp,filesize($attachmentFiles[$i]));
@fclose($fp);
$data = chunk_split(base64_encode($data));
$msg .= "Content-Type: application/octet-stream; name=\"".basename($attachmentFiles[$i])."\"\n" .
"Content-Description: ".basename($attachmentFiles[$i])."\n" .
"Content-Disposition: attachment;\n" . " filename=\"".basename($attachmentFiles[$i])."\"; size=".filesize($attachmentFiles[$i]).";\n" .
"Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
}
}
$msg .= "--{$mime_boundary}--";
}
/** Attachment Process Ends **/
else{
$headers .= "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=utf-8" . "\r\n";
//$headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n";
$headers .= "From: ".$senderMailId."\r\n";
$headers .= "Cc: ".$recipientCCMailId."\r\n";
$headers .= "Bcc: ".$recipientBCCMailId."\r\n";
}
/*** Mail Contents Ends ***/
$sent_mail=mail($recipientMailId,$subj,$msg,$headers);
if($sent_mail)
{
return true;
}
else
{
return false;
}
}
catch (Exception $e)
{
getConnection('close');
echo "Caught Exception:",$e->getMessage();
}
}
Я столкнулся с той же проблемой. Проблема заключается в границе mime. Не добавляйте"...".$идентификатор uid."..."; после каждой привязанности. Добавление границы перед типом содержимого вложения достаточно.