Sending images in an email in Laravel - laravel-5

I am trying to send an auto-reply to the newly registered user and I want to send them an image rather than the text but when I try to send the image the mail does send but the image received is broken. I studied many answers from StackOverflow as well tried many other solutions from the internet but nothing seems to be working.
My mail class:
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class autoMail extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* #return void
*/
public function __construct()
{
//
}
/**
* Build the message.
*
* #return $this
*/
public function build()
{
return $this->subject("Subject")
->view('emails.autoemail');
}
}
Here is my function which is calling this mail class.
Mail::to($request->email)->send(new autoMail());
And last but not least my view which I am sending as an email.
<!DOCTYPE html>
<html>
<head>
<title>Auto Email</title>
</head>
<body>
<img src="{{ asset('img/email.png') }}">
</body>
</html>

You can manually pass your data to the view via the with() method.
class autoMail extends Mailable
{
use Queueable, SerializesModels;
public function build()
{
$image = env('APP_URL')."/img/email.png";
return $this->subject("Subject")
->view('emails.autoemail')
->with(['image' => $image]);
}
}
Once the data has been passed to the with() method, it will automatically be available in your view, so you may access it like you would access any other data in your Blade templates:
<!DOCTYPE html>
<html>
<head>
<title>Auto Email</title>
</head>
<body>
<img src="{{ $image }}">
</body>
</html>

Related

Laravel SMTP Mail Sending

I'm building a project with Laravel version 7.28 and I'm trying to send notification to my users. I'm based on https://www.itsolutionstuff.com/post/laravel-7-send-email-exampleexample.html
.env file
MAIL_MAILER=smtp
MAIL_HOST=mail.google.com
MAIL_PORT=587
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=
MAIL_FROM_NAME="lorem ipsum"
web.php
Route::get('/send-notification', 'MailController#sendNotification');
MailController.php
<?php
namespace App\Http\Controllers;
use App\Mail\Test;
use Illuminate\Support\Facades\Mail;
class MailController extends Controller
{
public function sendNotification()
{
$details = [
'title' => 'title',
'body' => 'body'
];
Mail::to('info#londonistinvestments.com')->send(new Test($details));
echo 'email has sent';
}
}
Under app folder, I have a directory named Mail and under it I have Test.php. I created it with "php artisan make:mail MyTestMail" command on terminal.
Here is Test.php file
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class Test extends Mailable
{
use Queueable, SerializesModels;
public $details;
/**
* Create a new message instance.
*
* #return void
*/
public function __construct($details)
{
$this->details = $details;
}
/**
* Build the message.
*
* #return $this
*/
public function build()
{
return $this->subject('Notification - New Lead')->view('email.test');
}
}
Finally test view that is under resources/views/email
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Notification</title>
</head>
<body>
<h1>lorem isppsum</h1>
<p>thank you</p>
</body>
</html>
I'm using Xampp, PHP version is 7.2.34. I'm able to send emails on local but when I upload to my shared hosting that uses PHP version 7.3 I get error. Which is;
I didn't understand the problem. I also tried to connect mail.gmail.com on ports 25, 465 and 587 with ssl and tls. What sould I do?
The shared hosting provider is likely blocking those ports.
I had a similar situation with trying to email (integration with mailgun but still using those ports) from shared hosting (A2 Hosting) and after going through their support was informed that those ports are not available and it would not work.
I ended up having to switch to VPS to solve my problem.

Send Welcome Email to customer after contact in Laravel 6

I'm new in Laravel and working with Laravel 6. For customer contact.
curently when i submit contact form and sending email perfectly by given email id demo#gmail.com But, need to extend it with one following features:
1):Customer will get an email just after contact.
Does anyone have an idea ? please help me thanks.
Controller
public function store(Request $request)
{
$contactemail = new ContactEmail;
$contactemail->name = $request->name;
$contactemail->email = $request->email;
$contactemail->contact = $request->contact;
$contactemail->subject = $request->subject;
$contactemail->message = $request->message;
$contactemail->save();
Mail::to(config('wall_master_furishing.mail_to'),$contactemail->email)->send(new EnquiryEmail($contactemail));
return back()->with('success', 'We Will Contact You Soon')
->with('path', $contactemail);
}
Mailable class
directory
app/Mail/EnquiryEmail.php
class EnquiryEmail extends Mailable
{
use Queueable, SerializesModels;
public $enquiry;
/**
* Create a new message instance.
*
* #return void
*/
public function __construct(ContactEmail $enquiry)
{
$this->enquiry = $enquiry;
}
/**
* Build the message.
*
* #return $this
*/
public function build()
{
return $this->view('email.contactmail');
}
html view
app/resources/views/emails/contactmail.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>WallMaster enquiry Us Mail</title>
</head>
<body>
<p>Name : {{$enquiry->name}}</p>
<p>email : {{$enquiry->email}}</p>
<p>Phone : {{ $enquiry->contact}}</p>
<p>Subject : {{$enquiry->subject}}</p>
<p>Message : {{ $enquiry->message}}</p>
</body>
.env
MAIL_TO=demo#gmail.com
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=d6d151d01264b5
MAIL_PASSWORD=4c5c45ae453ae2
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=demo#gmail.com
MAIL_FROM_NAME="${APP_NAME}"**
if u meant after contact is after redirected, then use laravel queue

Laravel 7 Nullable Validation Not Working ( All Solution Applied )

Laravel Nullable is not working, i try everything but it still not working. Please Look My Code..
Controller :-
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Pop;
class PopController extends Controller
{
public function index(){
return view('test2');
}
public function create(Request $request){
$formvalidtion = $request->validate([
'usercode' => ['nullable', 'required'],
]);
return "<h1>SUCCESS</h1>";
}
}
Model :-
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Pop extends Model
{
protected $timestamps = false;
protected $fillable = ['usercode'];
}
Migration :-
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePopsTable extends Migration
{
/**
* Run the migrations.
*
* #return void
*/
public function up()
{
Schema::create('pops', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('usercode')->nullable();
});
}
/**
* Reverse the migrations.
*
* #return void
*/
public function down()
{
Schema::dropIfExists('pops');
}
}
Route :-
route::get('test', 'PopController#index');
route::post('testcheck', 'PopController#create')->name('uc');
View :-
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Nullable Test</title>
</head>
<body>
<h1>Test Nullable</h1>
<form action="{{ route('uc') }}" method="POST">
#csrf
<input type="number" name="usercode" id="" placeholder="Enter User Code">
#error('usercode')
{{ $message }}
#enderror
<br>
<input type="submit" >
</form>
</body>
</html>
I spend 1 hour to find solution of but not get. some of youtube video in mentioned that datatype of field must be int and nullable . this also not working is there any solution available?
It's not right to use nullable and required validations rules together:
required: The field under validation must be present in the input data and not empty.
nullable: The field under validation may be null.
present: The field under validation must be present in the input data but can be empty.
filled: The field under validation must not be empty when it is present.
prohibited: The field under validation must be empty or not present.
sometimes: The field under validation will only be validated if it is present.
exclude: The field under validation will be excluded from the request data returned by the validate and validated methods.
You may use nullable and present together:
$formvalidtion = $request->validate([
'usercode' => ['nullable', 'present'],
]);
You don't specify what you mean with "not working" (i.e. what you expect, but what happens instead), but I'm assuming you mean that null values are not accepted by the validation.
That would be because the required rule expects a value to be non-empty. So your nullable rule probably passes, but required fails.
If you want a value to be present, but not necessarily non-empty, you can use the present rule.

My data isnt being saved to database and im not getting an error

Im having an issue where this code just executes and the vardump shows the var i put in the text field but theres no data showing up in the database, theres also no error showing up
view:
<!DOCTYPE html>
<html>
<head>
<link href="https://fonts.googleapis.com/css?family=Lato:100" rel="stylesheet" type="text/css">
<body>
<div>
<form method="post" action="/post">
{{ csrf_field() }}
<input type="text" name="email">
<input type="text" name="password">
<input type="submit" name="submit">
</form>
</div>
</body>
</head>
</html>
controller:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\werknemer_model;
class werknemer extends Controller
{
/*Show the form for creating a new resource.*/
public function create(Request $request)
{
$email = $request->input('email');
var_dump($email);
$werknemer = new werknemer();
$werknemer->store($request);
return view('login_portal');
}
}
model:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use App\controllers\werknemer
class werknemer_model extends Model
{
public function store (Request $request){
$email = $request->input('email');
$password = $request->input('password');
$werknemer = new werknemer;
$werknemer->id = 1;
$werknemer->bedrijf_id = 1;
$werknemer->email = $email;
$werknemer->naam = $password;
$werknemer->save();
try {
DB::connection()->getPdo();
} catch (\Exception $e) {
die("Could not connect to the database. Please check your configuration.");
}
}
}
Routes:
Route::get('/', function () {
return view('Login_portal');
});
Route::post('/post','werknemer#create');
Question : My data isnt being saved to database and im not getting an error
It is common problem, easy to forgot. You forgot to set variable in your model (for Mass Assignment). Check what data you want to put to database and set it in your model.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* The attributes that are mass assignable.
*
* #var array
*/
protected $fillable = ['name', 'another_data', 'another_variable'];
}
And as far as I see, your model structure is not going along the Laravel convention. Read it and save time in future: https://laravel.com/docs/5.6/eloquent#mass-assignment

Laravel get data from external post submit: TokenMismatchException ( without adding _token)

I have a form that only have control on action URL. so cannot add '_token'. is that possible to get the data to my controller
External HTML form host in deference location
<!DOCTYPE html>
<html>
<head>
<title>Test HTML</title>
</head>
<body>
<form method="post" action="http://www.mylaravelproject.com/confirm">
<input type="textbox" name="fname">
<input type="textbox" name="lname">
<input type="submit">
</form>
</body>
</html>
My Laravel Route
Route::any('confirm','PageController#confirm');
Inside Controller
public function confirm(){
return Input::all();
}
Is this Possible ??
Thanks
Edit:
Found i can do that by removing line (inside App/Httm/Kenel.php)
'App\Http\Middleware\VerifyCsrfToken',
Second Question
but its kind of security risk. i Just only need to remove VerifyCsrfToken on this specific route 'confirm'.
is this possible?
This feature will be available in Laravel 5.1 out of the box.
But while we wait for Laravel 5.1 - you can do this in your App\Http\Middleware\VerifyCsrfToken file in 5.0:
<?php namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
use Illuminate\Session\TokenMismatchException;
class VerifyCsrfToken extends BaseVerifier {
protected $excludedRouteGroups = ['confirm', 'stripe'];
public function handle($request, Closure $next)
{
if ($this->isReading($request) || ($this->excludedRoutes($request)) || $this->tokensMatch($request)) {
return $this->addCookieToResponse($request, $next($request));
}
Throw new TokenMismatchException;
}
protected function excludedRoutes($request)
{
foreach($this->excludedRouteGroups as $route) {
if ($request->segment(1) === $route) {
return true;
}
}
return false;
}
}

Resources