sendgrid php api not sending emails - 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.
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!!

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 when 'addContent' used in if block

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";
}
}
}
?>

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