用PHP Mail()发送附件?
我需要用邮件发送pdf,这可能吗?
$to = "xxx"; $subject = "Subject" ; $message = 'Example message with <b>html</b>'; $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; $headers .= 'From: xxx <xxx>' . "\r\n"; mail($to,$subject,$message,$headers);
我错过了什么?
我同意@MihaiIorga的评论 – 使用PHPMailer脚本。 你听起来像是拒绝它,因为你想要更容易的select。 相信我,与使用PHP内置的mail()
函数试图自己做PHPMailer相比,PHPMailer更容易。 PHP的mail()
函数确实不是很好。
要使用PHPMailer:
- 从这里下载PHPMailer脚本: http : //github.com/PHPMailer/PHPMailer
- 解压存档并将脚本文件夹复制到项目中的方便位置。
- 包含主脚本文件 –
require_once('path/to/file/class.phpmailer.php');
现在,发送带有附件的电子邮件从疯狂难以到非常简单:
$email = new PHPMailer(); $email->From = 'you@example.com'; $email->FromName = 'Your Name'; $email->Subject = 'Message Subject'; $email->Body = $bodytext; $email->AddAddress( 'destinationaddress@example.com' ); $file_to_attach = 'PATH_OF_YOUR_FILE_HERE'; $email->AddAttachment( $file_to_attach , 'NameOfFile.pdf' ); return $email->Send();
这只是一行$email->AddAttachment();
– 你不能要求更容易。
如果你使用PHP的mail()
函数来完成这个工作,你将会编写一堆代码,而且你可能会有很多很难find的bug。
你可以尝试使用下面的代码:
$filename = 'myfile'; $path = 'your path goes here'; $file = $path . "/" . $filename; $mailto = 'mail@mail.com'; $subject = 'Subject'; $message = 'My message'; $content = file_get_contents($file); $content = chunk_split(base64_encode($content)); // a random hash will be necessary to send mixed content $separator = md5(time()); // carriage return type (RFC) $eol = "\r\n"; // main header (multipart mandatory) $headers = "From: name <test@test.com>" . $eol; $headers .= "MIME-Version: 1.0" . $eol; $headers .= "Content-Type: multipart/mixed; boundary=\"" . $separator . "\"" . $eol; $headers .= "Content-Transfer-Encoding: 7bit" . $eol; $headers .= "This is a MIME encoded message." . $eol; // message $body = "--" . $separator . $eol; $body .= "Content-Type: text/plain; charset=\"iso-8859-1\"" . $eol; $body .= "Content-Transfer-Encoding: 8bit" . $eol; $body .= $message . $eol; // attachment $body .= "--" . $separator . $eol; $body .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"" . $eol; $body .= "Content-Transfer-Encoding: base64" . $eol; $body .= "Content-Disposition: attachment" . $eol; $body .= $content . $eol; $body .= "--" . $separator . "--"; //SEND Mail if (mail($mailto, $subject, $body, $headers)) { echo "mail send ... OK"; // or use booleans here } else { echo "mail send ... ERROR!"; print_r( error_get_last() ); }
用于PHP 5.5.27安全更新
$file = $path.$filename; $content = file_get_contents( $file); $content = chunk_split(base64_encode($content)); $uid = md5(uniqid(time())); $name = basename($file); // header $header = "From: ".$from_name." <".$from_mail.">\r\n"; $header .= "Reply-To: ".$replyto."\r\n"; $header .= "MIME-Version: 1.0\r\n"; $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n"; // message & attachment $nmessage = "--".$uid."\r\n"; $nmessage .= "Content-type:text/plain; charset=iso-8859-1\r\n"; $nmessage .= "Content-Transfer-Encoding: 7bit\r\n\r\n"; $nmessage .= $message."\r\n\r\n"; $nmessage .= "--".$uid."\r\n"; $nmessage .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n"; $nmessage .= "Content-Transfer-Encoding: base64\r\n"; $nmessage .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n"; $nmessage .= $content."\r\n\r\n"; $nmessage .= "--".$uid."--"; if (mail($mailto, $subject, $nmessage, $header)) { return true; // Or do something here } else { return false; }
Swiftmailer是另一个易于使用的脚本,可以自动防止电子邮件注入 ,并使附件轻而易举。 我也强烈反对使用PHP内置的mail()
函数。
使用:
- 下载Swiftmailer ,并将
lib
文件夹放在您的项目中 - 使用
require_once 'lib/swift_required.php';
包含主文件require_once 'lib/swift_required.php';
现在在需要邮件时添加代码:
// Create the message $message = Swift_Message::newInstance() ->setSubject('Your subject') ->setFrom(array('webmaster@mysite.com' => 'Web Master')) ->setTo(array('receiver@example.com')) ->setBody('Here is the message itself') ->attach(Swift_Attachment::fromPath('myPDF.pdf')); //send the message $mailer->send($message);
更多信息和选项可以在Swiftmailer文档中find。
要发送带附件的电子邮件,我们需要使用multipart / mixed MIMEtypes,指定混合types将包含在电子邮件中。 此外,我们希望使用multipart / alternative MIMEtypes来发送电子邮件的纯文本和HTML版本。看看这个例子:
<?php //define the receiver of the email $to = 'youraddress@example.com'; //define the subject of the email $subject = 'Test email with attachment'; //create a boundary string. It must be unique //so we use the MD5 algorithm to generate a random hash $random_hash = md5(date('r', time())); //define the headers we want passed. Note that they are separated with \r\n $headers = "From: webmaster@example.com\r\nReply-To: webmaster@example.com"; //add boundary string and mime type specification $headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\""; //read the atachment file contents into a string, //encode it with MIME base64, //and split it into smaller chunks $attachment = chunk_split(base64_encode(file_get_contents('attachment.zip'))); //define the body of the message. ob_start(); //Turn on output buffering ?> --PHP-mixed-<?php echo $random_hash; ?> Content-Type: multipart/alternative; boundary="PHP-alt-<?php echo $random_hash; ?>" --PHP-alt-<?php echo $random_hash; ?> Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Hello World!!! This is simple text email message. --PHP-alt-<?php echo $random_hash; ?> Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: 7bit <h2>Hello World!</h2> <p>This is something with <b>HTML</b> formatting.</p> --PHP-alt-<?php echo $random_hash; ?>-- --PHP-mixed-<?php echo $random_hash; ?> Content-Type: application/zip; name="attachment.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment <?php echo $attachment; ?> --PHP-mixed-<?php echo $random_hash; ?>-- <?php //copy current buffer contents into $message variable and delete current output buffer $message = ob_get_clean(); //send the email $mail_sent = @mail( $to, $subject, $message, $headers ); //if the message is sent successfully print "Mail sent". Otherwise print "Mail failed" echo $mail_sent ? "Mail sent" : "Mail failed"; ?>
正如你所看到的,发送带附件的电子邮件很容易完成。 在前面的例子中,我们有multipart / mixed MIMEtypes,里面有multipart / alternative MIMEtypes,指定两个版本的电子邮件。 为了在我们的消息中包含一个附件,我们将指定文件中的数据读入到一个string中,使用base64对其进行编码,将其拆分为更小的块,以确保它符合MIME规范,然后将其作为附件包含在内。
从这里采取。
工作理念:
if (isset($_POST['submit'])) { $mailto = $_POST["mailTo"]; $from_mail = $_POST["fromEmail"]; $replyto = $_POST["fromEmail"]; $from_name = $_POST["fromName"]; $message = $_POST["message"]; $subject = $_POST["subject"]; $filename = $_FILES["fileAttach"]["name"]; $content = chunk_split(base64_encode(file_get_contents($_FILES["fileAttach"]["tmp_name"]))); $uid = md5(uniqid(time())); $name = basename($file); $header = "From: " . $from_name . " <" . $from_mail . ">\r\n"; $header .= "Reply-To: " . $replyto . "\r\n"; $header .= "MIME-Version: 1.0\r\n"; $header .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\r\n\r\n"; $header .= "This is a multi-part message in MIME format.\r\n"; $header .= "--" . $uid . "\r\n"; // You add html "Content-type: text/html; charset=utf-8\n" or for Text "Content-type:text/plain; charset=iso-8859-1\r\n" by I.khan $header .= "Content-type:text/html; charset=utf-8\n"; $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n"; // User Message you can add HTML if You Selected HTML content $header .= "<div style='color: red'>" . $message . "</div>\r\n\r\n"; $header .= "--" . $uid . "\r\n"; $header .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"\r\n"; // use different content types here $header .= "Content-Transfer-Encoding: base64\r\n"; $header .= "Content-Disposition: attachment; filename=\"" . $filename . "\"\r\n\r\n"; // For Attachment $header .= $content . "\r\n\r\n"; $header .= "--" . $uid . "--"; if (mail($mailto, $subject, "", $header)) { echo "<script>alert('Success');</script>"; // or use booleans here } else { echo "<script>alert('Failed');</script>"; } }
经过一段时间格式不正确的附件后,这是我最终使用的代码:
$email = new PHPMailer(); $email->From = 'from@somedomain.com'; $email->FromName = 'FromName'; $email->Subject = 'Subject'; $email->Body = 'Body'; $email->AddAddress( 'to@somedomain.com' ); $email->AddAttachment( "/path/to/file" , "filename.ext", 'base64', 'application/octet-stream' ); $email->Send();
这对我有用。 它也附加了多个附件。 容易
<?php if($_POST && isset($_FILES['file'])) { $recipient_email = "recipient@yourmail.com"; //recepient $from_email = "info@your_domain.com"; //from email using site domain. $subject = "Attachment email from your website!"; //email subject line $sender_name = filter_var($_POST["s_name"], FILTER_SANITIZE_STRING); //capture sender name $sender_email = filter_var($_POST["s_email"], FILTER_SANITIZE_STRING); //capture sender email $sender_message = filter_var($_POST["s_message"], FILTER_SANITIZE_STRING); //capture message $attachments = $_FILES['file']; //php validation if(strlen($sender_name)<4){ die('Name is too short or empty'); } if (!filter_var($sender_email, FILTER_VALIDATE_EMAIL)) { die('Invalid email'); } if(strlen($sender_message)<4){ die('Too short message! Please enter something'); } $file_count = count($attachments['name']); //count total files attached $boundary = md5("sanwebe.com"); if($file_count > 0){ //if attachment exists //header $headers = "MIME-Version: 1.0\r\n"; $headers .= "From:".$from_email."\r\n"; $headers .= "Reply-To: ".$sender_email."" . "\r\n"; $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n"; //message 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($sender_message)); //attachments for ($x = 0; $x < $file_count; $x++){ if(!empty($attachments['name'][$x])){ if($attachments['error'][$x]>0) //exit script and output error if we encounter any { $mymsg = array( 1=>"The uploaded file exceeds the upload_max_filesize directive in php.ini", 2=>"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form", 3=>"The uploaded file was only partially uploaded", 4=>"No file was uploaded", 6=>"Missing a temporary folder" ); die($mymsg[$attachments['error'][$x]]); } //get file info $file_name = $attachments['name'][$x]; $file_size = $attachments['size'][$x]; $file_type = $attachments['type'][$x]; //read file $handle = fopen($attachments['tmp_name'][$x], "r"); $content = fread($handle, $file_size); fclose($handle); $encoded_content = chunk_split(base64_encode($content)); //split into smaller chunks (RFC 2045) $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; } } }else{ //send plain email otherwise $headers = "From:".$from_email."\r\n". "Reply-To: ".$sender_email. "\n" . "X-Mailer: PHP/" . phpversion(); $body = $sender_message; } $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! Please check your PHP mail configuration.'); } } ?>
我结束了写我自己的电子邮件发送/编码function。 这对我发送PDF附件非常有效。 我没有使用生产中的其他function。
注意:尽pipe规范相当强调,您必须使用\ r \ n来分隔标题,但我发现它只在使用PHP_EOL时才起作用。 我只在Linux上testing过。 因人而异
<?php # $args must be an associative array # required keys: from, to, body # body can be a string or a [tree of] associative arrays. See examples below # optional keys: subject, reply_to, cc, bcc # EXAMPLES: # # text-only email: # email2(array( # 'from' => 'noreply@foo.com', # 'to' => 'jason@jasonwoof.com', # 'subject' => 'test', # # body will be text/plain because we're passing a string that doesn't start with '<' # 'body' => 'Hi, testing 1 2 3', # )); # # # html-only email # email2(array( # 'from' => 'noreply@foo.com', # 'to' => 'jason@jasonwoof.com', # 'subject' => 'test', # # body will be text/html because we're passing a string that starts with '<' # 'body' => '<h1>Hi!</h1>I like <a href="http://cheese.com">cheese</a>', # )); # # # text-only email (explicitly, in case first character is dynamic or something) # email2(array( # 'from' => 'noreply@foo.com', # 'to' => 'jason@jasonwoof.com', # 'subject' => 'test', # # body will be text/plain because we're passing a string that doesn't start with '<' # 'body' => array( # 'type' => 'text', # 'body' => $message_text, # ) # )); # # # email with text and html alternatives (auto-detected mime types) # email2(array( # 'from' => 'noreply@foo.com', # 'to' => 'jason@jasonwoof.com', # 'subject' => 'test', # 'body' => array( # 'type' => 'alternatives', # 'body' => array( # "Hi!\n\nI like cheese", # '<h1>Hi!</h1><p>I like <a href="http://cheese.com">cheese</a></p>', # ) # ) # )); # # # email with text and html alternatives (explicit types) # email2(array( # 'from' => 'noreply@foo.com', # 'to' => 'jason@jasonwoof.com', # 'subject' => 'test', # 'body' => array( # 'type' => 'alternatives', # 'body' => array( # array( # 'type' => 'text', # 'body' => "Hi!\n\nI like cheese", # ), # array( # 'type' => 'html', # 'body' => '<h1>Hi!</h1><p>I like cheese</p>', # ), # ) # ) # )); # # # email with an attachment # email2(array( # 'from' => 'noreply@foo.com', # 'to' => 'jason@jasonwoof.com', # 'subject' => 'test', # 'body' => array( # 'type' => 'mixed', # 'body' => array( # "Hi!\n\nCheck out this (inline) image", # array( # 'type' => 'image/png', # 'disposition' => 'inline', # 'body' => $image_data, # raw file contents # ), # "Hi!\n\nAnd here's an attachment", # array( # 'type' => 'application/pdf; name="attachment.pdf"', # 'disposition' => 'attachment; filename="attachment.pdf"', # 'body' => $pdf_data, # raw file contents # ), # "Or you can use shorthand:", # array( # 'type' => 'application/pdf', # 'attachment' => 'attachment.pdf', # name for client (not data source) # 'body' => $pdf_data, # raw file contents # ), # ) # ) # )) function email2($args) { if (!isset($args['from'])) { return 1; } $from = $args['from']; if (!isset($args['to'])) { return 2; } $to = $args['to']; $subject = isset($args['subject']) ? $args['subject'] : ''; $reply_to = isset($args['reply_to']) ? $args['reply_to'] : ''; $cc = isset($args['cc']) ? $args['cc'] : ''; $bcc = isset($args['bcc']) ? $args['bcc'] : ''; #FIXME should allow many more characters here (and do Q encoding) $subject = isset($args['subject']) ? $args['subject'] : ''; $subject = preg_replace("|[^a-z0-9 _/#'.:&,-]|i", '_', $subject); $headers = "From: $from"; if($reply_to) { $headers .= PHP_EOL . "Reply-To: $reply_to"; } if($cc) { $headers .= PHP_EOL . "CC: $cc"; } if($bcc) { $headers .= PHP_EOL . "BCC: $bcc"; } $r = email2_helper($args['body']); $headers .= PHP_EOL . $r[0]; $body = $r[1]; if (mail($to, $subject, $body, $headers)) { return 0; } else { return 5; } } function email2_helper($body, $top = true) { if (is_string($body)) { if (substr($body, 0, 1) == '<') { return email2_helper(array('type' => 'html', 'body' => $body), $top); } else { return email2_helper(array('type' => 'text', 'body' => $body), $top); } } # now we can assume $body is an associative array # defaults: $type = 'application/octet-stream'; $mime = false; $boundary = null; $disposition = null; $charset = false; # process 'type' first, because it sets defaults for others if (isset($body['type'])) { $type = $body['type']; if ($type === 'text') { $type = 'text/plain'; $charset = true; } elseif ($type === 'html') { $type = 'text/html'; $charset = true; } elseif ($type === 'alternative' || $type === 'alternatives') { $mime = true; $type = 'multipart/alternative'; } elseif ($type === 'mixed') { $mime = true; $type = 'multipart/mixed'; } } if (isset($body['disposition'])) { $disposition = $body['disposition']; } if (isset($body['attachment'])) { if ($disposition == null) { $disposition = 'attachment'; } $disposition .= "; filename=\"{$body['attachment']}\""; $type .= "; name=\"{$body['attachment']}\""; } # make headers $headers = array(); if ($top && $mime) { $headers[] = 'MIME-Version: 1.0'; } if ($mime) { $boundary = md5('5sd^%Ca)~aAfF0=4mIN' . rand() . rand()); $type .= "; boundary=$boundary"; } if ($charset) { $type .= '; charset=' . (isset($body['charset']) ? $body['charset'] : 'UTF-8'); } $headers[] = "Content-Type: $type"; if ($disposition !== null) { $headers[] = "Content-Disposition: {$disposition}"; } $data = ''; # return array, first el is headers, 2nd is body (php's mail() needs them separate) if ($mime) { foreach ($body['body'] as $sub_body) { $data .= "--$boundary" . PHP_EOL; $r = email2_helper($sub_body, false); $data .= $r[0] . PHP_EOL . PHP_EOL; # headers $data .= $r[1] . PHP_EOL . PHP_EOL; # body } $data .= "--$boundary--"; } else { if(preg_match('/[^\x09\x0A\x0D\x20-\x7E]/', $body['body'])) { $headers[] = "Content-Transfer-Encoding: base64"; $data .= chunk_split(base64_encode($body['body'])); } else { $data .= $body['body']; } } return array(join(PHP_EOL, $headers), $data); }
$to = "to@gmail.com"; $subject = "Subject Of The Mail"; $message = "Hi there,<br/><br/>This is my message.<br><br>"; $headers = "From: From-Name<from@gmail.com>"; // 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 $message = "This is a multi-part message in MIME format.\n\n" . "--{$mime_boundary}\n" . "Content-Type: text/html; charset=ISO-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n"; $message .= "--{$mime_boundary}\n"; $filepath = 'uploads/'.$_FILES['image']['name']; move_uploaded_file($_FILES['image']['tmp_name'], $filepath); //upload the file $filename = $_FILES['image']['name']; $file = fopen($filepath, "rb"); $data = fread($file, filesize($filepath)); fclose($file); $data = chunk_split(base64_encode($data)); $message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$filename\"\n" . "Content-Disposition: attachment;\n" . " filename=\"$filename\"\n" . "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; $message .= "--{$mime_boundary}\n"; mail($to, $subject, $message, $headers);
从这个页面复制代码 – 在邮件()中工作
他开始制作一个可以稍后调用的函数mail_attachment。 他后来用他的附件代码做了什么。
<?php function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $replyto, $subject, $message) { $file = $path.$filename; $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())); $header = "From: ".$from_name." <".$from_mail.">\r\n"; $header .= "Reply-To: ".$replyto."\r\n"; $header .= "MIME-Version: 1.0\r\n"; $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n"; $header .= "This is a multi-part message in MIME format.\r\n"; $header .= "--".$uid."\r\n"; $header .= "Content-type:text/plain; charset=iso-8859-1\r\n"; $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n"; $header .= $message."\r\n\r\n"; $header .= "--".$uid."\r\n"; $header .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n"; // use different content types here $header .= "Content-Transfer-Encoding: base64\r\n"; $header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n"; $header .= $content."\r\n\r\n"; $header .= "--".$uid."--"; if (mail($mailto, $subject, "", $header)) { echo "mail send ... OK"; // or use booleans here } else { echo "mail send ... ERROR!"; } } //start editing and inputting attachment details here $my_file = "somefile.zip"; $my_path = "/your_path/to_the_attachment/"; $my_name = "Olaf Lederer"; $my_mail = "my@mail.com"; $my_replyto = "my_reply_to@mail.net"; $my_subject = "This is a mail with attachment."; $my_message = "Hallo,\r\ndo you like this script? I hope it will help.\r\n\r\ngr. Olaf"; mail_attachment($my_file, $my_path, "recipient@mail.org", $my_mail, $my_name, $my_replyto, $my_subject, $my_message); ?>
他在他的网页上有更多的细节,并在评论部分回答了一些问题。
100%工作概念发送电子邮件与附件在PHP中:
if (isset($_POST['submit'])) { extract($_POST); require_once('mail/class.phpmailer.php'); $subject = "$name Applied For - $position"; $email_message = "<div>Thanks for Applying ....</div> "; $mail = new PHPMailer; $mail->IsSMTP(); // telling the class to use SMTP $mail->Host = "mail.companyname.com"; // SMTP server $mail->SMTPDebug = 0; $mail->SMTPAuth = true; $mail->SMTPSecure = "ssl"; $mail->Host = "smtp.gmail.com"; $mail->Port = 465; $mail->IsHTML(true); $mail->Username = "info@companyname.com"; // GMAIL username $mail->Password = "mailPassword"; // GMAIL password $mail->SetFrom('info@companyname.com', 'new application submitted'); $mail->AddReplyTo("name@yourdomain.com","First Last"); $mail->Subject = "your subject"; $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test $mail->MsgHTML($email_message); $address = 'info@companyname.com'; $mail->AddAddress($address, "companyname"); $mail->AddAttachment($_FILES['file']['tmp_name'], $_FILES['file']['name']); // attachment if (!$mail->Send()) { /* Error */ echo 'Message not Sent! Email at info@companyname.com'; } else { /* Success */ echo 'Sent Successfully! <b> Check your Mail</b>'; } }
我用这个代码谷歌smtp邮件发送与附件….
注意:从这里下载PHPMailer库 – > https://github.com/PHPMailer/PHPMailer