getVerificationEmailTemplate($verificationUrl); $textBody = $this->getVerificationEmailText($verificationUrl); return $this->sendEmail($email, $subject, $htmlBody, $textBody); } public function sendPasswordResetEmail($email, $token) { $resetUrl = SITE_URL . "/reset-password.php?token=" . $token; $subject = "Password reset request for your Relevant Reflex account"; $htmlBody = $this->getPasswordResetEmailTemplate($resetUrl); $textBody = $this->getPasswordResetEmailText($resetUrl); return $this->sendEmail($email, $subject, $htmlBody, $textBody); } private function sendEmail($to, $subject, $htmlBody, $textBody = '') { $payload = [ 'personalizations' => [[ 'to' => [['email' => $to]], 'subject' => $subject ]], 'from' => ['email' => $this->fromEmail, 'name' => $this->fromName], 'reply_to' => ['email' => 'support@relevantreflex.com', 'name' => 'Relevant Reflex Support'], 'content' => [ ['type' => 'text/plain', 'value' => $textBody ?: strip_tags($htmlBody)], ['type' => 'text/html', 'value' => $htmlBody] ], 'headers' => [ 'List-Unsubscribe' => '', 'List-Unsubscribe-Post' => 'List-Unsubscribe=One-Click', 'X-Mailer' => 'Relevant Reflex Mailer' ], 'categories' => ['transactional', 'member-verification'], 'tracking_settings' => [ 'click_tracking' => ['enable' => false], 'open_tracking' => ['enable' => true] ] ]; $ch = curl_init('https://api.sendgrid.com/v3/mail/send'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($payload), CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $this->apiKey, 'Content-Type: application/json' ], CURLOPT_TIMEOUT => 30, CURLOPT_SSL_VERIFYPEER => true ]); $response = curl_exec($ch); $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($statusCode === 202) { return true; } else { error_log("SendGrid email failed to $to: HTTP $statusCode — $response"); return false; } } // ----------------------------------------------------------------------- // PLAIN TEXT VERSIONS // ----------------------------------------------------------------------- private function getVerificationEmailText($verificationUrl) { return "Relevant Reflex — Email Verification ====================================== Thank you for registering with Relevant Reflex. To activate your account, please verify your email address by visiting the link below: " . $verificationUrl . " This verification link expires in 7 days. If you did not create an account with Relevant Reflex, please ignore this email. Need help? Contact us at support@relevantreflex.com — The Relevant Reflex Team relevantreflex.com"; } private function getPasswordResetEmailText($resetUrl) { return "Relevant Reflex — Password Reset ================================== We received a request to reset the password for your Relevant Reflex account. To set a new password, visit the link below: " . $resetUrl . " This link expires in 1 hour. If you did not request a password reset, please ignore this email — your password will not be changed. Need help? Contact us at support@relevantreflex.com — The Relevant Reflex Team relevantreflex.com"; } // ----------------------------------------------------------------------- // HTML TEMPLATES // ----------------------------------------------------------------------- private function getVerificationEmailTemplate($verificationUrl) { return ' Verify Your Email - Relevant Reflex
'; } private function getPasswordResetEmailTemplate($resetUrl) { return ' Password Reset - Relevant Reflex

Relevant Reflex

India\'s Trusted Survey Platform

Password Reset Request

We received a request to reset the password for your Relevant Reflex account. Click the button below to set a new password.

Reset My Password

Note: This password reset link expires in 1 hour. If you did not request this, please ignore it — your password will not change.

If the button above does not work, copy and paste the link below into your browser:

' . $resetUrl . '

 

This is a transactional email sent by Relevant Reflex in response to a password reset request.

Need help? support@relevantreflex.com

'; } }