php 使用php发送带附件的电子邮件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8431327/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
send email with attachment using php
提问by sahar
I used this code to send email with attachment using php, but there is something error in the attachment since I receive an email and the attachment appears in the content. before I use the same code and it worked successfully. why???
我使用此代码使用 php 发送带有附件的电子邮件,但是由于我收到一封电子邮件并且附件出现在内容中,因此附件中有一些错误。在我使用相同的代码并成功运行之前。为什么???
<?php
// sending email with attachments
function sendEmail($to,$from,$file,$ext){
$to = "[email protected]";
$from = "[email protected]";
$subject = "Translation Request";
$random_hash = md5(date('r', time()));
$headers = "From: [email protected]\r\nReply-To: [email protected]";
$headers .= "\r\nContent-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;
}
?>
please help.
请帮忙。
回答by wiitohzjeh
for what reason no use phpmailer? example for an attachment:
什么原因不使用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(); }
回答by Bojangles
You can either do it the way thistutorial describes, or you can use one of the PEARmodules to send an email with an attachment the way thistutorial describes.
您可以按照本教程所述的方式进行操作,也可以使用PEAR模块之一按照本教程所述的方式发送带有附件的电子邮件。
Using PEAR is probably a better option as it's easier to do. The only caveat is that PEAR isn't available on all hosts.
使用 PEAR 可能是更好的选择,因为它更容易做到。唯一的警告是 PEAR 并非在所有主机上都可用。
回答by Mohit Bumb
I'm using this :
我正在使用这个:
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: base64\n";
$this->attachments[$file] .= "Content-Disposition: attachment; " .
"filename=\"$fname\"\n\n";
$this->attachments[$file] .= $_buf;
return 1;
}
回答by Mohammad Ardika Rifqi
Your code wont be work, because email doesnt support whitespaces.
您的代码将无法使用,因为电子邮件不支持空格。
$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
You must use without whitespaces
您必须使用没有空格
$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
回答by Manoj Balakonda
I am using this and ( with out using PHPMailer), Hope this is helpful to you.
我正在使用这个和(不使用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 = '[email protected]'; //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.0\r\n";
$headers .= "From:".$from_email."\r\n";
$headers .= "Reply-To: ".$reply_to_email."" . "\r\n";
$headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n";
//body plain text
$body = "--$boundary\r\n";
$body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n\r\n";
$body .= chunk_split(base64_encode($message));
//attachment file
$body .= "--$boundary\r\n";
$body .="Content-Type: $file_type; name=".$file_name."\r\n";
$body .="Content-Disposition: attachment; filename=".$file_name."\r\n";
$body .="Content-Transfer-Encoding: base64\r\n";
$body .="X-Attachment-Id: ".rand(1000,99999)."\r\n\r\n";
$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!');
}
}
?>