ایجاد اسکریپت و فرم ایمیل با PHP — به زبان ساده
فرمها در صفحات وب میتوانند برای مقاصد مختلفی مورد استفاده قرار گیرند و یکی از این موارد، ایجاد ارتباط بین بازدیدکنندگان و مالکان یک وبسایت است. در بخش قبلی این نوشته به شیوه ایجاد «یک فرم تماس با امکانات کامل در PHP» پرداختیم. در این راهنما روی ایجاد فرم ایمیل با PHP متمرکز میشویم که برای مقاصد دیگر، مانند گردآوری اطلاعات متقاضایان استخدام، رزرو اتاقهای هتل و غیره استفاده میشوند.
انتخاب فیلدهای مناسب برای فرم
در راهنمای فرم تماس با ما آموختیم که سازمانها و وبسایتهای مختلف احتمالاً میخواهند اطلاعات خاصی را از افرادی که با آنها تماس میگیرند داشته باشند تا بتوانند به بهترین روش ممکن به آنها پاسخ دهند. برای نمونه یک فرم تماس با ما در وبسایت یک مدرسه ممکن است از والدین بخواهد که اطلاعاتی در مورد فرزندشان که در مدرسه ثبت نام کرده است ارائه کنند. به طور مشابه فرم تماس با ما در یک وبسایت فروشگاهی احتمالاً اطلاعاتی در مورد آخرین محصولی که افراد از فروشگاه سفارش داده یا خریداری کردهاند گردآوری میکند تا پاسخهای بهتری به مشتریانش بدهد.
حال که دیدیم فرمهای تماس در میان وبسایتها و سازمانهای مختلف تا چه حد میتوانند متفاوت باشد، معقول است که تصور کنیم فرمهایی که قرار است مقاصد کاملاً متفاوتی داشته باشند تا چه حد فیلدهای مختلفی میتوانند داشته باشند. برای نمونه احتمالاً از افرادی که میخواهند یک اتاق هتل را رزرو کنند باید بپرسید آیا قرار است فرد بزرگسال یا کودکی را به عنوان همراه داشته باشند یا نه. بدیهی است که پرسیدن چنین سؤالی از یک متقاضی شغل موضوعیت نخواهد داشت.
این موضوع مهمی است که باید هنگام مطالعه این راهنما همواره در ذهن خود داشته باشید. هدف اصلی ایجاد یک فرم، گردآوری همه اطلاعات است و ارسال این اطلاعات به جایی از طریق ایمیل نیز همین مقصود را برآورده میکند؛ اما کد این کار باید بسته به موضوع مورد بررسی تغییر یابد. ممکن است بخواهید فیلدهای ورودی مختلفی به فرمهای خود اضافه کنید و نامهای متفاوتی برای این فیلدها تعیین کنید. سپس این موضوع روی کد PHP در بکاند نیز تایر میگذارد. اگر تغییراتی در فرمها ایجاد کنید، باید اطمینان پیدا کنید که کد PHP را نیز بهروزرسانی کردهاید.
ایجاد فرم HTML
در این راهنما به عنوان نمونه یک فرم برای رزرو اتاقهای هتل طراحی میکنیم. برای سادگی از هیچ کد جاوا اسکریپت یا کتابخانه PHP دیگری استفاده نخواهیم کرد.
با این ذهنیت در ادامه شکل کلی فرم خودمان را طراحی میکنیم. ما باید از افراد بخواهیم که برای رزرواسیون اتاق، نام، آدرس ایمیل، و شماره تلفنشان را وارد کنند. سپس از آنها میخواهیم که جزییاتی در مورد تعداد فرزندان و بزرگسالانی که آنها را همراهی خواهد کرد ارائه کنند و تاریخهای ورود و خروج و نوع اتاق ترجیحی را نیز انتخاب کنند. در نهایت از آنها میخواهیم که مواردی که قبل از ورود آنها باید بدانیم را به ما اطلاع دهند.
1<form action="reservation.php" method="post">
2 <div class="elem-group">
3 <label for="name">Your Name</label>
4 <input type="text" id="name" name="visitor_name" placeholder="John Doe" pattern=[A-Z\sa-z]{3,20} required>
5 </div>
6 <div class="elem-group">
7 <label for="email">Your E-mail</label>
8 <input type="email" id="email" name="visitor_email" placeholder="john.doe@email.com" required>
9 </div>
10 <div class="elem-group">
11 <label for="phone">Your Phone</label>
12 <input type="tel" id="phone" name="visitor_phone" placeholder="498-348-3872" pattern=(\d{3})-?\s?(\d{3})-?\s?(\d{4}) required>
13 </div>
14 <hr>
15 <div class="elem-group inlined">
16 <label for="adult">Adults</label>
17 <input type="number" id="adult" name="total_adults" placeholder="2" min="1" required>
18 </div>
19 <div class="elem-group inlined">
20 <label for="child">Children</label>
21 <input type="number" id="child" name="total_children" placeholder="2" min="0" required>
22 </div>
23 <div class="elem-group inlined">
24 <label for="checkin-date">Check-in Date</label>
25 <input type="date" id="checkin-date" name="checkin" required>
26 </div>
27 <div class="elem-group inlined">
28 <label for="checkout-date">Check-out Date</label>
29 <input type="date" id="checkout-date" name="checkout" required>
30 </div>
31 <div class="elem-group">
32 <label for="room-selection">Select Room Preference</label>
33 <select id="room-selection" name="room_preference" required>
34 <option value="">Choose a Room from the List</option>
35 <option value="connecting">Connecting</option>
36 <option value="adjoining">Adjoining</option>
37 <option value="adjacent">Adjacent</option>
38 </select>
39 </div>
40 <hr>
41 <div class="elem-group">
42 <label for="message">Anything Else?</label>
43 <textarea id="message" name="visitor_message" placeholder="Tell us anything else that might be important." required></textarea>
44 </div>
45 <button type="submit">Book The Rooms</button>
46</form>
اعتبارسنجی
ما از دو الگوی مقدماتی برای برسی معتبر بودن نام و شماره تلفن ارائه شده استفاده کردهایم. شمارههای تلفن در کشورهای گوناگون از قالبهای متفاوتی پیروی میکنند. این بدان معنی است که باید مقدار خصوصیت الگو را بر همین مبنا بهروزرسانی کنید.
همچنین باید مقدار کمینه بزرگسالان و فرزندان را به ترتیب برابر با 1 و 0 تعیین کنیم. بدین ترتیب میتوانیم از بروز خطا در وارد کردن مقادیر منفی از سوی کاربران جلوگیری کنیم.
ضمناً میتوانیم عناصر دیگری به فرم اضافه کنیم که برای خدمات دیگری مانند تاکسی هتل، خدمات اتاق و غیره که هتل ارائه میدهد استفاده میشوند.
تا به اینجا بازدیدکنندگان میتوانند تاریخهای ورود و خروج را برای مقادیر گذشته نیز تنظیم کنند. ما میتوانیم با افزودن مقدار خصوصی min روی هر دو تاریخ ورود و خروج از این وضعیت جلوگیری کنیم. در مورد این مثال، مقدار کمینه مورد نیاز برای تاریخ ورود معادل روز جاری خواهد بود. مقدار خصوصیت min برای تاریخ خروج نیز همان تاریخ ورود خواهد بود.
کد جاوا اسکریپت زیر این منطق را برای ما پیادهسازی میکند. ماهها از 0 آغاز میشوند و از این رو 1 را به مقدار بازگشتی اضافه میکنیم تا ماه واقعی به دست آید. مقدار تاریخ بازگشتی بسته به زمان کنونی، میتواند هر عدد صحیحی از 1 تا 31 باشد.
زمانی که مقادیر تاریخ و ماه دارای یک رقم باشند، یک عدد 0 به ابتدای آنها اضافه میکنیم به طوری که رشته نهایی دارای قالب معتبری باشد.
1var currentDateTime = new Date();
2var year = currentDateTime.getFullYear();
3var month = (currentDateTime.getMonth() + 1);
4var date = currentDateTime.getDate();
5
6if(date < 10) {
7 date = '0' + date;
8}
9if(month < 10) {
10 month = '0' + month;
11}
12
13var dateTomorrow = year + "-" + month + "-" + date;
14var checkinElem = document.querySelector("#checkin-date");
15var checkoutElem = document.querySelector("#checkout-date");
16
17checkinElem.setAttribute("min", dateTomorrow);
18
19checkinElem.onchange = function () {
20 checkoutElem.setAttribute("min", this.value);
21}
اینک فرم ما پس از افزودن فایل نشانهگذاری HTML و کدهای جاوا اسکریپت به شکل زیر در آمده است:
ارسال دادههای فرم از طریق ایمیل با استفاده از PHP
مرحله نهایی شامل گردآوری همه دادهها از فرم و ارسال آنها به افراد مرتبط در یک ایمیل است. انجام این کار در عمل بسیار آسان است. ابتدا همه اطلاعات را با استفاده از متغیرهای POST_$ گردآوری میکنیم. زمانی که اطلاعات مورد نیاز جمعآوری شد؛ آنها را با حذف موارد مخرب پاکسازی میکنیم. در نهایت بدنه ایمیل HTML را ایجاد میکنیم و آن را با استفاده از تابع ()mail در PHP ارسال میکنیم.
کد زیر در فایلی به نام reservation.php قرار میگیرد. در صورتی که مقدار خصوصیت action فرم در بخش قبلی تغییر یابد، نام فایل متفاوت خواهد بود.
1<?php
2
3if($_POST) {
4 $visitor_name = "";
5 $visitor_email = "";
6 $visitor_phone = "";
7 $total_adults = "";
8 $total_children = "";
9 $checkin_date = "";
10 $checkout_date = "";
11 $room_type = "";
12 $visitor_message = "";
13
14 if(isset($_POST['visitor_name'])) {
15 $visitor_name = filter_var($_POST['visitor_name'], FILTER_SANITIZE_STRING);
16 }
17
18 if(isset($_POST['visitor_email'])) {
19 $visitor_email = str_replace(array("\r", "\n", "%0a", "%0d"), '', $_POST['visitor_email']);
20 $visitor_email = filter_var($visitor_email, FILTER_VALIDATE_EMAIL);
21
22 }
23
24 if(isset($_POST['visitor_phone'])) {
25 $visitor_phone = filter_var($_POST['visitor_phone'], FILTER_SANITIZE_NUMBER_INT);
26 }
27
28 if(isset($_POST['total_adults'])) {
29 $total_adults = filter_var($_POST['total_adults'], FILTER_SANITIZE_NUMBER_INT);
30 }
31
32 if(isset($_POST['total_children'])) {
33 $total_children = filter_var($_POST['total_children'], FILTER_SANITIZE_NUMBER_INT);
34 }
35
36 if(isset($_POST['checkin'])) {
37 $checkin_date = filter_var($_POST['checkin'], FILTER_SANITIZE_NUMBER_INT);
38 }
39
40 if(isset($_POST['checkout'])) {
41 $checkout_date = filter_var($_POST['checkout'], FILTER_SANITIZE_NUMBER_INT);
42 }
43
44 if(isset($_POST['room_preference'])) {
45 $room_type = filter_var($_POST['room_preference'], FILTER_SANITIZE_STRING);
46 }
47
48 if(isset($_POST['visitor_message'])) {
49 $visitor_message = htmlspecialchars($_POST['visitor_message']);
50 }
51
52
53 $recipient = "booking@demo.com";
54
55 $headers = 'MIME-Version: 1.0' . "\r\n"
56 .'Content-type: text/html; charset=utf-8' . "\r\n"
57 .'From: ' . $visitor_email . "\r\n";
58
59 $email_content = "<html><body>";
60 $email_content .= "<table style='font-family: Arial;'><tbody><tr><td style='background: #eee; padding: 10px;'>Visitor Name</td><td style='background: #fda; padding: 10px;'>$visitor_name</td></tr>";
61 $email_content .= "<tr><td style='background: #eee; padding: 10px;'>Visitor Email</td><td style='background: #fda; padding: 10px;'>$visitor_email</td></tr>";
62 $email_content .= "<tr><td style='background: #eee; padding: 10px;'>Visitor Phone</td><td style='background: #fda; padding: 10px;'>$visitor_phone</td></tr>";
63 $email_content .= "<tr><td style='background: #eee; padding: 10px;'>Total Adults</td><td style='background: #fda; padding: 10px;'>$total_adults</td></tr>";
64 $email_content .= "<tr><td style='background: #eee; padding: 10px;'>Total Children</td><td style='background: #fda; padding: 10px;'>$total_children</td></tr>";
65 $email_content .= "<tr><td style='background: #eee; padding: 10px;'>Check-in Date</td><td style='background: #fda; padding: 10px;'>$checkin_date</td></tr>";
66 $email_content .= "<tr><td style='background: #eee; padding: 10px;'>Check-out Date</td><td style='background: #fda; padding: 10px;'>$checkout_date</td></tr>";
67 $email_content .= "<tr><td style='background: #eee; padding: 10px;'>Room Type</td><td style='background: #fda; padding: 10px;'>$room_type</td></tr></tbody></table>";
68
69 $email_content .= "<p style='font-family: Arial; font-size: 1.25rem;'><strong>Special Request from $visitor_name —</strong><i> $visitor_message</i>.</p>";
70 $email_content .= '</body></html>';
71
72 echo $email_content;
73
74 if(mail($recipient, "Hotel Room Reservation Confirmation", $email_content, $headers)) {
75 echo '<p>Thank you for booking a hotel room with us. We hope you have a pleasant stay.</p>';
76 } else {
77 echo '<p>We are sorry but the booking confirmation email did not go through.</p>';
78 }
79
80} else {
81 echo '<p>Something went wrong</p>';
82}
83
84?>
در کد فوق ما کار خود را با پاکسازی نام و نشانی ایمیل بازدیدکننده آغاز میکنیم. پس از آن تاریخ ورودی، تاریخ خروجی، تعداد بزرگسالان و تعداد کودکان را با استفاده از فلگ FILTER_SANITIZE_NUMBER_INT پاکسازی میکنیم. این فلگ همه کاراکترها به جز رقمها و علامتهای + و - را از ورودی حذف میکند. این فلگ برای پاکسازی تاریخها بسیار مفید است، زیرا ما آنها را در قالب YYYY-MM-DD صرفاً به صورت رقم و علامت (-) میپذیریم. برای کسب اطلاعات بیشتر در مورد فلگ پاکسازی ورودیها (+) و اعتبارسنجی (+) به مستندات PHP مراجعه کنید.
زمانی که همه ورودیها پاکسازی شدند، شروع به آمادهسازی هدرها میکنیم. با گنجاندن مقدار Content-type: text/html در هدرهای ایمیل، میتوانیم از تگهای HTML در ایمیل خود بهره بگیریم. در این راهنما، ایمیل را ساده طراحی میکنیم و همه دادهها را درون یک جدول به کاربر نمایش میدهیم. هر پیام خاصی که از سوی افراد رزرو کنده اتاق ارائه شده باشد، در زیر جدول نمایش مییابد.
سخن پایانی
در این راهنما، به معرفی مبانی ایجاد یک اسکریپت ایمیل PHP پرداختیم که دادههای ارائه شده از سوی کاربران وبسایت را به ما ارسال میکند. زمانی که فرم ایجاد میشود لازم است که عناصر به طور درستی چیده شوند و صرفاً اطلاعاتی که واقعاً ضروری هستند پرسیده شوند. ایجاد یک فرم که به صورت غیرضروری طولانی است و چیدمان نامناسب عناصر فرم مانع این میشود که کاربران آن را پر کنند. همچنین باید اطمینان پیدا کنید که همه عناصر به طرز صحیحی نامگذاری شدهاند. پاکسازی صحیح ورودی کاربر نیز بسیار حائز اهمیت است.
اگر تاکنون فرمهایی برای خود ایجاد نکرده باشید و یا با PHP آشنایی نداشته باشید، بهتر است از اسکریپتهای ایجاد شده از سوی افراد متخصص استفاده کنید. این فرمها امکاناتی مانند کپچا، زمانبندی ارسال ایمیل و آپلود فایل را نیز دارند.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزش های برنامه نویسی PHP
- آموزش برنامه نویسی PHP
- مجموعه آموزشهای برنامهنویسی
- آموزش فریمورک PHP Laravel برای ساخت فروشگاه اینترنتی
- آموزش پروژه محور PHP — مجموعه مقالات جامع وبلاگ فرادرس
- برنامهنویسی PHP و هر آنچه برای شروع باید بدانید — آموزش جامع
==
با سلام و وقت بخیر، بنده طبق مطالب بالا فرم رو ساختم اما هنگام دریافت فرم با خطای زیر مواجه میشم:
HTTP Error 405.0 – Method Not Allowed
The page you are looking for cannot be displayed because an invalid method (HTTP verb) is being used.