찾다
백엔드 개발PHP 튜토리얼laravel 基础教程 -- 邮件

邮件

简介

laravel 基于流行的 SwiftMailer 类库构建了一种干净简洁的邮件 API。laravel 提供了驱动以支持 SMTP,Mandrill,SparkPost,Amazon SES,PHP 的 mail 方法和 sendmail 方法,这允许你快速的开始构建通过本地或云服务发送邮件的功能。

驱动先决条件

基于 API 的驱动程序如 Mailgun 和 Mandrill 通常要比 SMTP 服务简单快速。所有的 API 驱动都必须引入 Guzzle HTTP 类库,你可以通过在 composer.json 文件中添加下面的内容来进行安装:

"guzzlehttp/guzzle": "~5.3|~6.0"

Mailgun 驱动

如果使用 Mailgun 驱动,你首先需要安装 Guzzle,然后设置 config/mail.php 配置文件的 driver 选项为 mailgun。然后,你需要确认你的 config/services.php 配置文件中包含以下选项:

'mailgun' => [  'domain' => 'your-mailgun-domain',  'secret' => 'your-mailgun-key',],

Mandrill 驱动

如果使用 Mandrill 驱动,你首先需要安装 Guzzle,然后设置 config/mail.php 配置文件的 driver 选项为 mandrill。接着,你需要确认你的 config/services.php 配置文件中包含以下选项:

'mandrill' => [  'secret' => 'your-mandrill-key',],

SparkPost 驱动

如果使用 SparkPost 驱动,你首先需要安装 Guzzle,然后设置你的 config/mail.php 配置文件中的 driver 选项为 sparkpost。接着,你需要确认你的 config/services.php 配置文件中包含以下选项:

'sparkpost' => [  'secret' => 'your-sparkpost-key',],

SES 驱动

如果使用 Amazon SES 驱动,你需要在 PHP 中引入 Amazon AWS SDK。你可以通过在 composer.json 文件中进行引入安装:

"aws/aws-sdk-php": "~3.0"

然后设置你的 config/mail.php 配置文件的 driver 选项为 ses。接着,你需要确认你的 config/services.php 配置文件中包含以下选项:

'ses' => [  'key' => 'your-ses-key',  'secret' => 'your-ses-secret',  'region' => 'ses-region', //e.g. us-east-1],

发送邮件

laravel 允许你使用视图来存储你的邮件信息。比如,你可以在 resources/views 目录下创建一个 emails 目录来管理你的邮件视图:

你需要使用 Mail 假面的 send 方法来发送一个邮件。send 方法接收三个参数,第一个参数应该是视图的名称。第二个参数应该是传递到视图中的数据所组成的数组。最后,是一个 Closure 回调函数,这个回调函数会接收一个 message 实例,这允许你自由的配置收件人,主题,和其他方面的邮件信息:

<?phpnamespace App\Http\Controller;use Mail;use App\User;use Illuminate\Http\Request;use App\Http\Controllers\Controller;class UserController extends Controller{  /**   * Send an e-mail reminder to the user.   *   * @param Request $request   * @param int $id   * @return Response   */   public function sendEmailReminder(Request $request, $id)   {     $user = User::findOrFail($id);     Mail::send('emails.reminder', ['user' => $user], function ($m) use ($user) {       $m->from('hello@app.com', 'Your Application');       $m->to($user->email, $user->name)->subject('Your Reminder!');     });   }}

因为上面的示例中我们传递了 user 键到数组中,所以我们可以在我们的邮件视图中使用用户的名称:

<?php echo $user->name; ?>

注意: 一个 $message 变量会自动的传递到邮件视图,并且允许内联附件。所以,你应该避免手动的传递到视图 message 变量。

构建一个 Message

就如我们上面谈到的,传递到 send 方法的第三个参数是一个 Closure,这个闭包允许你设置邮件信息的各种选项。使用闭包,你可以指定信息的其它属性,比如复写,密抄等:

Mail::send('emails.welcome', $data, function ($message) {  $message->from('us@example.com', 'Laravel');  $message->to('foo@example.com')->cc('bar@example.com');});

这里列出了 $message 构建实例所有可用的方法:

$message->from($address, $name = null);$message->sender($address, $name = null);$message->to($address, $name = null);$message->cc($address, $name = null);$message->bcc($address, $name = null);$message->replyTo($address, $name = null);$message->subject($subject);$message->priority($level);$message->attach($pathToFile, array $options = []);// Attach a file from a raw $data string...$message->attachData($data, $name, array $options = []);// Get the underlying SwiftMailer message instance...$message->getSwiftMessage();

注意:message 实例继承自 SwiftMailer 信息类并会被传递到 Mail::send 闭包中。这允许你在访问所有 SwiftMailer 信息类的方法。

纯文本邮件

默认的,send 方法会假设传递到其中的视图包含了 HTML。但是,你可以传递一个数组到 send 方法的第一个参数,你指定一个纯文本视图来合并 HTML 视图:

Mail::send(['html.view', 'text.view'], $data, $callback);

或者你可以只传递一个纯文本的邮件,你需要指定数组的键为 text:

Mail::send(['text' => 'view'], $data, $callback);

原始字符串邮件

你可以使用 raw 方法来直接发送原始字符串邮件:

Mail::raw('Text to e-mail', function ($message){  //});

附件

你可以使用传递到闭包中的 $message 对象的 attach 方法来在邮件中添加附件。attach 方法接收一个完整的文件路径作为第一个参数:

Mail::send('emails.welcome', $data, function ($message) {  //  $message->attach($pathToFile); });

当你添加一个邮件附件时,你可能也需要指定附件显示的名称或者 MIME type。你可以向 attach 方法传递一个数组作为第二个参数:

$message->attach($pathToFile, ['as' => $display, 'mime' => $mime]);

attachData 方法可以用来添加一个原始字节字符串作为一个附件。比如,你可能需要使用这个方法来将内存中生成的 PDF 直接添加到附件中,而不需要先存储到磁盘:

$message->attachData($pdf, 'invoice.pdf');$message->attachData($pdf, 'invoice.pdf', ['mime' => $mime]);

内联附件

在邮件视图中嵌入一个图片

在邮件中内联一个图片通常是比较笨重的。但是,laravel 提供了一种便捷的方式在你的邮件中附加一个图片并且取回适当的 CID。你需要在邮件视图中使用 $message 变量的 embed 方法。你应该记得,Laravel 会自动的创建一个 $message 变量并将其传递到你的邮件视图中:

<body>  Here is an image:  <img  src="<?php echo $message- alt="laravel 基础教程 -- 邮件" >embed($pathToFile); ?>"</body>

嵌入原始数据到视图

如果你希望嵌入一个原始数据到邮件信息中,你可以使用 $message 变量的 embedData 方法:

<body>  Here is an image from raw data:  <img  src="<?php echo $message- alt="laravel 基础教程 -- 邮件" >embedData($data, $name); ?>"</body>

邮件队列

队列化邮件信息

由于发送邮件是非常消耗资源的一件事,这样会影响到应用的响应时间。所以很多开发者都选择使用队列来完成异步的邮件发送。Laravel 使用统一的队列接口来使这些非常简单。你需要使用 Mail 假面的 queue 方法来使邮件队列化:

Mail::queue('emails.welcome', $data, function ($message) {  // });

该方法会自动的在队列添加发送邮件的任务,该任务会在后台自动的执行。当然,你需要先配置好队列。

延迟消息队列

如果你希望延迟执行邮件的发送队列。你需要使用 later 方法。你需要在方法的第一个参数传送一个你希望延迟执行的秒数:

Mail::later(5, 'emails.welcome', $data, function ($message) {  //});

添加到指定的队列

如果你希望添加邮件任务到指定的队列,你需要使用 queueOn 和 laterOn 方法:

Mail::queueOn('queue-name', 'emails.welcome', $data, function ($message) {  // });Mail::laterOn('queue-name', 5, 'emails.welcome', $data, function ($message) {  // });

邮件 & 本地开发

当开发一个发送邮件的服务时,你可能并不希望真实的去发送一个邮件。只需要模拟测试成功就可以了。laravel 提供了多种方式来禁用真实的邮件发送。

log 驱动

其中一个解决方案就是在本地开发时使用 log 邮件驱动。这个驱动会将所有的邮件信息写入到日志文件中。

通用的邮件

另外一个解决方案就是设置一个通用的邮件来接收所有的应用发出的邮件。这种方式,会使应用生成的所有邮件都发送到这个地址。你可以通过配置 config/mail.php 文件的 to 选项来进行设置:

'to' => [  'address' => 'dev@domain.com',  'name' => 'Dev Example'],

mailtrap

最后,你也可以使用一些像 Mailtrap 和 smtp 驱动的服务来发送你的邮件到一个虚拟邮箱,而且你也可以通过真实的邮件客户端进行查看。这可以使你看到真实的邮件在 Mailtrap 中的显示效果。

事件

laravel 会在发送邮件之前触发事件。你应该注意的是,它是在邮件发送之前触发事件,而不是添加到队列时。你可以在 EventServiceProvider 中注册一个事件监听者:

/** * The event listener mappings for the application. * * @var array */ protected $listen = [  'Illuminate\Mail\Events\MessageSending' => [    'App\Listeners\LogSentMessage',  ], ];
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
로드 밸런싱이 세션 관리에 어떤 영향을 미치는지 설명하고 해결 방법을 설명하십시오.로드 밸런싱이 세션 관리에 어떤 영향을 미치는지 설명하고 해결 방법을 설명하십시오.Apr 29, 2025 am 12:42 AM

로드 밸런싱은 세션 관리에 영향을 미치지 만 세션 복제, 세션 끈적임 및 중앙 집중식 세션 스토리지로 해결할 수 있습니다. 1. 세션 복제 복사 서버 간의 세션 데이터. 2. 세션 끈은 사용자 요청을 동일한 서버로 안내합니다. 3. 중앙 집중식 세션 스토리지는 Redis와 같은 독립 서버를 사용하여 세션 데이터를 저장하여 데이터 공유를 보장합니다.

세션 잠금의 개념을 설명하십시오.세션 잠금의 개념을 설명하십시오.Apr 29, 2025 am 12:39 AM

SessionLockingIsateChniqueSureDureauser의 SessionLockingSsessionRemainSexclusivetoOneuseratatime.itiscrucialforpreptingdatacorruptionandsecurityBreachesInmulti-userApplications.sessionLockingSogingSompletEdusingserVerver-sidelockingMegynisms, unrasprantlockinj

PHP 세션에 대한 대안이 있습니까?PHP 세션에 대한 대안이 있습니까?Apr 29, 2025 am 12:36 AM

PHP 세션의 대안에는 쿠키, 토큰 기반 인증, 데이터베이스 기반 세션 및 Redis/Memcached가 포함됩니다. 1. Cookies는 클라이언트에 데이터를 저장하여 세션을 관리합니다. 이는 단순하지만 보안이 적습니다. 2. Token 기반 인증은 토큰을 사용하여 사용자를 확인합니다. 이는 매우 안전하지만 추가 논리가 필요합니다. 3. Database 기반 세션은 데이터베이스에 데이터를 저장하여 확장 성이 좋지만 성능에 영향을 줄 수 있습니다. 4. Redis/Memcached는 분산 캐시를 사용하여 성능 및 확장 성을 향상하지만 추가 일치가 필요합니다.

PHP의 맥락에서 '세션 납치'라는 용어를 정의하십시오.PHP의 맥락에서 '세션 납치'라는 용어를 정의하십시오.Apr 29, 2025 am 12:33 AM

SessionHijacking은 사용자의 SessionID를 얻음으로써 사용자를 가장하는 공격자를 말합니다. 예방 방법은 다음과 같습니다. 1) HTTPS를 사용한 의사 소통 암호화; 2) SessionID의 출처를 확인; 3) 보안 세션 생성 알고리즘 사용; 4) 정기적으로 SessionID를 업데이트합니다.

PHP의 전체 형태는 무엇입니까?PHP의 전체 형태는 무엇입니까?Apr 28, 2025 pm 04:58 PM

이 기사는 PHP에 대해 설명하고, 전체 형식, 웹 개발의 주요 용도, Python 및 Java와의 비교 및 ​​초보자를위한 학습 용이성을 자세히 설명합니다.

PHP는 양식 데이터를 어떻게 처리합니까?PHP는 양식 데이터를 어떻게 처리합니까?Apr 28, 2025 pm 04:57 PM

PHP는 유효성 검사, 소독 및 보안 데이터베이스 상호 작용을 통해 보안을 보장하면서 $ \ _ post 및 $ \ _를 사용하여 데이터 양식 데이터를 처리합니다.

PHP와 ASP.NET의 차이점은 무엇입니까?PHP와 ASP.NET의 차이점은 무엇입니까?Apr 28, 2025 pm 04:56 PM

이 기사는 PHP와 ASP.NET을 비교하여 대규모 웹 응용 프로그램, 성능 차이 및 보안 기능에 대한 적합성에 중점을 둡니다. 둘 다 대규모 프로젝트에서는 실용적이지만 PHP는 오픈 소스 및 플랫폼 독립적이며 ASP.NET,

PHP는 사례에 민감한 언어입니까?PHP는 사례에 민감한 언어입니까?Apr 28, 2025 pm 04:55 PM

PHP의 사례 감도는 다양합니다. 함수는 무감각하고 변수와 클래스는 민감합니다. 모범 사례에는 일관된 이름 지정 및 비교를위한 사례 감수 기능 사용이 포함됩니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경