Skip to content
Advertisement

Sending mail with no required attachment Laravel 8

I’m working on a project in Laravel 8. I make a contact form that will be sent to my email address and contains name, email, message and attachment. Name, email and message are required but no attachment. When I send the form completely filled in (name, email, message and attachment) everything works fine and the message comes to my email address (attachment too) But if I fill in only the name, email, message and attachment I leave blank it will print an error:

Call to a member function getRealPath() on null.

I need the message to be sent without an attached attachment.

Code:

contact_us_blade.php:

  <form action="contact_us" method="POST" enctype="multipart/form-data">
        @csrf 

        <input type="text" name="name">
        @error('name')
          <span class="invalid-feedback" role="alert">
              <strong>{{ $message }}</strong>
          </span>
        @enderror 

        <input type="text" name="email">
        @error('email')
          <span class="invalid-feedback" role="alert">
            <strong>{{ $message }}</strong>
          </span>
        @enderror 
        
        <textarea name="message"> </textarea>
        @error('message')
          <span class="invalid-feedback" role="alert">
            <strong>{{ $message }}</strong>
          </span>
        @enderror
        
        <input type="file" name="image">
        
        <br>
        <input type="submit" value="odosli">
      </form>

contact_email.blade.php

  <h2>Hello Admin,</h2>

  <br><b>Name:</b> {{ $name }}
  <br><b>Email:</b> {{ $email }}
  <br><b>Message:</b> {{ $messages }}

EmailController.php:

 public function index(){
        return view('contact.contact_us');
 }

public function send(Request $request){
    $this->validate($request, [
        'name' => 'required',
        'email' => 'required|email',
        'message' => 'required',
        'image' => 'sometimes|required'
    ]);
    
    $data = [
        'name' => $request->name,
        'email' => $request->email,
        'messages' => $request->message,
        'image' => $request->file('image')
    ];

    
    $contact = new Lar_Contact;

     $contact->name = $request->name;
     $contact->email = $request->email;
     $contact->message = $request->message;

     $contact->save();

    $to = '*******@gmail.com';

    Mail::to($to)->send(new AppMailMail($data));
    
    return back()->with('success', 'Thanks for your message!');
}

Mail.php:

use Queueable, SerializesModels;

protected $data;

/**
 * Create a new message instance.
 *
 * @return void
 */
public function __construct($data)
{
    $this->data = $data;
}

/**
 * Build the message.
 *
 * @return $this
 */
public function build()
{
    $name = $this->data['name'];
    $email = $this->data['email'];
    $messages = $this->data['messages'];

    return $this->subject ('Subject email')
                ->view('contact.contact_email', compact('name'))
                ->view('contact.contact_email', compact('email'))
                ->view('contact.contact_email', compact('messages'))
                ->attach($this->data['image']->getRealPath(),[
                    'as' => $this->data['image']->getClientOriginalName(),
                    
                ]);
                    
}

Advertisement

Answer

Conditionally attach the image?

    $mail = $this->subject ('Subject email')
                ->view('contact.contact_email', compact('name'))
                ->view('contact.contact_email', compact('email'))
                ->view('contact.contact_email', compact('messages'))
    if (isset($this->data['image']) && !is_null($this->data['image'])) {
       $mail->attach($this->data['image']->getRealPath(),[
           'as' => $this->data['image']->getClientOriginalName(),
       ]);
    }

    return $mail;           
                
User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement