如何使用Laravel发送电子邮件?

6

我正在尝试发送一封电子邮件,但是我无法移动,以下是我的视图:

<h1>Contact TODOParrot</h1>
<form action="contact" method="post">

<div class="form-group">
 <label>Your First Name</label>
 <input type="text" name="Fname" placeholder="Your First Name" />
</div>

<div class="form-group">
  <label>Your Last Name</label>
  <input type="text" name="Lname" placeholder="Your Last Name" />
</div>

<div class="form-group">
<label>Your Email</label>
  <input type="email" name="Email" placeholder="Your Email" />
</div>
<div class="form-group">
<label>Your Phone Number</label>
  <input type="text" name="Phone" placeholder="Your Phone" />
</div>
<div class="form-group">
<label>Your Order</label>
  <input type="text" name="Order" placeholder="Your Order" />
</div>

<div class="form-group">
    <button class="btn btn-default" name="Submit" type="Submit">Send Order</button>
</div>
</form>

以下是我的控制器代码:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;  
use App\Http\Requests\ContactFormRequest;
    
class aboutController extends Controller
{
    //
    public function create()
    {
        return view('about.contact');
    }

    public function store(ContactFormRequest $request)
    {
        \Mail::send('about.contact',
        array(
            'Fname' => $request->get('Fname'),
            'Lname' => $request->get('Lname'),
            'Email' => $request->get('Email'),
            'Phone' => $request->get('Phone'),
            'Order' => $request->get('Order')
        ), function($message)
    {
        $message->from('mohamedsasa201042@yahoo.com');
        $message->to('elbiheiry2@gmail.com', 'elbiheiry')->subject('TODOParrot Feedback');
    });

        return \Redirect::route('contact')
      ->with('message', 'Thanks for contacting us!');
    }
}

这是我的路线:

Route::get('contact', 
  ['as' => 'contact', 'uses' => 'AboutController@create']);
Route::post('contact', 
  ['as' => 'contact', 'uses' => 'AboutController@store']);

这是.env文件中的配置:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=ssl

当我按发送时,问题中的用户名和密码被移除,但是它给了我一个“Forbidden”消息。有人能帮忙吗?

你在Laravel中配置了你的电子邮件服务吗? - Maytham Fahmi
@maytham-ɯɐɥʇʎɐɯ 是的,我已经配置好了,并且我会编辑问题以添加它。 - Mohamed Elbiheiry
@maytham-ɯɐɥʇʎɐɯ 我正在使用SMTP。 - Mohamed Elbiheiry
@maytham-ɯɐɥʇʎɐɯ 不,它只会打印出“forbidden”这个词,不会发送任何东西。 - Mohamed Elbiheiry
5个回答

5

和OP聊过之后,这是答案:

主要问题:

您的 ContactFormRequest.php 文件有以下规则函数:

public function rules()
    {
        return [
        'name'    => 'required',
        'email'   => 'required|email',
        'message' => 'required',
        ];
    }

但是您的表单没有名称和消息,因此您需要删除不存在的元素或根据需要进行修改。出于测试目的,我仅保留了电子邮件:

public function rules()
    {
        return [
            'Email' => 'required|email',
        ];
    }

在IT技术中,保持命名规范是一个好习惯,例如如果您使用带有大写字母E的Email,则应该在任何地方都使用Email。

因此,表单从未提交发送。

我建议您还应该构建您的store函数,我已经测试并且它可以正常工作,您可以根据您的要求进行修改:

$data = [
            'no-reply' => 'contact-from-web@nomail.com',
            'admin'    => 'mohamedsasa201042@yahoo.com',
            'Fname'    => $request->get('Fname'),
            'Lname'    => $request->get('Lname'),
            'Email'    => $request->get('Email'),
            'Phone'    => $request->get('Phone'),
            'Order'    => $request->get('Order'),
        ];

        \Mail::send('about.contact', ['data' => $data],
            function ($message) use ($data)
            {
                $message
                    ->from($data['no-reply'])
                    ->to($data['admin'])->subject('Some body wrote to you online')
                    ->to($data['Email'])->subject('Your submitted information')
                    ->to('elbiheiry2@gmail.com', 'elbiheiry')->subject('Feedback');
            });

它应该能够正常工作,

我只用过Mandrill API邮件服务来测试它,但你可以尝试使用SMTP或API,取决于你。

如果你想创建一个电子邮件确认功能,你需要创建电子邮件确认视图并像下面的例子一样将数据转发给它:

\Mail::send('about.emailconfirmation', ['data' => $data],

你的视图可能会如此显示:

<tr>
    <td>
        <h1>Contact form</h1>
        <p>Dear {{ $data['Fname'] }},</p>
        <p>Thank you for contacting me.</p>
        <p>I will respond to your inquiry as quickly as possible.</p>
        <hr/>
        <p><b>Provided email</b></p>
        <p>Email: {{ $data['Email'] }},</p>
    </td>
</tr>

这只是一个示例,但您可以进一步修改它。


1

Laravel app

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465          
MAIL_USERNAME=<<your email address>>
MAIL_PASSWORD=<<app password>>

MAIL_ENCRYPTION= ssl   

在你的控制器设置中

面对的问题

use Illuminate\Support\Facades\Mail;

发送邮件

$to_name = "RECEIVER_NAME";
$to_email = "tomail@gmail.com";
$data = array("name"=>"Cloudways (sender_name)", "body" => "A test mail");

Mail::send([], $data, function($message) use ($to_name, $to_email) {
$message->to($to_email, $to_name)
->subject("Laravel Test Mail");
$message->from("preealweb@gmail.com","Test Mail");
});

注意:发件人和收件人的邮件

请确保在Gmail设置中启用安全邮箱SucureLess Mail


0
根据我的理解,我认为你在你的ContactFormRequest中缺少了authorize部分。前往App/Http/Request/ContactFormRequest文件并找到这个方法。
public function authorize()
{
    return false;
}

所以只需将返回值设置为true。这将允许进一步处理。

public function authorize()
{
    return true;
}

已编辑

将您的Contact POST Route更改为以下内容

Route::post('contact/store',['as' => 'contact-store', 'uses' => 'AboutController@store']);

而在您的表单操作中,只需更改此处。

<form action="contact/store" ........

在您的存储方法中,首先检查您是否正确地进行了操作,这意味着在顶部只需执行 dd(\Request::all()); - Qazi
它重复显示相同的页面,没有任何更改。 - Mohamed Elbiheiry
我刚刚更新了我的答案,请看一下,希望能解决你的问题。 - Qazi
让我们在聊天中继续这个讨论 - Qazi

0
MAIL_DRIVER=sendmail
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=tls

我曾经遇到过类似的问题,将MAIL_DRIVER = smtp改为了sendmail


0
Here are three methods to send email in laravel 8.
First one is through our email id.
Second one is through Mailgun.
Third one is through SendinBlue.


# For smtp

# MAIL_MAILER=smtp
# MAIL_HOST=smtp.gmail.com
# MAIL_PORT=587
# MAIL_USERNAME=xxxxxxxxxxxxx@gmail.com
# MAIL_PASSWORD=xxxxxxxxxxxxxxx
# MAIL_ENCRYPTION=tls
# MAIL_FROM_ADDRESS=xxxxxxxxxxx@gmail.com
# MAIL_FROM_NAME="${APP_NAME}"

# For Mailgun

# MAIL_MAILER=mailgun
# MAIL_HOST=smtp.mailgun.org
# MAIL_PORT=587
# MAIL_USERNAME=sandboxxxxxxxxxxxxxxxxxxxxxxxxx.mailgun.org
# MAIL_PASSWORD=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# MAIL_ENCRYPTION=tls
# MAIL_FROM_ADDRESS=xxxxxxxxxxxxxxxxxxxxxxxxx
# MAIL_FROM_NAME="${APP_NAME}"
# MAILGUN_SECRET=API private key
# MAILGUN_DOMAIN=sandboxxxxxxxxxxxxxxxxxxxxx.mailgun.org

# For sendinblue
# MAIL_DRIVER=smtp
# MAIL_HOST=smtp-relay.sendinblue.com
# MAIL_PORT=587
# MAIL_USERNAME=xxxxxxxxxxxxxxxxxxxxxx@gmail.com
# MAIL_PASSWORD=xxxxxxxxxxxxxxxxxxxxxx
# MAIL_ENCRYPTION=tls
# MAIL_FROM_ADDRESS=xxxxxxxxxxxxxxxxxxxxxx@gmail.com
# MAIL_FROM_NAME="${APP_NAME}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接