# การตั้งค่าการส่งอีเมลสำหรับ Production

## 📋 สารบัญ

1. [ภาพรวม](#ภาพรวม)
2. [การตั้งค่าอีเมลผู้ส่ง](#การตั้งค่าอีเมลผู้ส่ง)
3. [การตั้งค่า URL สำหรับแบบประเมิน](#การตั้งค่า-url-สำหรับแบบประเมิน)
4. [การ Redirect ไปหน้า Login ของ ServTrack](#การ-redirect-ไปหน้า-login-ของ-servtrack)
5. [การตั้งค่า Environment Variables](#การตั้งค่า-environment-variables)
6. [การแก้ไข Code](#การแก้ไข-code)
7. [การทดสอบ](#การทดสอบ)
8. [การ Deploy](#การ-deploy)
9. [การแก้ไขปัญหา](#การแก้ไขปัญหา)
10. [Checklist](#checklist)

---

## ภาพรวม

เมื่อนำระบบไปใช้งาน Production จะมีการเปลี่ยนแปลงสำคัญดังนี้:

1. **อีเมลผู้ส่ง** - เปลี่ยนจากอีเมลทดสอบเป็นอีเมลจริงของ SQUAT
2. **URL แบบประเมิน** - เปลี่ยนจาก localhost เป็น URL ของ ServTrack
3. **การ Redirect** - เมื่อผู้ใช้กดปุ่ม "ทำแบบประเมินตอนนี้" จะ redirect ไปหน้า login ของ ServTrack แทนระบบของตัวเอง

---

## การตั้งค่าอีเมลผู้ส่ง

### 1. ตั้งค่าใน `.env`

แก้ไขไฟล์ `.env` ใน production:

```env
# Mail Configuration - Production
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=squat@nectec.or.th
MAIL_PASSWORD=your-app-password-here
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="squat@nectec.or.th"
MAIL_FROM_NAME="ห้องปฏิบัติการทดสอบซอฟต์แวร์ SQUAT"
```

### 2. ข้อมูลที่ต้องทราบ

#### อีเมลผู้ส่ง (MAIL_FROM_ADDRESS)
- **Production**: `squat@nectec.or.th`
- **Development**: อีเมลทดสอบ (เช่น `sahapongyothinaritach@gmail.com`)

#### ชื่อผู้ส่ง (MAIL_FROM_NAME)
- **Production**: `ห้องปฏิบัติการทดสอบซอฟต์แวร์ SQUAT`
- หรือ `SQUAT - NECTEC`

#### App Password (MAIL_PASSWORD)
- ต้องสร้าง App Password จาก Gmail (ไม่ใช่รหัสผ่านปกติ)
- สำหรับอีเมล `squat@nectec.or.th` ต้องติดต่อผู้ดูแลระบบ G Suite

### 3. ตรวจสอบการตั้งค่า

```bash
php artisan tinker --execute="
echo 'From Address: ' . config('mail.from.address') . PHP_EOL;
echo 'From Name: ' . config('mail.from.name') . PHP_EOL;
echo 'Mail Host: ' . config('mail.mailers.smtp.host') . PHP_EOL;
"
```

### 4. Clear Config Cache

หลังจากแก้ไข `.env`:

```bash
php artisan config:clear
php artisan cache:clear
```

---

## การตั้งค่า URL สำหรับแบบประเมิน

### 1. ปัญหาที่ต้องแก้ไข

**ปัจจุบัน**: Email ส่ง URL แบบนี้:
```
http://localhost:8000/survey/{token}
```

**Production**: ต้องเปลี่ยนเป็น:
```
https://servtrack.com/survey/{token}
```

### 2. ตั้งค่าใน `.env`

```env
# ServTrack Integration - Production
SERVTRACK_INTEGRATED=true
SERVTRACK_BASE_URL=https://servtrack.com
SERVTRACK_LOGIN_URL=https://servtrack.com/login
SERVTRACK_SURVEY_URL=https://servtrack.com/survey
```

### 3. แก้ไข Mail Class

แก้ไขไฟล์ `app/Mail/SurveyInvitationMail.php`:

```php
public function build()
{
    // ตรวจสอบว่า integrate กับ ServTrack หรือไม่
    $isIntegrated = env('SERVTRACK_INTEGRATED', false);
    
    if ($isIntegrated) {
        // Production: ใช้ URL ของ ServTrack
        $baseUrl = env('SERVTRACK_BASE_URL', 'https://servtrack.com');
        $surveyUrl = "{$baseUrl}/survey/{$this->invitation->token}";
    } else {
        // Development: ใช้ URL ของตัวเอง
        $surveyUrl = route('survey.take', ['token' => $this->invitation->token]);
    }

    return $this->view('emails.survey-invitation')
        ->subject('แบบประเมินความพึงพอใจ - ' . $this->survey->Survey_Name)
        ->with([
            'customerName' => $this->customer->Customer_Name,
            'surveyName' => $this->survey->Survey_Name,
            'surveyDescription' => $this->survey->Survey_Description,
            'serviceRequestCode' => $this->serviceRequest->ServiceRequestID ?? 'ไม่ระบุ',
            'serviceModel' => $this->serviceRequest->Model_Name ?? 'ไม่ระบุ',
            'expiresAt' => $this->invitation->expires_at,
            'surveyUrl' => $surveyUrl,
        ]);
}
```

---

## การ Redirect ไปหน้า Login ของ ServTrack

### 1. ปัญหาที่ต้องแก้ไข

**ปัจจุบัน**: เมื่อผู้ใช้คลิกปุ่ม "ทำแบบประเมินตอนนี้" และยังไม่ล็อกอิน:
- จะ redirect ไป `http://localhost:8000/login`

**Production**: ต้อง redirect ไป:
- `https://servtrack.com/login`

### 2. แก้ไข Controller

แก้ไขไฟล์ `app/Http/Controllers/SurveyController.php`:

```php
public function showSurveyByToken($token)
{
    try {
        // ตรวจสอบว่าผู้ใช้ล็อกอินแล้ว
        if (!Auth::check()) {
            // ตรวจสอบว่า integrate กับ ServTrack หรือไม่
            $isIntegrated = env('SERVTRACK_INTEGRATED', false);
            
            if ($isIntegrated) {
                // Production: redirect ไป ServTrack login
                $servtrackLoginUrl = env('SERVTRACK_LOGIN_URL', 'https://servtrack.com/login');
                return redirect($servtrackLoginUrl)
                    ->with('error', 'กรุณาล็อกอินก่อนทำแบบประเมิน');
            } else {
                // Development: redirect ไประบบของตัวเอง
                return redirect()->route('login')
                    ->with('error', 'กรุณาล็อกอินก่อนทำแบบประเมิน');
            }
        }

        // ... ส่วนที่เหลือเหมือนเดิม
        $invitation = SurveyInvitation::with(['survey', 'customer', 'serviceRequest'])
            ->where('token', $token)
            ->first();
        
        // ... validation และแสดงแบบประเมิน
    }
}
```

### 3. Flow การทำงาน

#### Development Mode
```
ผู้ใช้คลิกปุ่ม "ทำแบบประเมินตอนนี้"
         ↓
ไปที่ localhost:8000/survey/{token}
         ↓
ตรวจสอบ Auth
         ↓
ไม่ล็อกอิน → redirect ไป localhost:8000/login
```

#### Production Mode (ServTrack)
```
ผู้ใช้คลิกปุ่ม "ทำแบบประเมินตอนนี้"
         ↓
ไปที่ servtrack.com/survey/{token}
         ↓
ตรวจสอบ Auth
         ↓
ไม่ล็อกอิน → redirect ไป servtrack.com/login
```

---

## การตั้งค่า Environment Variables

### 1. ไฟล์ `.env` สำหรับ Production

สร้างไฟล์ `.env.production` หรือแก้ไข `.env`:

```env
# App Configuration
APP_ENV=production
APP_DEBUG=false
APP_URL=https://servtrack.com

# Database Configuration
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3307
DB_DATABASE=satisfaction_survey
DB_USERNAME=your_username
DB_PASSWORD=your_password

# Mail Configuration
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=squat@nectec.or.th
MAIL_PASSWORD=your-app-password-here
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="squat@nectec.or.th"
MAIL_FROM_NAME="ห้องปฏิบัติการทดสอบซอฟต์แวร์ SQUAT"

# ServTrack Integration
SERVTRACK_INTEGRATED=true
SERVTRACK_BASE_URL=https://servtrack.com
SERVTRACK_LOGIN_URL=https://servtrack.com/login
SERVTRACK_SURVEY_URL=https://servtrack.com/survey
```

### 2. ไฟล์ `.env` สำหรับ Development

```env
# App Configuration
APP_ENV=local
APP_DEBUG=true
APP_URL=http://localhost:8000

# Mail Configuration
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=your-test-email@gmail.com
MAIL_PASSWORD=your-test-app-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="your-test-email@gmail.com"
MAIL_FROM_NAME="ระบบประเมินความพึงพอใจ"

# ServTrack Integration
SERVTRACK_INTEGRATED=false
SERVTRACK_BASE_URL=http://localhost:8000
SERVTRACK_LOGIN_URL=http://localhost:8000/login
SERVTRACK_SURVEY_URL=http://localhost:8000/survey
```

---

## การแก้ไข Code

### 1. แก้ไข Mail Class

**ไฟล์**: `app/Mail/SurveyInvitationMail.php`

```php
public function build()
{
    // ตรวจสอบว่า integrate กับ ServTrack หรือไม่
    $isIntegrated = env('SERVTRACK_INTEGRATED', false);
    
    if ($isIntegrated) {
        // Production: ใช้ URL ของ ServTrack
        $baseUrl = env('SERVTRACK_BASE_URL', 'https://servtrack.com');
        $surveyUrl = "{$baseUrl}/survey/{$this->invitation->token}";
    } else {
        // Development: ใช้ URL ของตัวเอง
        $surveyUrl = route('survey.take', ['token' => $this->invitation->token]);
    }

    return $this->view('emails.survey-invitation')
        ->subject('แบบประเมินความพึงพอใจ - ' . $this->survey->Survey_Name)
        ->with([
            'customerName' => $this->customer->Customer_Name,
            'surveyName' => $this->survey->Survey_Name,
            'surveyDescription' => $this->survey->Survey_Description,
            'serviceRequestCode' => $this->serviceRequest->ServiceRequestID ?? 'ไม่ระบุ',
            'serviceModel' => $this->serviceRequest->Model_Name ?? 'ไม่ระบุ',
            'expiresAt' => $this->invitation->expires_at,
            'surveyUrl' => $surveyUrl,
        ]);
}
```

### 2. แก้ไข SurveyController

**ไฟล์**: `app/Http/Controllers/SurveyController.php`

```php
public function showSurveyByToken($token)
{
    try {
        // ตรวจสอบว่าผู้ใช้ล็อกอินแล้ว
        if (!Auth::check()) {
            // ตรวจสอบว่า integrate กับ ServTrack หรือไม่
            $isIntegrated = env('SERVTRACK_INTEGRATED', false);
            
            if ($isIntegrated) {
                // Production: redirect ไป ServTrack login
                $servtrackLoginUrl = env('SERVTRACK_LOGIN_URL', 'https://servtrack.com/login');
                return redirect($servtrackLoginUrl)
                    ->with('error', 'กรุณาล็อกอินก่อนทำแบบประเมิน');
            } else {
                // Development: redirect ไประบบของตัวเอง
                return redirect()->route('login')
                    ->with('error', 'กรุณาล็อกอินก่อนทำแบบประเมิน');
            }
        }

        $invitation = SurveyInvitation::with(['survey', 'customer', 'serviceRequest'])
            ->where('token', $token)
            ->first();

        if (!$invitation) {
            return view('survey.error', [
                'message' => 'ไม่พบแบบประเมินหรือ Token ไม่ถูกต้อง'
            ]);
        }

        // ตรวจสอบว่าแบบประเมินนี้เป็นของผู้ใช้ที่ล็อกอินหรือไม่
        $currentUserId = Auth::id();
        if ($invitation->Customer_ID != $currentUserId) {
            return view('survey.error', [
                'message' => 'คุณไม่มีสิทธิ์เข้าถึงแบบประเมินนี้'
            ]);
        }

        // ตรวจสอบว่าแบบประเมินหมดอายุหรือไม่
        if ($invitation->expires_at && $invitation->expires_at->isPast()) {
            return view('survey.error', [
                'message' => 'แบบประเมินนี้หมดอายุแล้ว'
            ]);
        }

        // ตรวจสอบว่าแบบประเมินเสร็จสิ้นแล้วหรือไม่
        if ($invitation->status === 'completed') {
            return view('survey.completed', [
                'message' => 'คุณทำแบบประเมินนี้เสร็จแล้ว'
            ]);
        }

        // อัปเดตสถานะเมื่อเปิด email (ครั้งแรกเท่านั้น)
        if ($invitation->status === 'sent' && !$invitation->email_opened_at) {
            $invitation->update([
                'status' => 'opened',
                'email_opened_at' => now()
            ]);
        }

        // ... ดึงคำถามและแสดงแบบประเมิน (เหมือนเดิม)
    } catch (\Exception $e) {
        return view('survey.error', [
            'message' => 'เกิดข้อผิดพลาด: ' . $e->getMessage()
        ]);
    }
}
```

---

## การทดสอบ

### 1. ทดสอบใน Development

#### ขั้นตอนที่ 1: ตั้งค่า Development

```env
SERVTRACK_INTEGRATED=false
MAIL_FROM_ADDRESS="test@example.com"
MAIL_FROM_NAME="Test System"
```

#### ขั้นตอนที่ 2: ส่งอีเมลทดสอบ

```bash
php artisan tinker --execute="
use App\Models\SurveyInvitation;
use App\Mail\SurveyInvitationMail;
use Illuminate\Support\Facades\Mail;
\$invitation = SurveyInvitation::latest()->first();
\$mail = new SurveyInvitationMail(\$invitation, \$invitation->customer, \$invitation->survey, \$invitation->serviceRequest);
Mail::to('test@example.com')->send(\$mail);
echo 'Email sent successfully';
"
```

#### ขั้นตอนที่ 3: ตรวจสอบ URL ใน Email

- เปิดอีเมลทดสอบ
- ตรวจสอบว่า URL ในปุ่มเป็น `http://localhost:8000/survey/{token}`
- คลิกปุ่มและตรวจสอบว่า redirect ไป `http://localhost:8000/login`

### 2. ทดสอบใน Production

#### ขั้นตอนที่ 1: ตั้งค่า Production

```env
SERVTRACK_INTEGRATED=true
SERVTRACK_BASE_URL=https://servtrack.com
SERVTRACK_LOGIN_URL=https://servtrack.com/login
MAIL_FROM_ADDRESS="squat@nectec.or.th"
MAIL_FROM_NAME="ห้องปฏิบัติการทดสอบซอฟต์แวร์ SQUAT"
```

#### ขั้นตอนที่ 2: ส่งอีเมลทดสอบ

```bash
# ส่งอีเมลไปยังอีเมลจริง
php artisan tinker --execute="
use App\Models\SurveyInvitation;
use App\Mail\SurveyInvitationMail;
use Illuminate\Support\Facades\Mail;
\$invitation = SurveyInvitation::latest()->first();
\$mail = new SurveyInvitationMail(\$invitation, \$invitation->customer, \$invitation->survey, \$invitation->serviceRequest);
Mail::to('real-user@example.com')->send(\$mail);
echo 'Email sent successfully';
"
```

#### ขั้นตอนที่ 3: ตรวจสอบ URL ใน Email

- เปิดอีเมลจริง
- ตรวจสอบว่า URL ในปุ่มเป็น `https://servtrack.com/survey/{token}`
- คลิกปุ่มและตรวจสอบว่า redirect ไป `https://servtrack.com/login`

---

## การ Deploy

### 1. Pre-Deployment Checklist

- [ ] ตั้งค่า `.env` ใน production server
- [ ] ตรวจสอบ MAIL_FROM_ADDRESS และ MAIL_FROM_NAME
- [ ] ตรวจสอบ SERVTRACK_INTEGRATED=true
- [ ] ตรวจสอบ SERVTRACK_BASE_URL และ SERVTRACK_LOGIN_URL
- [ ] ทดสอบการส่งอีเมลใน staging environment
- [ ] Clear config cache: `php artisan config:clear`

### 2. ขั้นตอนการ Deploy

#### ขั้นตอนที่ 1: Backup

```bash
# Backup database
mysqldump -u username -p satisfaction_survey > backup_$(date +%Y%m%d).sql

# Backup .env
cp .env .env.backup
```

#### ขั้นตอนที่ 2: อัปเดต Code

```bash
git pull origin main
composer install --no-dev --optimize-autoloader
```

#### ขั้นตอนที่ 3: ตั้งค่า Environment

```bash
# แก้ไข .env
nano .env

# ตั้งค่าที่สำคัญ:
# - MAIL_FROM_ADDRESS="squat@nectec.or.th"
# - MAIL_FROM_NAME="ห้องปฏิบัติการทดสอบซอฟต์แวร์ SQUAT"
# - SERVTRACK_INTEGRATED=true
# - SERVTRACK_BASE_URL=https://servtrack.com
# - SERVTRACK_LOGIN_URL=https://servtrack.com/login
```

#### ขั้นตอนที่ 4: Clear Cache และ Optimize

```bash
php artisan config:clear
php artisan cache:clear
php artisan route:clear
php artisan view:clear

# Production optimization
php artisan config:cache
php artisan route:cache
php artisan view:cache
```

#### ขั้นตอนที่ 5: ทดสอบ

```bash
# ทดสอบการส่งอีเมล
php artisan tinker --execute="
use App\Models\SurveyInvitation;
use App\Mail\SurveyInvitationMail;
use Illuminate\Support\Facades\Mail;
\$invitation = SurveyInvitation::latest()->first();
\$mail = new SurveyInvitationMail(\$invitation, \$invitation->customer, \$invitation->survey, \$invitation->serviceRequest);
Mail::to('test@example.com')->send(\$mail);
echo 'Email sent';
"
```

---

## การแก้ไขปัญหา

### ปัญหา 1: อีเมลไม่ถูกส่ง

**สาเหตุที่เป็นไปได้:**
- MAIL_PASSWORD ผิด
- SMTP configuration ไม่ถูกต้อง
- Firewall บล็อค port 587

**วิธีแก้:**
1. ตรวจสอบ MAIL_PASSWORD (ต้องเป็น App Password ไม่ใช่รหัสผ่านปกติ)
2. ตรวจสอบ SMTP configuration:
   ```bash
   php artisan tinker --execute="
   echo config('mail.mailers.smtp.host') . PHP_EOL;
   echo config('mail.mailers.smtp.port') . PHP_EOL;
   echo config('mail.from.address') . PHP_EOL;
   "
   ```
3. ทดสอบการส่งอีเมล:
   ```bash
   php artisan tinker --execute="
   use Illuminate\Support\Facades\Mail;
   Mail::raw('Test email', function(\$message) {
       \$message->to('test@example.com')->subject('Test');
   });
   echo 'Email sent';
   "
   ```

### ปัญหา 2: URL ใน Email ไม่ถูกต้อง

**สาเหตุที่เป็นไปได้:**
- SERVTRACK_BASE_URL ไม่ถูกต้อง
- Code ยังไม่ได้อัปเดต

**วิธีแก้:**
1. ตรวจสอบ SERVTRACK_BASE_URL:
   ```bash
   php artisan tinker --execute="
   echo env('SERVTRACK_BASE_URL') . PHP_EOL;
   echo env('SERVTRACK_INTEGRATED') . PHP_EOL;
   "
   ```
2. ตรวจสอบว่า Mail Class ใช้ env() หรือ config()
3. Clear config cache:
   ```bash
   php artisan config:clear
   ```

### ปัญหา 3: Redirect ไม่ทำงาน

**สาเหตุที่เป็นไปได้:**
- SERVTRACK_LOGIN_URL ไม่ถูกต้อง
- Code ยังไม่ได้อัปเดต

**วิธีแก้:**
1. ตรวจสอบ SERVTRACK_LOGIN_URL:
   ```bash
   php artisan tinker --execute="
   echo env('SERVTRACK_LOGIN_URL') . PHP_EOL;
   "
   ```
2. ตรวจสอบว่า SurveyController ใช้ env() ถูกต้อง
3. ทดสอบ redirect:
   ```bash
   # ทดสอบโดยเข้าถึง /survey/{token} โดยไม่ล็อกอิน
   # ควร redirect ไป ServTrack login
   ```

### ปัญหา 4: อีเมลถูกส่งแต่ไม่แสดงชื่อผู้ส่ง

**สาเหตุ:**
- MAIL_FROM_NAME ไม่ถูกต้อง

**วิธีแก้:**
1. ตรวจสอบ MAIL_FROM_NAME:
   ```bash
   php artisan tinker --execute="
   echo config('mail.from.name') . PHP_EOL;
   "
   ```
2. แก้ไข `.env`:
   ```env
   MAIL_FROM_NAME="ห้องปฏิบัติการทดสอบซอฟต์แวร์ SQUAT"
   ```
3. Clear config cache:
   ```bash
   php artisan config:clear
   ```

---

## Checklist

### Pre-Production

- [ ] ตั้งค่า MAIL_FROM_ADDRESS เป็น `squat@nectec.or.th`
- [ ] ตั้งค่า MAIL_FROM_NAME เป็น `ห้องปฏิบัติการทดสอบซอฟต์แวร์ SQUAT`
- [ ] ตั้งค่า MAIL_PASSWORD (App Password จาก Gmail)
- [ ] ตั้งค่า SERVTRACK_INTEGRATED=true
- [ ] ตั้งค่า SERVTRACK_BASE_URL
- [ ] ตั้งค่า SERVTRACK_LOGIN_URL
- [ ] แก้ไข Mail Class ให้ใช้ ServTrack URL
- [ ] แก้ไข SurveyController ให้ redirect ไป ServTrack login
- [ ] ทดสอบการส่งอีเมลใน staging
- [ ] ทดสอบ URL ในอีเมล
- [ ] ทดสอบ redirect ไป ServTrack login

### Post-Production

- [ ] ตรวจสอบว่าอีเมลถูกส่งสำเร็จ
- [ ] ตรวจสอบว่า URL ในอีเมลชี้ไป ServTrack
- [ ] ตรวจสอบว่า redirect ไป ServTrack login ถูกต้อง
- [ ] ตรวจสอบ logs: `tail -f storage/logs/laravel.log`
- [ ] ตรวจสอบว่าไม่มี error ใน production logs

---

## ข้อมูลเพิ่มเติม

### ไฟล์ที่เกี่ยวข้อง

- `app/Mail/SurveyInvitationMail.php` - Mail class สำหรับส่งอีเมล
- `app/Http/Controllers/SurveyController.php` - Controller สำหรับแสดงแบบประเมิน
- `app/Http/Controllers/ServiceRequestController.php` - Controller สำหรับส่งอีเมล
- `resources/views/emails/survey-invitation.blade.php` - Email template
- `config/mail.php` - Mail configuration
- `.env` - Environment variables

### Environment Variables ที่ต้องตั้งค่า

```env
# Mail
MAIL_FROM_ADDRESS="squat@nectec.or.th"
MAIL_FROM_NAME="ห้องปฏิบัติการทดสอบซอฟต์แวร์ SQUAT"

# ServTrack Integration
SERVTRACK_INTEGRATED=true
SERVTRACK_BASE_URL=https://servtrack.com
SERVTRACK_LOGIN_URL=https://servtrack.com/login
```

### สิ่งที่ต้องติดต่อ/ขอข้อมูล

1. **App Password สำหรับ Gmail**
   - ติดต่อผู้ดูแลระบบ G Suite เพื่อสร้าง App Password สำหรับ `squat@nectec.or.th`
   - หรือใช้ OAuth2 (แนะนำสำหรับ Production)

2. **URL ของ ServTrack**
   - ขอ URL ที่แน่นอนของ ServTrack:
     - Base URL: `https://servtrack.com` (หรือ URL จริง)
     - Login URL: `https://servtrack.com/login` (หรือ URL จริง)
     - Survey URL path: `/survey` (หรือ path จริง)

3. **การ Integration กับ ServTrack**
   - ตรวจสอบว่า ServTrack รองรับ path `/survey/{token}` หรือไม่
   - ตรวจสอบการ authenticate ระหว่างระบบ

---

## คำถามที่พบบ่อย (FAQ)

### Q: ต้องเปลี่ยน code อะไรบ้างเมื่อ deploy ไป production?

**A**: ต้องแก้ไข 2 ไฟล์หลัก:
1. `app/Mail/SurveyInvitationMail.php` - เพิ่ม logic สำหรับ ServTrack URL
2. `app/Http/Controllers/SurveyController.php` - เพิ่ม logic สำหรับ redirect ไป ServTrack login

### Q: ทำไมต้องใช้ App Password แทนรหัสผ่านปกติ?

**A**: Gmail ไม่อนุญาตให้ใช้รหัสผ่านปกติกับ Third-party apps ต้องใช้ App Password เพื่อความปลอดภัย

### Q: ถ้า ServTrack URL เปลี่ยนทำอย่างไร?

**A**: แก้ไขใน `.env`:
```env
SERVTRACK_BASE_URL=https://new-servtrack-url.com
SERVTRACK_LOGIN_URL=https://new-servtrack-url.com/login
```
แล้วรัน `php artisan config:clear`

### Q: จะทดสอบได้อย่างไรโดยไม่ส่งอีเมลจริง?

**A**: ใช้ Mail::fake() ใน Test หรือส่งไปยังอีเมลทดสอบของตัวเองก่อน

### Q: ถ้าต้องการส่งอีเมลจากหลายอีเมลได้ไหม?

**A**: ได้ สามารถใช้ Queue และกำหนด sender แยกตามเงื่อนไข หรือใช้ Mail::to()->from() แทน config

---

## ติดต่อและสนับสนุน

หากพบปัญหาหรือมีคำถาม:

1. **ตรวจสอบ Logs**: `storage/logs/laravel.log`
2. **ตรวจสอบ Mail Configuration**: `php artisan tinker` แล้ว run `config('mail')`
3. **ติดต่อทีมพัฒนา**: SQUAT - NECTEC

---

**อัปเดตล่าสุด**: 2025-11-01  
**เวอร์ชัน**: 1.0  
**สถานะ**: Production Ready ✅

