主页/PHP笔记/PHP问答/框架Laravel/Laravel: 发送带附件的邮件

Laravel: 发送带附件的邮件

Bug编译狮

Bug编译狮

好的,下面是如何使用Laravel框架发送带有附件的电子邮件的详细步骤。

1. 安装Laravel

首先,确保你已经安装了Laravel。如果没有安装,可以通过以下命令进行安装:

composer create-project --prefer-dist laravel/laravel my-laravel-app
cd my-laravel-app

2. 配置邮件服务

config/mail.php文件中配置你的邮件服务提供商。例如,如果你使用的是SMTP服务,可以这样配置:

'host' => env('MAIL_HOST', 'smtp.example.com'),
'port' => env('MAIL_PORT', 587),
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'user' => env('MAIL_USERNAME', ''),
'password' => env('MAIL_PASSWORD', ''),
'sendmail' => '/usr/sbin/sendmail -bs',
'markdown' => '.md',

3. 创建邮件模板

创建一个邮件模板文件,例如resources/views/mails/attachment-email.blade.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Attachment Email</title>
</head>
<body>
    <h1>Hello {{ $name }}</h1>
    <p>This is an email with an attachment.</p>

    @if ($files)
        <h2>Attachments:</h2>
        <ul>
            @foreach ($files as $file)
                <li>{{ $file->getClientOriginalName() }}</li>
            @endforeach
        </ul>
    @endif
</body>
</html>

4. 创建邮件类

创建一个邮件类,例如app/Mail/AttachmentEmail.php

namespace AppMail;

use IlluminateBusQueueable;
use IlluminateContractsQueueShouldQueue;
use IlluminateMailMailable;
use IlluminateSupportFacadesStorage;
use IlluminateQueueSerializesModels;

class AttachmentEmail extends Mailable
{
    use Queueable, SerializesModels;

    public $name;
    public $files;

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

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.attachment-email')
                    ->subject('Email with Attachment');
    }
}

5. 发送邮件

在控制器中发送邮件,例如app/Http/Controllers/MailController.php

namespace AppHttpControllers;

use AppMailAttachmentEmail;
use IlluminateHttpRequest;
use IlluminateSupportFacadesMail;

class MailController extends Controller
{
    public function sendMail()
    {
        // 示例文件路径
        $files = [
            Storage::disk('public')->path('example.pdf'),
            Storage::disk('public')->path('example.jpg'),
        ];

        Mail::to('recipient@example.com')
             ->attach($files[0])
             ->attach($files[1], ['as' => 'another_file'])
             ->send(new AttachmentEmail('John Doe', $files));

        return back()->with('success', 'Email sent successfully!');
    }
}

6. 测试邮件

运行以下命令来测试邮件是否成功发送:

php artisan serve

然后打开浏览器访问http://localhost:8000/mail/send-mail,你应该能够看到一封包含两个附件的电子邮件被发送到指定的收件人。

通过以上步骤,你可以使用Laravel框架轻松地发送带有附件的电子邮件。

黑板Bug讲师

黑板Bug讲师

介绍

发送带有附件的电子邮件在现代Web应用程序中是一种常见的要求。Laravel,作为一个强大的PHP框架,提供了使用内置邮件功能无缝发送带有附件的强大解决方案。在这篇教程中,我们将指导您通过基本示例逐步学习如何在Laravel中发送不同类型的内容。

设置电子邮件配置

在发送电子邮件之前,您必须在 Laravel 中配置邮件驱动。编辑您的.env请查看并设置正确的邮件设置:

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"

编辑完后,.env请清除配置缓存,请清空配置缓存。php artisan config:cache好的,请发送你需要翻译的内容。

基本的电子邮件,包含附件。

要发送带有附件的基本电子邮件,您可以使用。Mail抱歉,您的信息不完整,我无法理解您要翻译的内容。请提供更多信息或完整的句子。mailable好的,请提供您需要翻译的具体内容,我来帮您进行翻译。

use IlluminateSupportFacadesMail;
use AppMailInvoiceMail;

Mail::to('[email protected]')->send(new InvoiceMail());

对不起,我无法理解这句话的意思。InvoiceMail类应继承于IlluminateMailMailable并且包括附件在内。build方法:

use IlluminateMailMailable;

class InvoiceMail extends Mailable
{
    public function build()
    {
        return $this->subject('Your Invoice')->view('emails.invoice')->attach('/path/to/invoice.pdf');
    }
}

你应该现在有一个名为view的文件名。invoice.blade.php对不起,我不太明白您的意思,请重新描述您需要翻译的内容。resources/views/emails请提供需要翻译的内容。

收件人应该收到一封附有PDF发票的电子邮件。

多个附件

附件多文件到邮件就像把多个文件链接在一起一样简单。attach方法:

public function build()
{
    return $this->subject('Your Documents')->view('emails.documents')
        ->attach('/path/to/first/document.pdf')
        ->attach('/path/to/second/document.pdf');
}

每个你要添加的文件都可以单独添加。attach来电。电子邮件会包含您已附上的两份文件。

从原始数据中附加

你可以通过使用原始数据来附加文件。attachData方法:

public function build()
{
    $content = '...'; // The raw data of your file
    return $this->subject('Your Dynamic Document')->view('emails.dynamic')->attachData($content, 'dynamic-doc.pdf', [
            'mime' => 'application/pdf',
        ]);
}

在这种情况下,dynamic-doc.pdf作为电子邮件中显示的文件名。

高级用法

对于更高级的电子邮件附件场景,如根据条件添加附件或处理大型文件,您可以对附件过程进行更加精细的控制。

public function build()
{
    $email = $this->subject('Customized Documents')->view('emails.customized');
    if ($condition) {
        $email->attach('/path/to/conditional/document.pdf', [
            'as' => 'custom-name.pdf',
            'mime' => 'application/pdf',
        ]);
    }
    return $email;
}

在上述片段中,如果条件满足,则会在电子邮件中附加一个附件,并且会使用自定义文件名和特定的MIME类型。

使用队列发送带有附件的电子邮件

Laravel 的队列系统可以将邮件发送过程委托给作业,从而提高应用程序对最终用户的响应时间。以下是一个使用附件的队列化电子邮件示例:

use IlluminateBusQueueable;
use IlluminateQueueSerializesModels;
use IlluminateQueueInteractsWithQueue;
use IlluminateContractsQueueShouldQueue;
use IlluminateSupportFacadesMail;

class SendInvoiceEmailJob implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;

    public $invoice;

    public function __construct($invoice)
    {
        $this->invoice = $invoice;
    }

    public function handle()
    {
        Mail::to('[email protected]')->send(new InvoiceMail($this->invoice));
    }
}

为了处理这项工作,请使用以下信息:

dispatch(new SendInvoiceEmailJob($invoice));

您的邮件将被加入队列并背景处理。

结论

在Laravel中发送带有附件的电子邮件是一项简单的任务,可以根据您的应用需求进行定制。无论是发送简单的通知还是包含多个附件的复杂自动电子邮件响应,Laravel都提供了一种整洁且易于维护的方法。请务必在上线之前在安全环境中测试电子邮件功能,以避免意外的数据泄露。

长工码奴1523

长工码奴1523

要使用 Laravel 为 Laravel 应用程序创建一个带有附件的电子邮件,请按照以下步骤操作:

  1. 首先,确保你已经安装了 Laravel 和 Composer。

  2. 创建一个新的 Laravel 应用实例:

    composer create-project --prefer-dist laravel/laravel my-app
  3. 进入项目目录并初始化数据库:

    cd my-app
    php artisan db:seed --class=UsersTableSeeder
  4. app/Http/Kernel.php 文件中启用 Eloquent ORM,并添加附件支持:

    
    protected $middlewareGroups = [
    'auth' => [],
    
    // 添加其他需要验证的中间件
    ];

protected $routeMiddleware = [ ‘auth’ => AuthMiddlewareClass::class, ‘auth.basic’ => Authenticator::class, ‘cache.headers’ => CacheHeadersMiddleware::class, ‘can’ => CanMiddleware::class, ‘signed’ => SignedCookiesMiddleware::class, ‘throttle’ => ThrottlesLogins::class, ‘admin’ => AdminMiddleware::class,

'mail.mailer' => MailMailers::class,

];


5. 创建一个模型文件来存储附件信息(例如 `User` 模型):
```php
// models/User.php
use IlluminateDatabaseEloquentModel;
use IlluminateHttpUploadedFile;

class User extends Model
{
    protected $fillable = ['name', 'email'];

    public function files()
    {
        return $this->hasMany(File::class);
    }
}
  1. 使用 Laravel 的 Eloquent ORM 将附件添加到用户模型中:
    
    public function files()
    {
    return $this->hasMany('AppModelsFile');
    }

public function uploadFile($file) { if ($file instanceof UploadedFile) { $this->files()->create([ ‘filename’ => $file->getClientOriginalName(), ‘path’ => $file->storeAs(‘uploads’, $file->getFilename()), ]); } }


7. 创建一个控制器来处理邮件发送请求:
```php
// controllers/MailController.php
namespace AppHttpControllers;

use IlluminateSupportFacadesMail;
use IlluminateHttpRequest;
use AppUser;

class MailController extends Controller
{
    public function sendEmail(Request $request)
    {
        $data = $request->all();
        $subject = $data['subject'];
        $message = $data['message'];
        $to = $data['to'];
        $from = config('app.email.from');

        Mail::send('emails.' . $data['template'], $data, function ($m) use ($subject, $message, $to, $from) {
            $m->from($from)->to($to)->subject($subject)->view('emails.' . $data['template']);
        });

        return response()->json(['success' => true]);
    }
}
  1. 修改 config/app.php 文件以设置发件人的邮箱地址和密码。

    return [
    ...
    'mail' => [
        'driver' => 'smtp',
        'host' => env('MAIL_HOST', 'localhost'),
        'encryption' => 'tls',
        'username' => env('MAIL_USERNAME', ''),
        'password' => env('MAIL_PASSWORD', ''),
        'from' => [
            'address' => env('MAIL_FROM_ADDRESS', 'no-reply@example.com'),
            'name' => env('MAIL_FROM_NAME', 'No Reply'),
        ],
        'to' => [
            'address' => $to,
            'name' => $name,
        ],
    ],
    ];
  2. 创建一个模板文件(例如 emails.html.twig),其中包含所需的内容和变量:

    <!-- emails.html.twig -->
    {% block content %}
    <div>
        <h1>{{ subject }}</h1>
        <p>{{ message }}</p>
    </div>
    {% endblock %}

现在,你可以使用以下命令发送带有附件的邮件:

php artisan make:mailer EmailMailer --template=emails.html.twig

这将生成一个名为 EmailMailer 的新类,并自动生成相应的模板文件。

接下来,你需要在 Laravel 控制器中注册这个新的邮件发送器,并配置它接收来自指定收件人地址的邮件。

// controllers/EmailController.php
namespace AppHttpControllers;

use IlluminateSupportFacadesMail;
use AppMailEmailMailer;
use IlluminateHttpRequest;

class EmailController extends Controller
{
    public function index(Request $request)
    {
        Mail::to($request->input('to'))->send(new EmailMailer($request));
        return response()->json(['success' => true]);
    }
}

现在,每当用户通过表单提交带有附件的邮件时,Laravel 应用就会自动发送一封带有附件的邮件。只需修改模板中的 {{ to }} 变量即可向不同的收件人发送邮件。