我使用此代码使用php发送带有附件的电子邮件,但由于我收到电子邮件并且附件出现在内容中,因此附件中出现了错误。在我使用相同的代码之前,它成功地工作了。为什么? ?
<?php
// sending email with attachments
function sendEmail($to,$from,$file,$ext){
$to = "admin@fuwant.com";
$from = "noor@fuwant.com";
$subject = "Translation Request";
$random_hash = md5(date('r', time()));
$headers = "From: sahar@fuwant.comrnReply-To: admin@fuwant.com";
$headers .= "rnContent-Type: multipart/mixed; boundary="PHP-mixed-".$random_hash.""";
$attachment = chunk_split(base64_encode(file_get_contents("Test.doc")));
$output = "
--PHP-mixed-$random_hash;
Content-Type: multipart/alternative; boundary='PHP-alt-$random_hash'
--PHP-alt-$random_hash
Content-Type: text/plain; charset='iso-8859-1'
Content-Transfer-Encoding: 7bit
Hello World!
This is the simple text version of the email message.
--PHP-alt-$random_hash
Content-Type: text/html; charset='iso-8859-1'
Content-Transfer-Encoding: 7bit
<h2>Hello World!</h2>
<p>This is the <b>HTML</b> version of the email message.</p>
--PHP-alt-$random_hash--
--PHP-mixed-$random_hash
Content-Type: application/doc; name=Test.doc
Content-Transfer-Encoding: base64
Content-Disposition: attachment
$attachment
--PHP-mixed-$random_hash--";
$send = @mail($to, $subject, $output, $headers);
return $send;
}
?>
请帮。
为什么不使用phpmailer?附件示例:
function mandaMail ($nombredest, $maildest, $asunto, $cuerpo) {
require_once("mailer/class.phpmailer.php");
$mail = new PHPMailer(true);
$mail->IsSMTP();
try {
$mail->Host = "xxxx"; $mail->Port = 25; // smtp server
$mail->SMTPAuth = true;
$mail->Username = "xxxx"; // smtp username
$mail->Password = "xxxx"; // smtp pass
$mail->AddReplyTo("xxxx", "xxxx"); // email & name
$mail->SetFrom("xxxx", "xxxx"); // similar to up value
$mail->AddAddress($maildest, $nombredest);
$mail->Subject = $asunto;
$mail->MsgHTML(file_get_contents($cuerpo));
$mail->AddAttachment("xxxx", "xxxx"); // attachments directory, attachment name (ie: dir/blah.jpg, blah.jpg)
$mail->Send();
} catch (phpmailerException $e) { echo $e->errorMessage();
} catch (Exception $e) { echo $e->getMessage(); }
您可以按照本教程描述的方式完成,也可以使用PEAR模块之一发送带有本教程描述的附件的电子邮件。
使用PEAR可能是更好的选择,因为它更容易操作。唯一需要注意的是,PEAR并非在所有主机上都可用。
我用这个:
function attachfile($file, $type = "application/octetstream") {
if(!($fd = fopen($file, "r"))) {
$this->errstr = "Error opening $file for reading.";
return 0;
}
$_buf = fread($fd, filesize($file));
fclose($fd);
$fname = $file;
for($x = strlen($file); $x > 0; $x--)
if($file[$x] == "/")
$fname = substr($file, $x, strlen($file) - $x);
// Convert to base64 becuase mail attachments are not binary safe.
$_buf = chunk_split(base64_encode($_buf));
$this->attachments[$file] = "n--" . $this->boundary . "n";
$this->attachments[$file] .= "Content-Type: $type; name="$fname"n";
$this->attachments[$file] .= "Content-Transfer-Encoding: base64n";
$this->attachments[$file] .= "Content-Disposition: attachment; " .
"filename="$fname"nn";
$this->attachments[$file] .= $_buf;
return 1;
}
你的代码不会工作,因为电子邮件不支持空白。
$output = " --PHP-mixed-$random_hash; Content-Type: multipart/alternative; boundary='PHP-alt-$random_hash' --PHP-alt-$random_hash Content-Type: text/plain; charset='iso-8859-1' Content-Transfer-Encoding: 7bit
必须使用无空白
$output = " --PHP-mixed-$random_hash; Content-Type: multipart/alternative; boundary='PHP-alt-$random_hash' --PHP-alt-$random_hash Content-Type: text/plain; charset='iso-8859-1' Content-Transfer-Encoding: 7bit
我正在使用这个和(不使用PHPMailer),希望这对你有帮助。
<form enctype="multipart/form-data" method="POST" action="">
<label>Your Name <input type="text" name="sender_name" /> </label> <br>
<label>Your Email <input type="email" name="sender_email" /> </label> <br>
<label>Subject <input type="text" name="subject" /> </label> <br>
<label>Message <textarea name="message"></textarea> </label> <br>
<label>Attachment <input type="file" name="my_file" /></label><br>
<label><input type="submit" name="button" value="Submit" /></label>
</form>
<?php
echo "<pre>";print_r($_REQUEST);echo "</pre>"; //comment this line
echo "<pre>";print_r($_FILES);echo "</pre>"; //comment this line
if($_POST && isset($_FILES['my_file']))
{
$from_email = 'noreply@your_domain.com'; //from mail, it is mandatory with some hosts
$recipient_email = 'your-emailid@gmail.com'; //recipient email (most cases it is your personal email)
//Capture POST data from HTML form and Sanitize them,
$sender_name = filter_var($_POST["sender_name"], FILTER_SANITIZE_STRING); //sender name
$reply_to_email = filter_var($_POST["sender_email"], FILTER_SANITIZE_STRING); //sender email used in "reply-to" header
$subject = filter_var($_POST["subject"], FILTER_SANITIZE_STRING); //get subject from HTML form
//$message = filter_var($_POST["message"], FILTER_SANITIZE_STRING); //message
$message = "Name : ".$sender_name."nMessage : ".$_POST["message"]; //message
//Get uploaded file data
$file_tmp_name = $_FILES['my_file']['tmp_name'];
$file_name = $_FILES['my_file']['name'];
$file_size = $_FILES['my_file']['size'];
$file_type = $_FILES['my_file']['type'];
$file_error = $_FILES['my_file']['error'];
if($file_error > 0)
{
die('Upload error or No files uploaded');
}
//read from the uploaded file & base64_encode content for the mail
$handle = fopen($file_tmp_name, "r");
$content = fread($handle, $file_size);
fclose($handle);
$encoded_content = chunk_split(base64_encode($content));
$boundary = md5("sanwebe");
//headers
$headers = "MIME-Version: 1.0rn";
$headers .= "From:".$from_email."rn";
$headers .= "Reply-To: ".$reply_to_email."" . "rn";
$headers .= "Content-Type: multipart/mixed; boundary = $boundaryrnrn";
//body plain text
$body = "--$boundaryrn";
$body .= "Content-Type: text/plain; charset=ISO-8859-1rn";
$body .= "Content-Transfer-Encoding: base64rnrn";
$body .= chunk_split(base64_encode($message));
//attachment file
$body .= "--$boundaryrn";
$body .="Content-Type: $file_type; name=".$file_name."rn";
$body .="Content-Disposition: attachment; filename=".$file_name."rn";
$body .="Content-Transfer-Encoding: base64rn";
$body .="X-Attachment-Id: ".rand(1000,99999)."rnrn";
$body .= $encoded_content;
$sentMail = @mail($recipient_email, $subject, $body, $headers);
if($sentMail) //output success or failure messages
{
die('Thank you for your email');
}else{
die('Could not send mail!');
}
}
?>
这样做效果也很好:
$to = 'bla@test.de';
$from = 'blub@test.de';
$fromName = 'Me';
$subject = 'Hello';
$file = "D:/xxxxxxx/kanal_uebersicht.pdf";
$htmlContent= "Sehr geehrte Damen und Herren, rn";
$htmlContent.= "blabla. rn";
$htmlContent.= "Mit freundlichen Grüßen, rn";
$htmlContent.= "blabla. rn";
$headers = "From: $fromName"." <".$from.">";
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
$headers .= "nMIME-Version: 1.0n" . "Content-Type: multipart/mixed;n" . " boundary="{$mime_boundary}"";
$message .= "--{$mime_boundary}n" . "Content-Type: text/plain; charset="UTF-8"n" .
"Content-Transfer-Encoding: 7bitnn" . $htmlContent . "nn";
if(!empty($file) > 0){
if(is_file($file)){
$message .= "--{$mime_boundary}n";
$fp = @fopen($file,"rb");
$data = @fread($fp,filesize($file));
@fclose($fp);
$data = chunk_split(base64_encode($data));
$message .= "Content-Type: application/octet-stream; name="".basename($file).""n" .
"Content-Description: ".basename($file)."n" .
"Content-Disposition: attachment;n" . " filename="".basename($file).""; size=".filesize($file).";n" .
"Content-Transfer-Encoding: base64nn" . $data . "nn";
}
}
$message .= "--{$mime_boundary}--";
$returnpath = "-f" . $from;
$mail = @mail($to, $subject, $message, $headers, $returnpath);