Laravel联系表单邮件发送:如何传递用户邮箱并完善路由?
作为Laravel新手,别慌,咱们一步步来,保证你能轻松搞定!
1. 完善路由配置
首先,你需要确保路由是POST请求(毕竟要提交表单数据),指向你的ContactWebmaster控制器的处理方法,比如store。打开routes/web.php,添加或修改路由:
use App\Http\Controllers\ContactWebmasterController; Route::post('/contact-webmaster', [ContactWebmasterController::class, 'store'])->name('contact.webmaster');
这里用了命名路由contact.webmaster,后面表单提交时直接用这个名称,既方便又不容易出错。
2. 编写控制器的表单处理逻辑
如果还没创建ContactWebmasterController,先运行php artisan make:controller ContactWebmasterController生成控制器。然后在store方法里做这几件核心事:
- 验证表单输入(避免垃圾数据)
- 获取用户填写的邮箱等信息
- 调用Mail类发送邮件,同时把用户邮箱传递到模板
代码示例:
namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Mail; class ContactWebmasterController extends Controller { public function store(Request $request) { // 第一步:验证表单数据,确保邮箱格式合法、必填字段不为空 $validated = $request->validate([ 'user_email' => 'required|email', 'name' => 'required|string|max:255', 'message' => 'required|string', ]); // 第二步:准备要传递给邮件模板的数据,这里就包含用户邮箱 $mailData = [ 'user_name' => $validated['name'], 'user_email' => $validated['user_email'], // 这就是要传给模板的用户邮箱 'message_content' => $validated['message'], ]; // 第三步:发送邮件 Mail::send('email.contactwebmaster', $mailData, function ($message) use ($validated) { // 发给站长的邮箱,建议从env配置里取,方便后续修改 $message->to(env('WEBMASTER_EMAIL', 'your-webmaster-email@example.com')) ->subject('新的网站联系消息') ->replyTo($validated['user_email']); // 把用户邮箱设为回复地址,站长直接回复就能联系到用户 }); // 发送成功后跳回表单页面,给用户反馈 return back()->with('success', '消息已发送,我们会尽快回复你!'); } }
3. 在邮件模板里展示用户邮箱
打开你的resources/views/email/contactwebmaster.blade.php模板,直接使用咱们传递的$user_email变量即可,比如:
<!DOCTYPE html> <html> <head> <title>新的联系消息</title> </head> <body> <h3>你收到了一条新的网站联系消息</h3> <p>发送人姓名: {{ $user_name }}</p> <p>发送人邮箱: {{ $user_email }}</p> <!-- 这里就是用户填写的邮箱 --> <p>消息内容:</p> <p>{{ $message_content }}</p> </body> </html>
如果是纯文本模板(.txt格式),写法完全一样,直接用{{ $user_email }}就行。
4. 配置邮件环境(新手必看!)
很多新手会忽略这一步,导致邮件发不出去。打开项目根目录的.env文件,配置好邮件驱动,比如用SMTP的话:
MAIL_MAILER=smtp MAIL_HOST=smtp.example.com MAIL_PORT=587 MAIL_USERNAME=your-email@example.com MAIL_PASSWORD=your-email-password MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=your-email@example.com MAIL_FROM_NAME="${APP_NAME}"
要是想测试不发真实邮件,可以用Laravel自带的log驱动,把MAIL_MAILER=log,这样邮件会存在storage/logs/laravel.log里,方便调试。
5. 确保表单提交地址对应路由
最后,检查你的前端联系表单,action属性要指向咱们的命名路由,并且要加@csrf防止CSRF攻击:
<form method="POST" action="{{ route('contact.webmaster') }}"> @csrf <div> <label>你的邮箱:</label> <input type="email" name="user_email" required> </div> <div> <label>你的姓名:</label> <input type="text" name="name" required> </div> <div> <label>消息内容:</label> <textarea name="message" required></textarea> </div> <button type="submit">发送消息</button> </form>
注意:表单里的name="user_email"要和控制器验证的字段名完全一致,不然会拿不到用户输入的邮箱哦!
这样一套流程走下来,用户填写的邮箱就能顺利传递到邮件模板,路由也完善好了,邮件发送功能就能正常工作啦~
内容的提问来源于stack exchange,提问作者NickCaves

