sendgrid php api not sending emails when 'addContent' used in if block - php

Im working on an application where I've created a user registration system. So when a user registers an email is sent to the account, Im using an email class to send email. Before using sendgrid I was using phpmailer and it was working perfectly fine in this format, but it doesn't works with sendgrid.
So when i use this code without if and else for '$type', it works completely fine, but does not works with if else and the page loading never ends!
Some help would be appreciated!!
This is the code
<?php
class email {
public function sendEmail($name, $email, $url, $type, $subject){
require '../../vendor/autoload.php'; // If you're using Composer (recommended)
$email = new \SendGrid\Mail\Mail();
$email->setFrom("mymail#gmail.com", "Example User");
$email->setSubject($subject);
$email->addTo($email, $name);
if($type === "CONFIRM"){
$email->addContent(
'text/html', 'CONFIRM MESSAGE'
);
} else if($type === "FORGOT"){
$email->addContent(
'text/html', 'FORGOT MESSAGE'
);
}
$apiKey = 'api_key';
$sendgrid = new \SendGrid($apiKey);
try {
$response = $sendgrid->send($email);
print $response->statusCode() . "\n";
print_r($response->headers());
print $response->body() . "\n";
} catch (Exception $e) {
echo 'Caught exception: '. $e->getMessage() ."\n";
}
}
}
?>

Related

Call to undefined method Sendgrid::send() in Codeigniter

I am using sendgrid api v3. Everything works fine on my localserver with core php and now i move my code on server with codeigniter framework. It shows me following error.
Fatal error: Call to undefined method Sendgrid::send() in /var/www/html/adihex/application/helpers/sendgrid_helper.php on line 19
Here is my code
<?php
require_once FCPATH . 'sendgrid-php/sendgrid-php.php';
function send_mail()
{
$template_id = '********************************';
$api_key = '*************************************';
// echo '<pre>';
$email = new \SendGrid\Mail\Mail();
$email->setFrom("test#example.com", "Example User");
$email->setSubject("Sending with Twilio SendGrid is Fun");
$email->addTo("singhrobin1238014#gmail.com", "Example User");
$email->setTemplateId($template_id);
$email->addDynamicTemplateDatas([
'heading' => 'Welcome to Adihex',
]);
$sendgrid = new \SendGrid($api_key);
try {
$response = $sendgrid->send($email);
print $response->statusCode() . "\n";
print_r($response->headers());
print $response->body() . "\n";
} catch (Exception $e) {
echo 'Caught exception: ' . $e->getMessage() . "\n";
}
}
Please guide me where i am wrong.
Any solution appreciated!
Although its late but it might help someone ,
You might be having Multiple Classes with same name , SendGrid In this case the script is searching for send function in someother Class with same name,

Bad Request Error while sending sendgrid email using wadeshuler/yii2-sendgrid

I am currently working on a yii2 application and I have integrated wadeshuler/yii2-sendgrid plugin in my application to send emails through it.
I have setup a dynamic template with a template id in my sendgrid account. Here is the code I am using to test sendgrid integration with my app.
public function actionTest()
{
$mailer = Yii::$app->mailer;
$message = $mailer->compose()
->setTo('umair#****.com') // or just $user->email
->setFrom(['alerts#example.com' => 'Alerts'])
->setReplyTo('noreply#example.com')
->setSubject('Hey -username-, Read This Email')
->setHtmlBody('Dear -username-,<br><br>My HTML message here')
->setTextBody('Dear -username-,\n\nMy Text message here')
->setTemplateId('******')
->addSubstitution('-username-', 'Umair Ashraf')
->send();
if ($message === true) {
echo 'Success!';
echo '<pre>' . print_r($mailer->getRawResponses(), true) . '</pre>';
} else {
echo 'Error!<br>';
echo '<pre>' . print_r($mailer, true) . '</pre>';
echo '<pre>' . print_r($mailer->getErrors(), true) . '</pre>';
}
}
Here is the response code printed
Error!
{"code":400,"headers":["HTTP/1.1 400 Bad Request","Server: nginx","Date: Fri, 27 Dec 2019 13:31:27 GMT","Content-Type: application/json","Content-Length: 238","Connection: keep-alive","Access-Control-Allow-Origin: https://sendgrid.api-docs.io","Access-Control-Allow-Methods: POST","Access-Control-Allow-Headers: Authorization, Content-Type, On-behalf-of, x-sg-elas-acl","Access-Control-Max-Age: 600","X-No-CORS-Reason: https://sendgrid.com/docs/Classroom/Basics/API/cors.html","",""],"body":"{\"errors\":[{\"message\":\"Substitutions may not be used with dynamic templating\",\"field\":\"personalizations.0.substitutions\",\"help\":\"http://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/errors.html#message.personalizations.substitutions\"}]}"}
Array
(
[0] => Bad Request!
)
As you can see it says that substitutions may not be used with dynamic templating, but I will be needing to substitute these variable inorder to use templates correclty. How to fix this using the code?
I had to remove wadeshuler/yii2-sendgrid plugin as it didn't support the latest features and updates in the sendgrid liberary. I installed the latest sendgrid plugin. I also made a component named SendGridManager to route all the emails through it in my application.
Here is my function inside the component SendgridManager
public function email($from , $to, $substitution, $templateId, $senderName = NULL,
$toName = NULL, $attachment = NULL)
{
$response = '';
$email = new \SendGrid\Mail\Mail();
$email->setFrom($from,$senderName);
$email->addTo($to , $toName, $substitution);
$email->setTemplateId($templateId);
if(!empty($attachment))
{
$email->addAttachment(
$attachment
);
}
$sendgrid = new \SendGrid($this->apiKey);
try {
$response = $sendgrid->send($email);
} catch (Exception $e) {
echo 'Caught exception: '. $e->getMessage(). "\n";
}
return $response;
}

sendgrid php api not sending emails

Im working on an application where I've created a user registration system. So when a user registers an email is sent to the account, Im using an email class to send email. Before using sendgrid I was using phpmailer and it was working perfectly fine in this format, but it doesn't works with sendgrid.
This is the code
<?php
class email {
public function sendEmail($name, $email, $url, $type, $subject){
require '../../vendor/autoload.php'; // If you're using Composer (recommended)
$email = new \SendGrid\Mail\Mail();
$email->setFrom("mymail#gmail.com", "Example User");
$email->setSubject($subject);
$email->addTo($email, $name);
if($type === "CONFIRM"){
$email->addContent(
'text/html', 'CONFIRM MESSAGE'
);
} else if($type === "FORGOT"){
$email->addContent(
'text/html', 'FORGOT MESSAGE'
);
}
$apiKey = 'api_key';
$sendgrid = new \SendGrid($apiKey);
try {
$response = $sendgrid->send($email);
print $response->statusCode() . "\n";
print_r($response->headers());
print $response->body() . "\n";
} catch (Exception $e) {
echo 'Caught exception: '. $e->getMessage() ."\n";
}
}
}
?>
So when i use this code without if and else for '$type', it works completely fine, but does not works with if else and the page loading never ends!
Some help would be appreciated!!

Sengrid mail not sending with wamp server php

I'm using sengrid api to send mails and i installed curl and WAMP server. mail sttus code is 0 and body and header is empty. how to solve this issue.?
i tried php version 7.1 and 7.2 but it doesn't work
$email = new \SendGrid\Mail\Mail();
$email->setFrom("donayasara94#gmail.com", $subject);
$email->setSubject($subject);
$email->addTo($receiver, $subject);
$email->addContent("text/plain", $body);
$email->addContent(
"text/html", $body
);
$sendgrid = new \SendGrid('api key');
try {
$response = $sendgrid->send($email);
$returnArr = [
'code' => $response->statusCode(),
'body' => $response->body()
];
echo json_encode($returnArr);
print $response->statusCode() . "\n";
print_r($response->headers());
print $response->body() . "\n";
} catch (Exception $e) {
//echo 'Caught exception: ' . $e->getMessage() . "\n";
} /*end sending email*/
}
Try this,
Download cacert.pem file from here
Save it to some location say c:\cacert\cacert.pem
Edit C:\wamp64\bin\apache\apache(ver)\bin\php.ini change the line
';curl.cainfo' to curl.cainfo=c:\cacert\cacert.pem
Restart all services in wamp
Source: https://snippets.webaware.com.au/howto/stop-turning-off-curlopt_ssl_verifypeer-and-fix-your-php-config/

How to properly send email with sendgrid via php

I have the code below which is from sendgrid for sending an email with my API key but I cannot get it to work as it displays
error Fatal error: Uncaught Error: Call to a member function send() on
string in ...
I have install composer as required
It seems, However, $sendgrid->send($email) doesn't actually return anything, so $mail is an empty variable.
Any idea on how to resolve this.
Api link source.
<?php
// https://sendgrid.com/docs/API_Reference/index.html
// using SendGrid's PHP Library
// https://github.com/sendgrid/sendgrid-php
require 'vendor/autoload.php'; // If you're using Composer (recommended)
// Comment out the above line if not using Composer
// require("./sendgrid-php.php");
// If not using Composer, uncomment the above line
$email = new \SendGrid\Mail\Mail();
$email->setFrom("test#example.com", "Example User");
$email->setSubject("Sending with SendGrid is Fun");
$email->addTo("test#example.com", "Example User");
$email->addContent(
"text/plain", "and easy to do anywhere, even with PHP"
);
$email->addContent(
"text/html", "<strong>and easy to do anywhere, even with PHP</strong>"
);
//$sendgrid = new \SendGrid(getenv('my api goes here'));
$sendgrid = 'my api goes here';
try {
$response = $sendgrid->send($email);
print $response->statusCode() . "\n";
print_r($response->headers());
print $response->body() . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
You are trying to call a function on a string.
$sendgrid = 'my api goes here';
And later:
$response = $sendgrid->send($email);
What I think you meant:
$response = $email->send($email);

Categories