ตอนนี้คุณมีเว็บไซต์ที่ใช้ระบบไฟล์แบบเรียบแล้ว คุณต้องการรับคำติชมจากผู้ใช้ของคุณ การเพิ่ม Disqus นั้นง่ายเพราะเป็นโค้ด JavaScript ทั้งหมดที่เพิ่มลงในหน้า แต่มันไม่ใช่สิ่งที่คุณต้องการ คุณต้องการให้พวกเขาส่งอีเมลถึงคุณโดยตรงเพื่อให้คุณสามารถตอบกลับได้
คุณสามารถสร้างระบบ JavaScript ทั้งหมดเพื่อส่งอีเมลจากคอมพิวเตอร์ของผู้ใช้ได้โดยตรง แต่นั่นทำให้อีเมลของคุณเปิดกว้างต่อผู้ส่งสแปมที่สามารถดึงข้อมูลจากโค้ดของคุณ และขายให้กับนักส่งสแปมคนอื่นๆ ดังนั้น คุณต้องซ่อนที่อยู่อีเมลของคุณบนเซิร์ฟเวอร์
บทแนะนำนี้เป็นเรื่องเกี่ยวกับการเพิ่มระบบข้อความอีเมลใน PressCMS . ใหม่ของคุณ (เช่น phpPress , rubyPress , nodePress และ goPress ). ฉันกำลังเริ่มต้นด้วย front-end แล้วจัดการกับ back-end สำหรับแต่ละระบบ ฉันคิดว่าคุณมีเซิร์ฟเวอร์เหล่านี้อยู่ในระบบของคุณแล้ว
วิธีการสร้างแบบฟอร์มในเบราว์เซอร์
เนื่องจากรหัสส่วนหน้าจะเหมือนกันสำหรับแต่ละเซิร์ฟเวอร์ คุณจะต้องคัดลอกไฟล์ใหม่เหล่านี้ไปยังแต่ละไดเรกทอรีของเซิร์ฟเวอร์ ดังนั้น ผมจะพูดถึงไฟล์ในพาธที่อ้างอิงจากไดเร็กทอรีเซิร์ฟเวอร์
แทนที่จะเพิ่มการกำหนดรูปแบบเฉพาะแบบฟอร์มให้กับธีม สคริปต์ของแบบฟอร์มนี้มีทุกอย่างในที่เดียว สร้างไฟล์ questions.html ใน site/parts
ไดเร็กทอรีสำหรับเว็บไซต์ที่มีเนื้อหาดังต่อไปนี้:
<!-- Styling for the form --> <style> form { margin: 20px auto; width: 400px; padding: 1em; border: 1px solid #f0d5ad; border-radius: 1em; } form div + div { margin-top: 1em; } label { display: inline-block; width: 90px; text-align: right; } input, textarea { width: 300px; -moz-box-sizing: border-box; } input:focus, textarea:focus { border-color: #000; } textarea { vertical-align: top; height: 5em; resize: vertical; } button { margin-top: 10px; margin-left: 8em; } </style> <!-- HTML for the Form --> <form action="/api/message" method="post"> <div> <label for="Name">Name:</label> <input id="Name" name="Name" type="text" value="" pattern="[a-zA-Z]{3,3} [a-zA-Z]{3,3}" title="First and Last name." autofocus required /> </div> <div> <label for="Email">Email:</label> <input id="Email" name="Email" type="email" pattern="[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}" title="Valid Email only." value="" required /> </div> <div> <label for="Message">Message:</label> <textarea id="Message" name="Message" type="text" value="" required></textarea> </div> <button type="submit">Send Message</button> </form>
ซึ่งจะสร้างแบบฟอร์มพื้นฐานเพื่อขอชื่อเต็ม (ชื่อและนามสกุล) อีเมล และข้อความ แบบฟอร์มนี้ใช้นิพจน์ทั่วไปเพื่อให้แน่ใจว่าชื่อและที่อยู่อีเมลถูกต้อง หากสิ่งที่ผู้ใช้ป้อนลงในฟิลด์เหล่านั้นไม่ตรงกับนิพจน์ทั่วไปใน pattern
คำสั่งแล้วแบบฟอร์มจะไม่ถูกส่ง ป๊อปอัปจะขอให้ผู้ใช้กรอกข้อความในช่อง title
. ให้ถูกต้อง พารามิเตอร์. ช่องป้อนข้อมูลแต่ละช่องมี required
ดั้งเดิมเช่นกัน วิธีนี้ช่วยป้องกันไม่ให้ส่งแบบฟอร์มเปล่า นี่คือการตรวจสอบความถูกต้องของข้อมูลขั้นต่ำที่คุณควรใช้ในส่วนหน้า
action
คำสั่งใน form
องค์ประกอบบอกเว็บเบราว์เซอร์ว่าต้องส่งข้อมูลแบบฟอร์มไปยังที่อยู่ใด method
คำสั่งบอกให้เบราว์เซอร์ส่งเป็น post
กระบวนการ. ข้อมูลแบบฟอร์มจะถูกวางไว้ใน URL ของคำขอโพสต์ไปยังเซิร์ฟเวอร์ นี่คือ สตริงข้อความค้นหา . จากนั้นเซิร์ฟเวอร์จะประมวลผลข้อมูลในสตริงการสืบค้น
ใน site/pages
ไดเร็กทอรี สร้างไฟล์ contact.md
แล้ววางโค้ดนี้:
### Contact Us This is a simple contact form. Please fill in your name, first and last, email address, and message. I will get back to you as soon as possible. Thanks. {{{question}}}
เมื่อบันทึกแล้ว คุณสามารถลองใช้หน้าต่างๆ ในเซิร์ฟเวอร์ได้ ในเบราว์เซอร์ของคุณ ให้เปิดหน้า https://localhost:8081/contact.
ติดต่อเรา หน้าจะมีลักษณะเหมือนภาพด้านบน สังเกตการเน้นของฟิลด์ชื่อโดยตรงเมื่อโหลด autofocus
คำสั่งสร้างพฤติกรรมที่ต้องการนี้ เป็นการออกแบบที่ดีเสมอที่จะมีฟิลด์แรกที่ผู้ใช้ต้องพิมพ์ลงในโฟกัสโดยอัตโนมัติ
หลังจากส่งข้อความแล้ว ข้อความยืนยันไปยังผู้ใช้ก็น่าจะดี ใน site/pages
ไดเร็กทอรี สร้างไฟล์ messagesent.md
แล้ววางโค้ดนี้:
### Message was sent Thank you so much for taking time to send me a message. I will reply as soon as possible.
เพียงข้อความง่ายๆ เพื่อให้ผู้ใช้ทราบว่าข้อความถูกส่งไปอย่างถูกต้อง คุณสามารถขยายได้ตามต้องการ
การประมวลผลแบบฟอร์มด้วย goPress
ในการฆ่าเชื้อข้อความที่ผู้ใช้มอบให้ ฉันใช้ Blue Monday ห้องสมุด. ในการโหลดไลบรารีนั้นในระบบของคุณ คุณต้องเรียกใช้บรรทัดคำสั่งนี้:
go get github.com/microcosm-cc/bluemonday
ซึ่งจะทำให้ห้องสมุดพร้อมใช้งานสำหรับโปรแกรมของคุณ นั่นคือห้องสมุดที่ไม่ได้มาตรฐานเพียงแห่งเดียวที่จำเป็น
เปิด goPressServer.go
ไฟล์และเพิ่มไปที่ด้านบนของไฟล์ภายใน import ()
คำสั่ง:
"fmt" "github.com/hoisie/web" "net/smtp" "github.com/microcosm-cc/bluemonday"
การส่งอีเมลข้อความจากเซิร์ฟเวอร์ต้องใช้ไลบรารีเหล่านี้ หลังบรรทัดที่มี goPress.DefaultRoutes(
เรียกฟังก์ชัน เพิ่มโค้ดต่อไปนี้:
// // Setup special route for our form processing. // goPress.SetPostRoute('/api/message', postMessage)
ซึ่งจะกำหนดเส้นทางการโพสต์ของ /api/message
เพื่อเรียกใช้ฟังก์ชัน postMessage()
. ที่ส่วนท้ายของไฟล์ ให้เพิ่มโค้ดนี้:
// // Function: postMessage // // Description: This function will send // the message from them // the website to the owner // of the site. // // Inputs: // ctx The web server // context. // func postMessage(ctx *web.Context) string { // // Get the post information and send the // email. // name := ctx.Params["Name"] from := ctx.Params["Email"] p := bluemonday.UGCPolicy() message := p.Sanitize(ctx.Params["Message"]) to := "<your email address>" subject := "Message from User:" + name + " of CustomCT.com" sendEmail(to, from, subject, message) // // Get the messagesent page contents and // process it. // pgloc := goPress.SiteData.Sitebase + "pages/messagesent" return goPress.RenderPageContents(ctx, goPress.GetPageContents(pgloc), pgloc) } // // Function: sendEmail // // Description: This function sends an // email message. // // Inputs: // to The email address // to send the // message // from The email address // of the person // sending the // message // subject The subject of the // message // message The message of the // email // func sendEmail(to string, from string, subject string, message string) { body := fmt.Sprintf("To: %s\r\nSubject: %s\r\n\r\n%s", to, subject, message) auth := smtp.PlainAuth("", "<your email address>", "<your password>", "smtp.gmail.com") err := smtp.SendMail("smtp.gmail.com:587", auth, from, []string{to}, []byte(body)) if err != nil { // // Process the error. Currently, assuming there // isn't a problem. // } }
ฟังก์ชันทั้งสองนี้ประกอบขึ้นเป็นเครื่องจัดการสำหรับการประมวลผลอีเมลที่ส่งจากเบราว์เซอร์ /api/message
เส้นทางเรียก postMessage()
การทำงาน. ดึงข้อมูลที่ส่งจากแบบฟอร์มที่ผู้ใช้กรอก ล้างข้อความด้วยห้องสมุด BlueMonday และส่งอีเมลไปยังเจ้าของเว็บไซต์โดยใช้ sendEmail()
การทำงาน. คุณจะต้องใส่ที่อยู่ Gmail ของคุณแทน <your email address>
เจ้าของและรหัสผ่านใน <password>
ผู้ถือ
ใน goPress.go
ไฟล์ เพิ่มฟังก์ชันนี้ต่อจาก SetGetRoute()
ฟังก์ชัน:
// // Function: SetPostRoute // // Description: This function gives an // easy access to the // web variable setup in // this library. // // Inputs: // route Route to setup // handler Function to run that // route. // func SetPostRoute(route string, handler interface{}) { web.Post(route, handler) }
ฟังก์ชันนี้เหมือนกับ SetGetRoute()
การทำงาน. ข้อแตกต่างเพียงอย่างเดียวคือการใช้ web.Post()
ฟังก์ชัน
ด้วยการเปลี่ยนแปลงเหล่านี้ เซิร์ฟเวอร์ goPress ของคุณสามารถส่งอีเมลจากผู้ใช้ได้
การประมวลผลแบบฟอร์มด้วย nodePress
ในการส่งอีเมลจากโหนด คุณจะต้องติดตั้ง ไลบรารี Nodemailerก่อน และ ไลบรารีตัวแยกวิเคราะห์ ด้วยบรรทัดคำสั่งต่อไปนี้:
npm install -save nodemailer npm install -save body-parser
จากนั้นคุณต้องโหลดไลบรารีใหม่และกำหนดค่าวัตถุเมล ที่ด้านบนของ nodePress.js
หลังจากโหลดไลบรารี่ล่าสุด ให้เพิ่มบรรทัดเหล่านี้:
var nodemailer = require('nodemailer'); // https://nodemailer.com/ var bodyParser = require('body-parser'); // https://github.com/expressjs/body-parser // // create reusable transporter object using the // default SMTP transport // var transporter = nodemailer.createTransport('smtps://<your email name%40<your email domain>:<your password>@smtp.gmail.com');
การดำเนินการนี้จะโหลดไลบรารี nodemailer และตั้งค่าส่วนประกอบที่ใช้ซ้ำได้สำหรับการส่งอีเมล คุณต้องแทนที่ <your email name>
ด้วยชื่อที่อยู่อีเมลของคุณ (เช่น ก่อนเครื่องหมาย @) <your email domain>
เป็นโดเมนสำหรับที่อยู่อีเมลของคุณ (เช่น gmail.com สำหรับ gmail ปกติหรือชื่อโดเมนของคุณหากคุณตั้งค่า Gmail ในชื่อโดเมนของคุณ) และ <your password>
ด้วยรหัสผ่านสำหรับบัญชีอีเมลของคุณ
หลังจากบรรทัดที่เริ่มต้นตัวแปร nodePress ให้เพิ่มโค้ดนี้:
// // Configure the body parser library. // nodePress.use(bodyParser.urlencoded({ extended: true }));
ตอนนี้หลังจาก nodePress.get()
. ล่าสุด เรียกฟังก์ชัน เพิ่มโค้ดนี้:
nodePress.post('/api/message', function(request, response) { // // setup e-mail data // var mailOptions = { from: request.body.Email, to: '<your email address>', subject: 'Message from ' + request.body.Name + ' on contact form.', text: request.body.Message, html: request.body.Message }; // // Send the email. // transporter.sendMail(mailOptions, function(error, info){ if(error){ return console.log(error); } // // Send the user to the message was sent okay page. // response.send(page("messagesent")); }); });
นี่คือตัวจัดการสำหรับ /api/message
ที่อยู่. ฟังก์ชันนี้รับข้อมูลที่ส่งจากแบบฟอร์ม สร้างข้อความอีเมลที่เหมาะสม และส่งไปยังที่อยู่อีเมลที่ให้ไว้ใน <your email address>
. หลังจากส่งอีเมลแล้ว ระบบจะส่งผู้ใช้ไปที่ /messagesent
หน้าหนังสือ. มิดเดิลแวร์ตัวแยกวิเคราะห์เนื้อหามีพารามิเตอร์ url ที่บันทึกไว้ใน request.body
แปรผันและผ่านการฆ่าเชื้ออย่างถูกต้อง
รหัสนี้ใช้ได้กับการตั้งค่า Gmail โดยไม่มีการตรวจสอบสิทธิ์แบบสองปัจจัย หากคุณมีการตรวจสอบสิทธิ์แบบสองปัจจัย คุณสามารถอ้างถึง Nodemailer เอกสารประกอบการตั้งค่า
การประมวลผลแบบฟอร์มด้วย rubyPress
ในการส่งอีเมลใน Ruby คุณจะต้องติดตั้ง ruby-gmail ไลบรารีด้วยบรรทัดคำสั่งต่อไปนี้:
gem install ruby-gmail
คุณอาจต้องใช้ sudo
. ทั้งนี้ขึ้นอยู่กับการตั้งค่า Ruby ของคุณ ต่อหน้าคำสั่ง ตอนนี้ในการโหลดไลบรารี ให้เพิ่มบรรทัดต่อไปนี้ที่ด้านบนของ rubyPress.rb
ไฟล์:
require 'gmail' # https://github.com/dcparker/ruby-gmail
หลังจากทั้งหมด get
คำจำกัดความ เพิ่มบรรทัดต่อไปนี้:
post '/api/message' do # # Get the parameters from the form. # name = params[:Name] email = params[:Email] message = params[:Message] # # Create and send the email. # Gmail.new('<your email address>', '<your password>') do |gmail| gmail.deliver do to "<your email address>" from email subject "Message from " + name text_part do body message end end end # # Send the user to the message sent page. # page 'messagesent' end
ด้วยส่วนเพิ่มเติมเหล่านี้ เซิร์ฟเวอร์ rubyPress ของคุณสามารถประมวลผลแบบฟอร์มอีเมลได้ เมื่อคุณเปลี่ยน <your email address>
ไปยังที่อยู่อีเมลของคุณและ <your password>
สำหรับรหัสผ่านสำหรับเซิร์ฟเวอร์อีเมลของคุณ สคริปต์จะเสร็จสิ้น
การประมวลผลแบบฟอร์มด้วย phpPress
เซิร์ฟเวอร์สุดท้ายที่จะแก้ไขคือเซิร์ฟเวอร์ phpPress ในการเพิ่มความสามารถของอีเมลไปยังเซิร์ฟเวอร์ ฉันจะติดตั้ง ไลบรารี phpmailer . นี่เป็นไลบรารี่ที่ใช้กันอย่างแพร่หลายที่สุดใน PHP สำหรับการทำงานกับอีเมล ในการติดตั้งไลบรารี คุณต้องเรียกใช้คำสั่งบรรทัดคำสั่งเหล่านี้ในไดเร็กทอรี phpPress:
composer update composer require phpmailer/phpmailer
ขออภัย การอัปเดตผู้แต่งจะอัปเดตไลบรารี LightnCandy นี่เป็นสิ่งที่ดีเพราะเร็วกว่าและใช้งานง่ายกว่ามาก แต่มันทำลายรหัสเซิร์ฟเวอร์ ในไฟล์ index.php ค้นหา ProcessPage()
และแทนที่ด้วยรหัสต่อไปนี้:
// // Function: ProcessPage // // Description: This function will process // a page into the template, // process all Mustache // macros, and process all // shortcodes. // // Inputs: // $layout The layout for // the page // $page The pages main // contents // function ProcessPage( $layout, $page ) { global $site, $parts, $helpers; // // Get the page contents. // $parts['content'] = figurePage($page); // // First pass on Handlebars. // $phpStr = LightnCandy::compile($layout, $helpers); $renderer = LightnCandy::prepare($phpStr); $page = $renderer($parts); // // Process the shortcodes. // $pageShort = processShortcodes($page); // // Second pass Handlebars. // $phpStr = LightnCandy::compile($pageShort, $helpers); $renderer = LightnCandy::prepare($phpStr); $page = $renderer($parts); // // Return the results. // return($page); }
เมื่อเปรียบเทียบกับรหัสที่เก่ากว่า คุณไม่จำเป็นต้องทำงานกับไฟล์ชั่วคราวอีกต่อไป ทั้งหมดนี้ทำได้ในหน่วยความจำและเร็วกว่ามาก ตอนนี้ ที่ด้านบนของ index.php
ไฟล์เพิ่มหลังไลบรารีหยก:
// // PHP Mailer: https://github.com/PHPMailer/PHPMailer // require 'vendor/phpmailer/phpmailer/PHPMailerAutoload.php';
สิ่งนี้จะโหลดไลบรารี phpmailer ตอนนี้หลังจาก $app->get()
. ล่าสุด ฟังก์ชั่นเพิ่มรหัสนี้:
// // This route is for processing the post request from the // email form on the website. // $app->post('/api/message', function(Request $request, Response $response) { global $_POST; // // Get the post variables. // $Name = $_POST['Name']; $Email = $_POST['Email']; $Message = $_POST['Message']; // // Create the email message and send it. // $mail = new PHPMailer; $mail->isSMTP(); // Set mailer to use SMTP $mail->Host = 'smtp.gmail.com'; // Specify main and backup SMTP servers $mail->SMTPAuth = true; // Enable SMTP authentication $mail->Username = '<your email address>'; // SMTP username $mail->Password = '<your password>'; // SMTP password $mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted $mail->Port = 587; // TCP port to connect to $mail->setFrom($Email, $Name); $mail->addAddress('<your email>', '<your name>'); // Add a recipient $mail->Subject = "Message from $Name"; $mail->Body = $Message; if(!$mail->send()) { echo 'Message could not be sent.'; echo 'Mailer Error: ' . $mail->ErrorInfo; } else { $newResponse = SetBasicHeader($response); $newResponse->getBody()->write(page('messagesent')); return($newResponse); } });
นี่คือตัวจัดการคำขอโพสต์สำหรับ /api/message
เส้นทาง. จะดึงข้อมูลแบบฟอร์มที่ส่งจากเบราว์เซอร์ สร้างอีเมลด้วย และส่งอีเมล PHP นำพารามิเตอร์ URL ใด ๆ มาใส่ในอาร์เรย์ส่วนกลาง $_POST
.
คุณจะต้องเปลี่ยน <your email address>
, <your password>
และ <your name>
ด้วยค่าที่เหมาะสมสำหรับอีเมลของคุณ หากคุณกำลังใช้อย่างอื่นที่ไม่ใช่เซิร์ฟเวอร์ Gmail SMTP คุณจะต้องเปลี่ยน $mail->Host
ที่อยู่ด้วย
บทสรุป
ฉันได้แสดงวิธีการเพิ่มแบบฟอร์มอีเมลไปยังไซต์ pressCMS อย่างง่ายดาย การดาวน์โหลดสำหรับบทช่วยสอนนี้มีเซิร์ฟเวอร์ทั้งหมดที่มีการแก้ไข คุณจึงดาวน์โหลดแทนการพิมพ์ได้ ฉันทำผิดพลาดเล็กน้อยในการจัดการ ฉันจะปล่อยให้ที่เหลือเป็นการออกกำลังกายของคุณ
วิธีที่ฉันสอนที่นี่คือการโพสต์ข้อมูลในแบบฟอร์มพร้อมข้อมูลใน URL ปัจจุบันไซต์จำนวนมากใช้ REST API ด้วยข้อมูลใน JSON สตริงในร่างกายเพื่อดำเนินการ กิจวัตรเหล่านี้ใช้ได้กับวิธีการนั้นอย่างง่ายดาย แต่นั่นเป็นแบบฝึกหัดสำหรับคุณ (หรืออาจจะเป็นบทช่วยสอนในอนาคต) เมื่อคุณทราบวิธีการทำเช่นนี้แล้ว ให้เพิ่มแบบฟอร์มของคุณเองลงในไซต์ของคุณ การปรับแต่งประเภทนี้สนุกมาก ขีดจำกัดเพียงอย่างเดียวคือจินตนาการของคุณ