Hugo வில் PHPMailer மூலம் SSH வழியாக தொடர்பு படிவத்தை நிறுவுதல்

நிலையான தளங்கள் சர்வர்-பக்க குறியீட்டை இயக்காது, ஆனால் தொடர்பு படிவத்திற்கு இன்னும் அது தேவை. SSH வழியாக பகிரப்பட்ட ஹோஸ்டிங்கில் நிறுவப்பட்ட Hugo தளத்தில் PHP/PHPMailer தொடர்பு படிவத்தை நான் எவ்வாறு இணைத்தேன் — மற்றும் வழியில் என்ன தவறாக நடந்தது என்பது இங்கே.

அமைப்பு

தளம் Hugo வில் உருவாக்கப்பட்டுள்ளது மற்றும் வெளியீடு cPanel பகிரப்பட்ட ஹோஸ்டுக்கு rsync செய்யப்படுகிறது. PHP சர்வர்-பக்கத்தில் கிடைக்கிறது, எனவே தொடர்பு படிவம் Hugo வெளியீட்டுடன் public_html/ இல் இருக்கும் contact.php கோப்பிற்கு post செய்கிறது.

PHPMailer SMTP அனுப்புதலைக் கையாளுகிறது. நூலகத்தை நேரடியாக vendor செய்கிறேன் (Composer இல்லை) — கோப்புகள் static/vendor/phpmailer/ இல் உள்ளன மற்றும் Hugo அவற்றை உருவாக்க நேரத்தில் public/ க்கு நகலெடுக்கிறது.

நற்சான்றிதழ்களை Git இலிருந்து வெளியே வைத்தல்

SMTP நற்சான்றிதழ்கள் ஒருபோதும் commit செய்யப்படக்கூடாது. அணுகுமுறை:

  • contact.php require __DIR__ . '/mail-config.php'; ஐ அழைக்கிறது
  • mail-config.php மாறிலிகளை (SMTP_HOST, SMTP_USER, SMTP_PASS, முதலியன) வரையறுக்கிறது
  • static/mail-config.php .gitignore இல் சேர்க்கப்பட்டுள்ளது
  • static/mail-config.example.php குறிப்பு வார்ப்புருவாக commit செய்யப்பட்டுள்ளது

சர்வரில், mail-config.php க்கு chmod 600 — செயல்முறை உரிமையாளரால் மட்டுமே படிக்கக்கூடியது.

SSH வழியாக நிறுவல்

நிறுவல் கட்டளை:

hugo && rsync -avz --exclude='mail-config.php' \
  -e "ssh -p 7822" \
  public/ user@ftp.example.com:~/public_html/ \
  && ssh -p 7822 user@ftp.example.com \
     "chmod 600 ~/public_html/mail-config.php"

முக்கிய புள்ளிகள்:

  • --exclude='mail-config.php' நேரடி நற்சான்றிதழ் கோப்பை rsync மேலெழுதுவதைத் தடுக்கிறது
  • chmod 600 ஒவ்வொரு நிறுவலுக்குப் பின்னும் பாதுகாப்பாக மீண்டும் பயன்படுத்தப்படுகிறது

SMTP பிழைத்திருத்தம்

mail-config.php இல் உள்ள நற்சான்றிதழ்கள் ஆரம்பத்தில் தவறாக இருந்தன. கண்டறிய, சர்வரில் நேரடியாக SMTPDebug = 2 உடன் PHPMailer ஐ இயக்கும் சோதனை ஸ்கிரிப்டை பதிவேற்றினேன்:

scp -P 7822 smtp_test.php user@ftp.example.com:/tmp/
ssh -p 7822 user@ftp.example.com "php /tmp/smtp_test.php; rm /tmp/smtp_test.php"

பிழைத்திருத்த வெளியீடு உடனடியாக 535 Incorrect authentication data ஐக் காட்டியது — இது நற்சான்றிதழ்கள் என்பதை உறுதிப்படுத்தியது, ஃபயர்வால் அல்லது TLS சிக்கல் அல்ல. சரிசெய்த பின், வெளியீடு 235 Authentication succeeded ஐக் காட்டியது மற்றும் அஞ்சல் வழங்கப்பட்டது.

கோப்பு அனுமதிகள்

பகிரப்பட்ட ஹோஸ்டிங் கோப்பு அனுமதிகள் குறித்து கடுமையானது. விதிகள்:

வகை அனுமதி
அடைவுகள் 755
கோப்புகள் 644
முக்கிய கட்டமைப்பு 600

Hugo static/ இலிருந்து கோப்புகளை அவற்றின் மூல அனுமதிகளை பாதுகாத்து நகலெடுக்கிறது. மூல கோப்புகளுக்கு தவறான முறைகள் இருந்தால், அவை சர்வரில் தவறாக இருக்கும். மூலத்தில் ஒருமுறை சரிசெய்யுங்கள்:

find static -type f -exec chmod 644 {} \;
find static -type d -exec chmod 755 {} \;

அதன் பிறகு, ஒவ்வொரு hugo உருவாக்கமும் சரியான அனுமதிகளுடன் வெளியீட்டை உருவாக்குகிறது மற்றும் rsync அதை சுத்தமாக பரப்புகிறது — எதிர்கால நிறுவல்களில் சர்வர்-பக்க திருத்தங்கள் தேவையில்லை.

கைமுறையாக கவனிக்க வேண்டிய இரண்டு கோப்புகள்:

  • .htaccess நேரடியாக public_html/ இல் உள்ளது, Hugo ஆல் நிர்வகிக்கப்படவில்லை. ஒருமுறை அமைக்கவும்: chmod 644 .htaccess. இந்த கோப்பைப் படிக்க முடியாவிட்டால் Apache எந்த பக்கத்தையும் வழங்க முடியாது.
  • mail-config.php rsync இலிருந்து விலக்கப்பட்டுள்ளது மற்றும் chmod 600 ஆக இருக்க வேண்டும் — நிறுவல் கட்டளை இதைக் கையாளுகிறது.

தொடர்பு படிவம்: வெற்று POST க்கு பதிலாக Fetch

அசல் படிவம் வெற்று HTML <form action="..."> POST ஐ பயன்படுத்தியது. இது வேலை செய்யும் ஆனால் சரிபார்ப்பு தோல்வியடையும்போது உலாவி பக்கத்தில் மூல JSON ஐ காட்டுகிறது — பயனர் {"ok":false,"errors":[...]} ஐ பார்த்து Back அழுத்த வேண்டும்.

மேம்படுத்தப்பட்ட பதிப்பு fetch மூலம் submit ஐ இடைமறிக்கிறது:

  • கிளையன்ட்-பக்க சரிபார்ப்பு முதலில் இயங்குகிறது — வெளிப்படையான பிழைகள் ஒருபோதும் சர்வரை அடையாது
  • சர்வர் பிழைகள் inline புல ஹைலைட்களுக்கு மீண்டும் வரைபடமாக்கப்படுகின்றன
  • வெற்றியில், JS /{lang}/contact/?sent=1 க்கு திருப்பி விடுகிறது — சரியான நன்றி பக்கம்

Hugo வார்ப்புருக்களில் ஒரு சிக்கல்: | jsonify வடிகட்டி ஒரு சரம் மதிப்பை JSON மேற்கோள்களில் மூடுகிறது. /contact.php போன்ற param இல் இது "/contact.php" ஐ உருவாக்குகிறது — சரியானது. ஆனால் இருமுறை பயன்படுத்தினால் "\"/contact.php\"" ஐ உருவாக்குகிறது, இது நேரடி மேற்கோள் எழுத்துகளைக் கொண்ட URL ஆகும். fetch அமைதியாக தோல்வியடைகிறது. அதற்கு பதிலாக வெற்று interpolation ஐ பயன்படுத்தவும்:

var action = "{{ .Site.Params.contactFormAction }}";

மேலும் contact.php இன் மேலே ini_set('display_errors', '0'); ஐ சேர்க்கவும். PHP எச்சரிக்கைகள் இயக்கப்பட்டிருந்தால், அவை JSON பதில் உடலுக்கு முன்னால் சேர்க்கப்படுகின்றன, உலாவியில் JSON.parse ஐ உடைக்கின்றன.

சுருக்கம்

சிக்கல் தீர்வு
Git இல் நற்சான்றிதழ்கள் தனி mail-config.php, gitignore செய்யப்பட்டது, chmod 600
SMTP அங்கீகார தோல்வி சர்வரில் SMTPDebug = 2 உடன் சோதனை ஸ்கிரிப்ட்
அனைத்து பக்கங்களிலும் 403 .htaccess 700 ஆக இருந்தது — 644 ஆக மாற்றப்பட்டது
படங்களில் 403 static/ மூல கோப்புகளுக்கு தவறான அனுமதிகள் இருந்தன — மூலத்தில் சரிசெய்யப்பட்டது
உலாவியில் JSON parse பிழை display_errors=1 PHP எச்சரிக்கைகளை பதில் உடலில் கசிய வைத்தது
submit இல் “ஏதோ தவறு ஏற்பட்டது” `