{"id":2644,"date":"2025-03-24T08:46:52","date_gmt":"2025-03-23T23:46:52","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2644"},"modified":"2025-03-24T08:47:21","modified_gmt":"2025-03-23T23:47:21","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91laravel%e3%81%aemail%e6%a9%9f%e8%83%bd%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89-%e5%ae%9f%e8%a3%85%e6%89%8b%e9%a0%86%e3%81%8b%e3%82%89%e5%bf%9c","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2644","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Laravel\u306eMail\u6a5f\u80fd\u5b8c\u5168\u30ac\u30a4\u30c9 &#8211; \u5b9f\u88c5\u624b\u9806\u304b\u3089\u5fdc\u7528\u4f8b\u307e\u3067"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Laravel \u306e Mail \u6a5f\u80fd\u3068\u306f<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">Laravel Mail \u304c\u63d0\u4f9b\u3059\u308b\u4e3b\u8981\u306a\u6a5f\u80fd\u3068\u7279\u5fb4<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-2\">\u5f93\u6765\u306e PHP \u30e1\u30fc\u30eb\u5b9f\u88c5\u3068\u6bd4\u8f03\u3067\u308f\u304b\u308b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-7\">\u30e1\u30fc\u30eb\u6a5f\u80fd\u306e\u57fa\u672c\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u624b\u9806<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-8\">\u5fc5\u8981\u306a\u74b0\u5883\u8a2d\u5b9a\u3068\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/a>      <\/li>      <li>        <a href=\"#i-9\">\u30e1\u30fc\u30eb\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u8a73\u7d30\u306a\u89e3\u8aac<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-10\">SMTP \u30b5\u30fc\u30d0\u30fc\u3068\u306e\u63a5\u7d9a\u8a2d\u5b9a\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-11\">Mailable \u30af\u30e9\u30b9\u3092\u4f7f\u7528\u3057\u305f\u30e1\u30fc\u30eb\u4f5c\u6210<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-12\">Mailable \u30af\u30e9\u30b9\u306e\u57fa\u672c\u69cb\u9020\u3068\u5f79\u5272<\/a>      <\/li>      <li>        <a href=\"#i-13\">\u30d3\u30e5\u30fc\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u4f5c\u6210\u3068\u30c7\u30fc\u30bf\u53d7\u3051\u6e21\u3057<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-14\">\u6dfb\u4ed8\u30d5\u30a1\u30a4\u30eb\u306e\u6271\u3044\u65b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-15\">\u5b9f\u8df5\u7684\u306a\u30e1\u30fc\u30eb\u9001\u4fe1\u30d1\u30bf\u30fc\u30f3<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-16\">\u540c\u671f\u7684\u306a\u9001\u4fe1\u3068\u975e\u540c\u671f\u9001\u4fe1\u306e\u7528\u9014<\/a>      <\/li>      <li>        <a href=\"#i-17\">\u30e1\u30fc\u30eb\u30ad\u30e5\u30fc\u3092\u4f7f\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u51e6\u7406<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-18\">\u8907\u6570\u306e\u53d7\u4fe1\u8005\u3078\u306e\u4e00\u62ec\u9001\u4fe1\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-19\">\u30e1\u30fc\u30eb\u306e\u30c6\u30b9\u30c8\u3068\u958b\u767a\u74b0\u5883\u3067\u306e\u78ba\u8a8d\u65b9\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-20\">Mailtrap \u3092\u4f7f\u7528\u3057\u305f\u30e1\u30fc\u30eb\u30c6\u30b9\u30c8\u74b0\u5883\u306e\u69cb\u7bc9<\/a>      <\/li>      <li>        <a href=\"#i-21\">\u5358\u4f53\u30c6\u30b9\u30c8\u3067\u306e\u30e1\u30fc\u30eb\u9001\u4fe1\u306e\u30c6\u30b9\u30c8\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-22\">\u4e00\u822c\u7684\u306a\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-23\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-24\">\u30e1\u30fc\u30eb\u9001\u4fe1\u6642\u306e\u4e00\u822c\u7684\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30ea\u30b9\u30af<\/a>      <\/li>      <li>        <a href=\"#i-25\">\u5927\u898f\u6a21\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u5bfe\u7b56<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-26\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-27\">\u767a\u5c55\u7684\u306a\u4f7f\u7528\u4f8b\u3068\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-28\">\u30de\u30fc\u30af\u30c0\u30a6\u30f3\u30e1\u30fc\u30eb\u306e\u6d3b\u7528\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-29\">\u30e1\u30fc\u30eb\u901a\u77e5\u30b7\u30b9\u30c6\u30e0\u306e\u5b9f\u88c5\u4f8b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-30\">\u30ab\u30b9\u30bf\u30e0\u30c8\u30e9\u30f3\u30b9\u30dd\u30fc\u30c8\u306e\u4f5c\u6210\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">Laravel \u306e Mail \u6a5f\u80fd\u3068\u306f<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">Laravel Mail \u304c\u63d0\u4f9b\u3059\u308b\u4e3b\u8981\u306a\u6a5f\u80fd\u3068\u7279\u5fb4<\/h3>\n\n\n\n<p>Laravel\u306eMail\u6a5f\u80fd\u306f\u3001PHP\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u30e1\u30fc\u30eb\u9001\u4fe1\u3092\u7c21\u5358\u304b\u3064\u5f37\u529b\u306b\u5b9f\u73fe\u3059\u308b\u305f\u3081\u306e\u6a5f\u80fd\u3067\u3059\u3002\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u4e3b\u8981\u306a\u6a5f\u80fd\u3092\u63d0\u4f9b\u3057\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Mailable\u30af\u30e9\u30b9\u306b\u3088\u308b\u69cb\u9020\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u6307\u5411\u7684\u306a\u30e1\u30fc\u30eb\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30d3\u30e5\u30fc\u3068\u30ed\u30b8\u30c3\u30af\u306e\u5206\u96e2<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u5bb9\u6613\u6027\u306e\u5411\u4e0a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8c4a\u5bcc\u306a\u9001\u4fe1\u30aa\u30d7\u30b7\u30e7\u30f3<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SMTP<\/li>\n\n\n\n<li>Mailgun<\/li>\n\n\n\n<li>Amazon SES<\/li>\n\n\n\n<li>\u305d\u306e\u4ed6\u306e\u4e3b\u8981\u306a\u30e1\u30fc\u30eb\u30b5\u30fc\u30d3\u30b9<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u9ad8\u5ea6\u306a\u6a5f\u80fd\u30b5\u30dd\u30fc\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>HTML\u30e1\u30fc\u30eb<\/li>\n\n\n\n<li>\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8\u30e1\u30fc\u30eb<\/li>\n\n\n\n<li>\u6dfb\u4ed8\u30d5\u30a1\u30a4\u30eb<\/li>\n\n\n\n<li>\u30a4\u30f3\u30e9\u30a4\u30f3\u6dfb\u4ed8<\/li>\n\n\n\n<li>\u30ad\u30e5\u30fc\u51e6\u7406\u306b\u3088\u308b\u975e\u540c\u671f\u9001\u4fe1<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u958b\u767a\u652f\u63f4\u6a5f\u80fd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ed\u30fc\u30ab\u30eb\u958b\u767a\u7528\u306e\u30ed\u30b0\u30c9\u30e9\u30a4\u30d0\u30fc<\/li>\n\n\n\n<li>Mailtrap\u3068\u306e\u7c21\u5358\u306a\u7d71\u5408<\/li>\n\n\n\n<li>\u30c6\u30b9\u30c8\u7528\u306e\u30a2\u30b5\u30fc\u30b7\u30e7\u30f3<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">\u5f93\u6765\u306e PHP \u30e1\u30fc\u30eb\u5b9f\u88c5\u3068\u6bd4\u8f03\u3067\u308f\u304b\u308b<\/h3>\n\n\n\n<p>\u5f93\u6765\u306ePHP\u3067\u306e\u30e1\u30fc\u30eb\u5b9f\u88c5\u3068\u6bd4\u8f03\u3057\u305f\u969b\u306eLaravel Mail\u306e\u4e3b\u306a\u5229\u70b9\u3092\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\uff1a<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-3\">1. \u30b3\u30fc\u30c9\u306e\u53ef\u8aad\u6027\u3068\u4fdd\u5b88\u6027<\/h4>\n\n\n\n<p><strong>\u5f93\u6765\u306ePHP\u3067\u306e\u30e1\u30fc\u30eb\u9001\u4fe1\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u5f93\u6765\u306ePHP\u30e1\u30fc\u30eb\u5b9f\u88c5\u4f8b\n$to = 'recipient@example.com';\n$subject = '\u30c6\u30b9\u30c8\u30e1\u30fc\u30eb';\n$message = '\u3053\u308c\u306f\u30c6\u30b9\u30c8\u30e1\u30fc\u30eb\u3067\u3059\u3002';\n$headers = 'From: sender@example.com' . \"\\r\\n\" .\n    'Reply-To: sender@example.com' . \"\\r\\n\" .\n    'X-Mailer: PHP\/' . phpversion();\n\nmail($to, $subject, $message, $headers);<\/pre>\n\n\n\n<p><strong>Laravel\u3067\u306eMailable\u3092\u4f7f\u7528\u3057\u305f\u5b9f\u88c5\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Laravel Mailable\u30af\u30e9\u30b9\u306e\u5b9f\u88c5\u4f8b\nclass WelcomeMail extends Mailable\n{\n    public function build()\n    {\n        return $this-&gt;from('sender@example.com')\n                    -&gt;subject('\u30c6\u30b9\u30c8\u30e1\u30fc\u30eb')\n                    -&gt;view('emails.welcome');\n    }\n}\n\n\/\/ \u9001\u4fe1\u6642\u306e\u547c\u3073\u51fa\u3057\nMail::to('recipient@example.com')-&gt;send(new WelcomeMail());<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-4\">2. \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u6539\u5584<\/h4>\n\n\n\n<p>\u5f93\u6765\u306ePHP\u5b9f\u88c5\u3067\u306f\u3001\u30e1\u30fc\u30eb\u9001\u4fe1\u306e\u5931\u6557\u3092\u9069\u5207\u306b\u691c\u77e5\u3057\u51e6\u7406\u3059\u308b\u3053\u3068\u304c\u56f0\u96e3\u3067\u3057\u305f\u3002\u4e00\u65b9\u3001Laravel\u306eMail\u6a5f\u80fd\u3067\u306f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u51e6\u7406\u306b\u3088\u308b\u660e\u78ba\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u5931\u6557\u6642\u306e\u518d\u8a66\u884c\u6a5f\u80fd<\/li>\n\n\n\n<li>\u30ed\u30b0\u306b\u3088\u308b\u8a73\u7d30\u306a\u8ffd\u8de1<\/li>\n\n\n\n<li>\u30ad\u30e5\u30fc\u3092\u4f7f\u7528\u3057\u305f\u4fe1\u983c\u6027\u306e\u5411\u4e0a<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-5\">3. \u30c6\u30b9\u30c8\u5bb9\u6613\u6027<\/h4>\n\n\n\n<p>Laravel Mail\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30c6\u30b9\u30c8\u304c\u7c21\u5358\u306b\u5b9f\u88c5\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30e1\u30fc\u30eb\u9001\u4fe1\u306e\u30c6\u30b9\u30c8\u4f8b\npublic function test_welcome_email_contains_correct_data()\n{\n    Mail::fake();\n\n    \/\/ \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b3\u30fc\u30c9\n    Mail::to('test@example.com')-&gt;send(new WelcomeMail());\n\n    \/\/ \u30a2\u30b5\u30fc\u30b7\u30e7\u30f3\n    Mail::assertSent(WelcomeMail::class, function ($mail) {\n        return $mail-&gt;hasTo('test@example.com');\n    });\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-6\">4. \u8a2d\u5b9a\u306e\u67d4\u8edf\u6027<\/h4>\n\n\n\n<p>Laravel Mail\u306f<code>.env<\/code>\u30d5\u30a1\u30a4\u30eb\u3092\u901a\u3058\u3066\u3001\u74b0\u5883\u3054\u3068\u306b\u7570\u306a\u308b\u8a2d\u5b9a\u3092\u7c21\u5358\u306b\u5207\u308a\u66ff\u3048\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">MAIL_MAILER=smtp\nMAIL_HOST=smtp.mailtrap.io\nMAIL_PORT=2525\nMAIL_USERNAME=username\nMAIL_PASSWORD=password\nMAIL_ENCRYPTION=tls<\/pre>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306a\u8a2d\u8a08\u306b\u3088\u308a\u3001\u958b\u767a\u74b0\u5883\u3068\u672c\u756a\u74b0\u5883\u3067\u7570\u306a\u308b\u30e1\u30fc\u30eb\u8a2d\u5b9a\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u304c\u5bb9\u6613\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-7\">\u30e1\u30fc\u30eb\u6a5f\u80fd\u306e\u57fa\u672c\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u624b\u9806<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">\u5fc5\u8981\u306a\u74b0\u5883\u8a2d\u5b9a\u3068\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h3>\n\n\n\n<p>Laravel \u3067\u30e1\u30fc\u30eb\u6a5f\u80fd\u3092\u4f7f\u7528\u3059\u308b\u305f\u3081\u306e\u57fa\u672c\u7684\u306a\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u624b\u9806\u3092\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u78ba\u8a8d<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># composer.json\u306b\u4ee5\u4e0b\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u304c\u542b\u307e\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\n\"require\": {\n    \"php\": \"^8.1\",\n    \"laravel\/framework\": \"^10.0\",\n    \"guzzlehttp\/guzzle\": \"^7.2\"  \/\/ HTTP\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\uff08\u5916\u90e8SMTP\u30b5\u30fc\u30d3\u30b9\u7528\uff09\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Symfony\u30e1\u30fc\u30eb\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/strong>\uff08\u5fc5\u8981\u306a\u5834\u5408\uff09<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">composer require symfony\/mailgun-mailer symfony\/http-client<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u958b\u767a\u74b0\u5883\u3067\u306eMailtrap\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<\/strong>\uff08\u63a8\u5968\uff09<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">composer require wildbit\/swiftmailer-mailtrap<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u30e1\u30fc\u30eb\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u8a73\u7d30\u306a\u89e3\u8aac<\/h3>\n\n\n\n<p>Laravel \u306e\u30e1\u30fc\u30eb\u8a2d\u5b9a\u306f <code>config\/mail.php<\/code> \u3068 <code>.env<\/code> \u30d5\u30a1\u30a4\u30eb\u3067\u7ba1\u7406\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u69cb\u9020<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/mail.php \u306e\u4e3b\u8981\u306a\u8a2d\u5b9a\u9805\u76ee\nreturn [\n    'default' =&gt; env('MAIL_MAILER', 'smtp'),  \/\/ \u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u30e1\u30fc\u30e9\u30fc\n\n    'mailers' =&gt; [\n        'smtp' =&gt; [\n            'transport' =&gt; 'smtp',\n            'host' =&gt; env('MAIL_HOST', 'smtp.mailgun.org'),\n            'port' =&gt; env('MAIL_PORT', 587),\n            'encryption' =&gt; env('MAIL_ENCRYPTION', 'tls'),\n            'username' =&gt; env('MAIL_USERNAME'),\n            'password' =&gt; env('MAIL_PASSWORD'),\n            'timeout' =&gt; null,\n            'local_domain' =&gt; env('MAIL_EHLO_DOMAIN'),\n        ],\n\n        'ses' =&gt; [\n            'transport' =&gt; 'ses',\n        ],\n\n        'mailgun' =&gt; [\n            'transport' =&gt; 'mailgun',\n        ],\n    ],\n\n    'from' =&gt; [\n        'address' =&gt; env('MAIL_FROM_ADDRESS', 'hello@example.com'),\n        'name' =&gt; env('MAIL_FROM_NAME', 'Example'),\n    ],\n];<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u74b0\u5883\u5909\u6570\u306e\u8a2d\u5b9a\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u57fa\u672c\u7684\u306aSMTP\u8a2d\u5b9a\nMAIL_MAILER=smtp\nMAIL_HOST=smtp.mailtrap.io\nMAIL_PORT=2525\nMAIL_USERNAME=your_username\nMAIL_PASSWORD=your_password\nMAIL_ENCRYPTION=tls\nMAIL_FROM_ADDRESS=from@example.com\nMAIL_FROM_NAME=\"${APP_NAME}\"\n\n# Mailgun\u8a2d\u5b9a\u306e\u4f8b\nMAILGUN_DOMAIN=your-domain.com\nMAILGUN_SECRET=your-mailgun-key\nMAILGUN_ENDPOINT=api.mailgun.net<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u8a2d\u5b9a\u5024\u306e\u8aac\u660e<\/strong><\/li>\n<\/ol>\n\n\n<div id=\"id-f8f5ec14-a77d-46b4-bc19-a6bf5bb089b0\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u8a2d\u5b9a\u9805\u76ee<\/th><th>\u8aac\u660e<\/th><th>\u4e00\u822c\u7684\u306a\u5024<\/th><\/tr><\/thead><tbody><tr><td>MAIL_MAILER<\/td><td>\u4f7f\u7528\u3059\u308b\u30e1\u30fc\u30eb\u30c9\u30e9\u30a4\u30d0\u30fc<\/td><td>smtp, ses, mailgun \u306a\u3069<\/td><\/tr><tr><td>MAIL_HOST<\/td><td>SMTP\u30b5\u30fc\u30d0\u30fc\u306e\u30db\u30b9\u30c8\u540d<\/td><td>smtp.gmail.com, smtp.mailtrap.io \u306a\u3069<\/td><\/tr><tr><td>MAIL_PORT<\/td><td>SMTP\u30b5\u30fc\u30d0\u30fc\u306e\u30dd\u30fc\u30c8<\/td><td>587 (TLS), 465 (SSL)<\/td><\/tr><tr><td>MAIL_ENCRYPTION<\/td><td>\u6697\u53f7\u5316\u65b9\u5f0f<\/td><td>tls, ssl, null<\/td><\/tr><tr><td>MAIL_USERNAME<\/td><td>SMTP\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30e6\u30fc\u30b6\u30fc\u540d<\/td><td>\u2013<\/td><\/tr><tr><td>MAIL_PASSWORD<\/td><td>SMTP\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30d1\u30b9\u30ef\u30fc\u30c9<\/td><td>\u2013<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">SMTP \u30b5\u30fc\u30d0\u30fc\u3068\u306e\u63a5\u7d9a\u8a2d\u5b9a\u65b9\u6cd5<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4e00\u822c\u7684\u306aSMTP\u30b5\u30fc\u30d3\u30b9\u306e\u8a2d\u5b9a\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<p><strong>Gmail SMTP\u306e\u5834\u5408\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">MAIL_MAILER=smtp\nMAIL_HOST=smtp.gmail.com\nMAIL_PORT=587\nMAIL_USERNAME=your-gmail@gmail.com\nMAIL_PASSWORD=your-app-specific-password\nMAIL_ENCRYPTION=tls\nMAIL_FROM_ADDRESS=your-gmail@gmail.com\nMAIL_FROM_NAME=\"${APP_NAME}\"<\/pre>\n\n\n\n<p><strong>Amazon SES\u306e\u5834\u5408\uff1a<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">MAIL_MAILER=ses\nAWS_ACCESS_KEY_ID=your-access-key\nAWS_SECRET_ACCESS_KEY=your-secret-key\nAWS_DEFAULT_REGION=ap-northeast-1<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u63a5\u7d9a\u30c6\u30b9\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<p>\u8a2d\u5b9a\u304c\u6b63\u3057\u304f\u884c\u308f\u308c\u3066\u3044\u308b\u304b\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306e\u30c6\u30b9\u30c8\u30b3\u30fc\u30c9\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">use Illuminate\\Support\\Facades\\Mail;\n\ntry {\n    Mail::raw('\u30c6\u30b9\u30c8\u30e1\u30fc\u30eb', function($message) {\n        $message-&gt;to('test@example.com')\n                -&gt;subject('SMTP\u63a5\u7d9a\u30c6\u30b9\u30c8');\n    });\n\n    return '\u9001\u4fe1\u6210\u529f\uff01';\n} catch (\\Exception $e) {\n    return '\u9001\u4fe1\u5931\u6557: ' . $e-&gt;getMessage();\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u30dd\u30a4\u30f3\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u63a5\u7d9a\u30a8\u30e9\u30fc\u306e\u5834\u5408<\/strong><\/li>\n\n\n\n<li>\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u3067\u30dd\u30fc\u30c8\u304c\u958b\u653e\u3055\u308c\u3066\u3044\u308b\u304b\u78ba\u8a8d<\/li>\n\n\n\n<li>SSL\/TLS\u8a2d\u5b9a\u304c\u6b63\u3057\u3044\u304b\u78ba\u8a8d<\/li>\n\n\n\n<li>\u30b5\u30fc\u30d0\u30fc\u306e\u8a3c\u660e\u66f8\u304c\u6709\u52b9\u304b\u78ba\u8a8d<\/li>\n\n\n\n<li><strong>\u8a8d\u8a3c\u30a8\u30e9\u30fc\u306e\u5834\u5408<\/strong><\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u540d\u3068\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u6b63\u3057\u3044\u304b\u78ba\u8a8d<\/li>\n\n\n\n<li>\u4e8c\u8981\u7d20\u8a8d\u8a3c\u304c\u6709\u52b9\u306a\u5834\u5408\u3001\u30a2\u30d7\u30ea\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u4f7f\u7528<\/li>\n\n\n\n<li>IP\u30a2\u30c9\u30ec\u30b9\u304c\u8a31\u53ef\u30ea\u30b9\u30c8\u306b\u5165\u3063\u3066\u3044\u308b\u304b\u78ba\u8a8d<\/li>\n\n\n\n<li><strong>\u9001\u4fe1\u5236\u9650\u306b\u95a2\u3059\u308b\u6ce8\u610f<\/strong><\/li>\n\n\n\n<li>SMTP\u30b5\u30fc\u30d3\u30b9\u306e\u5236\u9650\uff08\u6642\u9593\u5f53\u305f\u308a\u306e\u9001\u4fe1\u6570\u306a\u3069\uff09\u3092\u78ba\u8a8d<\/li>\n\n\n\n<li>\u5927\u91cf\u9001\u4fe1\u6642\u306f\u30ad\u30e5\u30fc\u306e\u4f7f\u7528\u3092\u691c\u8a0e<\/li>\n<\/ul>\n\n\n\n<p>\u4ee5\u4e0a\u306e\u8a2d\u5b9a\u304c\u5b8c\u4e86\u3059\u308c\u3070\u3001Laravel \u3067\u306e\u30e1\u30fc\u30eb\u9001\u4fe1\u6a5f\u80fd\u306e\u57fa\u672c\u7684\u306a\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u306f\u5b8c\u4e86\u3067\u3059\u3002\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\u3067\u306f\u3001\u5b9f\u969b\u306e\u30e1\u30fc\u30eb\u9001\u4fe1\u51e6\u7406\u306e\u5b9f\u88c5\u306b\u9032\u3080\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-11\">Mailable \u30af\u30e9\u30b9\u3092\u4f7f\u7528\u3057\u305f\u30e1\u30fc\u30eb\u4f5c\u6210<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-12\">Mailable \u30af\u30e9\u30b9\u306e\u57fa\u672c\u69cb\u9020\u3068\u5f79\u5272<\/h3>\n\n\n\n<p>Mailable\u30af\u30e9\u30b9\u306f\u3001\u30e1\u30fc\u30eb\u306e\u5185\u5bb9\u3068\u30ed\u30b8\u30c3\u30af\u3092\u30ab\u30d7\u30bb\u30eb\u5316\u3059\u308b Laravel \u306e\u4e3b\u8981\u306a\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Mailable\u30af\u30e9\u30b9\u306e\u4f5c\u6210<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># artisan\u30b3\u30de\u30f3\u30c9\u3067Mailable\u30af\u30e9\u30b9\u3092\u751f\u6210\nphp artisan make:mail WelcomeMail<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306aMailable\u30af\u30e9\u30b9\u306e\u69cb\u9020<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">namespace App\\Mail;\n\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Mail\\Mailable;\nuse Illuminate\\Queue\\SerializesModels;\n\nclass WelcomeMail extends Mailable\n{\n    use Queueable, SerializesModels;\n\n    public $user;  \/\/ \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306b\u6e21\u3059\u30c7\u30fc\u30bf\n\n    public function __construct($user)\n    {\n        $this-&gt;user = $user;\n    }\n\n    public function build()\n    {\n        return $this-&gt;from('from@example.com')\n                    -&gt;subject('\u3088\u3046\u3053\u305d\uff01')\n                    -&gt;view('emails.welcome');\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u4e3b\u8981\u306a\u30e1\u30bd\u30c3\u30c9\u3068\u6a5f\u80fd<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u3055\u307e\u3056\u307e\u306a\u8a2d\u5b9a\u30e1\u30bd\u30c3\u30c9\u306e\u4f8b\npublic function build()\n{\n    return $this-&gt;from('sender@example.com')         \/\/ \u9001\u4fe1\u8005\u30a2\u30c9\u30ec\u30b9\n                -&gt;replyTo('reply@example.com')       \/\/ \u8fd4\u4fe1\u5148\n                -&gt;cc('cc@example.com')               \/\/ CC\n                -&gt;bcc('bcc@example.com')             \/\/ BCC\n                -&gt;subject('\u30e1\u30fc\u30eb\u306e\u4ef6\u540d')             \/\/ \u4ef6\u540d\n                -&gt;priority(1)                        \/\/ \u512a\u5148\u5ea6\uff081=\u9ad8\u30013=\u901a\u5e38\u30015=\u4f4e\uff09\n                -&gt;view('emails.welcome');            \/\/ \u30d3\u30e5\u30fc\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">\u30d3\u30e5\u30fc\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u4f5c\u6210\u3068\u30c7\u30fc\u30bf\u53d7\u3051\u6e21\u3057<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u30d3\u30e5\u30fc\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u4f5c\u6210<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ resources\/views\/emails\/welcome.blade.php\n&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;head&gt;\n    &lt;meta charset=\"utf-8\"&gt;\n    &lt;title&gt;\u3088\u3046\u3053\u305d\u30e1\u30fc\u30eb&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;h1&gt;\u3088\u3046\u3053\u305d\u3001{{ $user-&gt;name }}\u3055\u3093&lt;\/h1&gt;\n\n    &lt;p&gt;\u30a2\u30ab\u30a6\u30f3\u30c8\u304c\u6b63\u5e38\u306b\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u3002&lt;\/p&gt;\n\n    &lt;ul&gt;\n        &lt;li&gt;\u30e6\u30fc\u30b6\u30fc\u540d: {{ $user-&gt;name }}&lt;\/li&gt;\n        &lt;li&gt;\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9: {{ $user-&gt;email }}&lt;\/li&gt;\n        &lt;li&gt;\u767b\u9332\u65e5\u6642: {{ $user-&gt;created_at-&gt;format('Y-m-d H:i') }}&lt;\/li&gt;\n    &lt;\/ul&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Markdown \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Markdown\u30e1\u30fc\u30eb\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u751f\u6210\nphp artisan make:mail WelcomeMail --markdown=emails.welcome<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Markdown\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u4f8b\n\/\/ resources\/views\/emails\/welcome.blade.php\n@component('mail::message')\n# \u3088\u3046\u3053\u305d\u3001{{ $user-&gt;name }}\u3055\u3093\n\n\u30a2\u30ab\u30a6\u30f3\u30c8\u304c\u6b63\u5e38\u306b\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u3002\n\n@component('mail::button', ['url' =&gt; $loginUrl])\n\u30ed\u30b0\u30a4\u30f3\u3059\u308b\n@endcomponent\n\n@component('mail::table')\n| \u30a2\u30ab\u30a6\u30f3\u30c8\u60c5\u5831 | \u5024 |\n|---------------|-----|\n| \u30e6\u30fc\u30b6\u30fc\u540d | {{ $user-&gt;name }} |\n| \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9 | {{ $user-&gt;email }} |\n| \u767b\u9332\u65e5\u6642 | {{ $user-&gt;created_at-&gt;format('Y-m-d H:i') }} |\n@endcomponent\n\n\u3054\u4e0d\u660e\u306a\u70b9\u304c\u3054\u3056\u3044\u307e\u3057\u305f\u3089\u3001\u304a\u6c17\u8efd\u306b\u304a\u554f\u3044\u5408\u308f\u305b\u304f\u3060\u3055\u3044\u3002\n\nThanks,&lt;br&gt;\n{{ config('app.name') }}\n@endcomponent<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30c7\u30fc\u30bf\u306e\u53d7\u3051\u6e21\u3057\u65b9\u6cd5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3067\u306e\u30e1\u30fc\u30eb\u9001\u4fe1\u4f8b\nnamespace App\\Http\\Controllers;\n\nuse App\\Mail\\WelcomeMail;\nuse Illuminate\\Support\\Facades\\Mail;\n\nclass UserController extends Controller\n{\n    public function register(Request $request)\n    {\n        $user = User::create($request-&gt;all());\n\n        \/\/ \u30e1\u30fc\u30eb\u9001\u4fe1\n        Mail::to($user-&gt;email)-&gt;send(new WelcomeMail($user));\n\n        return redirect()-&gt;route('home');\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u6dfb\u4ed8\u30d5\u30a1\u30a4\u30eb\u306e\u6271\u3044\u65b9<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u6dfb\u4ed8\u30d5\u30a1\u30a4\u30eb\u306e\u8ffd\u52a0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function build()\n{\n    return $this-&gt;view('emails.order')\n                -&gt;attach(storage_path('app\/invoice.pdf'), [\n                    'as' =&gt; '\u8acb\u6c42\u66f8.pdf',\n                    'mime' =&gt; 'application\/pdf',\n                ]);\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u4e0a\u306e\u30c7\u30fc\u30bf\u3092\u6dfb\u4ed8<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function build()\n{\n    $pdf = PDF::loadView('pdf.invoice', ['order' =&gt; $this-&gt;order]);\n\n    return $this-&gt;view('emails.order')\n                -&gt;attachData($pdf-&gt;output(), '\u8acb\u6c42\u66f8.pdf', [\n                    'mime' =&gt; 'application\/pdf',\n                ]);\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30a4\u30f3\u30e9\u30a4\u30f3\u6dfb\u4ed8\uff08\u753b\u50cf\u306a\u3069\uff09<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function build()\n{\n    return $this-&gt;view('emails.welcome')\n                -&gt;embed(storage_path('app\/logo.png'), 'logo');\n}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3067\u306e\u4f7f\u7528\u4f8b --&gt;\n&lt;body&gt;\n    &lt;img src=\"{{ $message-&gt;embed(storage_path('app\/logo.png')) }}\"&gt;\n    &lt;!-- \u307e\u305f\u306f --&gt;\n    &lt;img src=\"{{ $message-&gt;embedData($imageData, 'logo.png') }}\"&gt;\n&lt;\/body&gt;<\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>\u8907\u6570\u306e\u6dfb\u4ed8\u30d5\u30a1\u30a4\u30eb<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function build()\n{\n    return $this-&gt;view('emails.report')\n                -&gt;attach(storage_path('app\/report.pdf'))\n                -&gt;attach(storage_path('app\/data.xlsx'))\n                -&gt;attachFromStorage('documents\/terms.pdf')\n                -&gt;attachFromStorageDisk('s3', 'documents\/contract.pdf');\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6a5f\u80fd\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u30d3\u30b8\u30cd\u30b9\u30cb\u30fc\u30ba\u306b\u5fdc\u3058\u305f\u69d8\u3005\u306a\u30e1\u30fc\u30eb\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u30e1\u30fc\u30eb\u3092\u52b9\u7387\u7684\u306b\u9001\u4fe1\u3059\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-15\">\u5b9f\u8df5\u7684\u306a\u30e1\u30fc\u30eb\u9001\u4fe1\u30d1\u30bf\u30fc\u30f3<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">\u540c\u671f\u7684\u306a\u9001\u4fe1\u3068\u975e\u540c\u671f\u9001\u4fe1\u306e\u7528\u9014<\/h3>\n\n\n\n<p>\u30e1\u30fc\u30eb\u9001\u4fe1\u306e\u65b9\u6cd5\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u8981\u4ef6\u306b\u5fdc\u3058\u3066\u9069\u5207\u306b\u9078\u629e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u540c\u671f\u7684\u306a\u9001\u4fe1<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u57fa\u672c\u7684\u306a\u540c\u671f\u9001\u4fe1\nMail::to($user-&gt;email)-&gt;send(new WelcomeMail($user));\n\n\/\/ CC\u3001BCC\u3092\u542b\u3080\u9001\u4fe1\nMail::to($user-&gt;email)\n    -&gt;cc($ccAddresses)\n    -&gt;bcc($bccAddresses)\n    -&gt;send(new WelcomeMail($user));\n\n\/\/ \u8907\u6570\u306e\u53d7\u4fe1\u8005\u3078\u306e\u9001\u4fe1\nMail::to([\n    'user1@example.com',\n    'user2@example.com'\n])-&gt;send(new NotificationMail($data));<\/pre>\n\n\n\n<p><strong>\u540c\u671f\u9001\u4fe1\u304c\u9069\u3057\u3066\u3044\u308b\u5834\u5408\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30d1\u30b9\u30ef\u30fc\u30c9\u30ea\u30bb\u30c3\u30c8\u30e1\u30fc\u30eb<\/li>\n\n\n\n<li>\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u78ba\u8a8d<\/li>\n\n\n\n<li>\u91cd\u8981\u306a\u901a\u77e5\u3067\u5373\u6642\u914d\u4fe1\u304c\u5fc5\u8981\u306a\u5834\u5408<\/li>\n\n\n\n<li>\u9001\u4fe1\u7d50\u679c\u3092\u3059\u3050\u306b\u78ba\u8a8d\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u5834\u5408<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u975e\u540c\u671f\u9001\u4fe1<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30ad\u30e5\u30fc\u3092\u4f7f\u7528\u3057\u305f\u975e\u540c\u671f\u9001\u4fe1\nMail::to($user-&gt;email)-&gt;queue(new WelcomeMail($user));\n\n\/\/ \u9045\u5ef6\u9001\u4fe1\nMail::to($user-&gt;email)\n    -&gt;later(now()-&gt;addMinutes(10), new ReminderMail($user));\n\n\/\/ \u7279\u5b9a\u306e\u30ad\u30e5\u30fc\u3092\u6307\u5b9a\u3057\u305f\u9001\u4fe1\nMail::to($user-&gt;email)\n    -&gt;queue(new NewsletterMail($user))\n    -&gt;onQueue('emails');<\/pre>\n\n\n\n<p><strong>\u975e\u540c\u671f\u9001\u4fe1\u304c\u9069\u3057\u3066\u3044\u308b\u5834\u5408\uff1a<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30cb\u30e5\u30fc\u30b9\u30ec\u30bf\u30fc\u914d\u4fe1<\/li>\n\n\n\n<li>\u4e00\u62ec\u901a\u77e5<\/li>\n\n\n\n<li>\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u51e6\u7406\u53ef\u80fd\u306a\u901a\u77e5<\/li>\n\n\n\n<li>\u5927\u91cf\u306e\u30e1\u30fc\u30eb\u9001\u4fe1\u304c\u5fc5\u8981\u306a\u5834\u5408<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u30e1\u30fc\u30eb\u30ad\u30e5\u30fc\u3092\u4f7f\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u51e6\u7406<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ad\u30e5\u30fc\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/queue.php \u306e\u8a2d\u5b9a\u4f8b\nreturn [\n    'default' =&gt; env('QUEUE_CONNECTION', 'redis'),\n\n    'connections' =&gt; [\n        'redis' =&gt; [\n            'driver' =&gt; 'redis',\n            'connection' =&gt; 'default',\n            'queue' =&gt; env('REDIS_QUEUE', 'default'),\n            'retry_after' =&gt; 90,\n            'block_for' =&gt; null,\n        ],\n    ],\n];<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Mailable\u30af\u30e9\u30b9\u3067\u306e\u30ad\u30e5\u30fc\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class BulkMail extends Mailable implements ShouldQueue\n{\n    use Queueable;\n\n    public $tries = 3;  \/\/ \u6700\u5927\u8a66\u884c\u56de\u6570\n    public $timeout = 30;  \/\/ \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\uff08\u79d2\uff09\n    public $maxExceptions = 3;  \/\/ \u6700\u5927\u4f8b\u5916\u767a\u751f\u56de\u6570\n\n    \/\/ \u30ad\u30e5\u30fc\u6295\u5165\u6642\u306e\u51e6\u7406\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\n    public function queue($queue)\n    {\n        $queue-&gt;pushOn('emails', $this);\n    }\n\n    \/\/ \u5931\u6557\u6642\u306e\u51e6\u7406\n    public function failed(\\Exception $exception)\n    {\n        Log::error('\u30e1\u30fc\u30eb\u9001\u4fe1\u5931\u6557', [\n            'exception' =&gt; $exception,\n            'email' =&gt; $this-&gt;to[0]['address']\n        ]);\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30ad\u30e5\u30fc\u30ef\u30fc\u30ab\u30fc\u306e\u5b9f\u884c<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30ad\u30e5\u30fc\u30ef\u30fc\u30ab\u30fc\u306e\u8d77\u52d5\nphp artisan queue:work --queue=emails\n\n# \u76e3\u8996\u30e2\u30fc\u30c9\u3067\u306e\u5b9f\u884c\uff08\u5931\u6557\u6642\u306b\u81ea\u52d5\u518d\u8d77\u52d5\uff09\nphp artisan queue:work --daemon\n\n# \u7279\u5b9a\u306e\u8a66\u884c\u56de\u6570\u3092\u6307\u5b9a\nphp artisan queue:work --tries=3<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\u8907\u6570\u306e\u53d7\u4fe1\u8005\u3078\u306e\u4e00\u62ec\u9001\u4fe1\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c1\u30e3\u30f3\u30af\u51e6\u7406\u3092\u4f7f\u7528\u3057\u305f\u5927\u91cf\u9001\u4fe1<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30e6\u30fc\u30b6\u30fc\u30921000\u4ef6\u305a\u3064\u51e6\u7406\nUser::chunk(1000, function ($users) {\n    foreach ($users as $user) {\n        Mail::to($user)\n            -&gt;queue(new NewsletterMail($user));\n    }\n});<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">use Illuminate\\Bus\\Batch;\nuse Illuminate\\Support\\Facades\\Bus;\n\nclass NewsletterDispatch\n{\n    public function handle()\n    {\n        $users = User::all();\n        $batches = $users-&gt;chunk(1000)-&gt;map(function ($chunk) {\n            return new SendNewsletterBatch($chunk);\n        });\n\n        Bus::batch($batches)\n            -&gt;then(function (Batch $batch) {\n                \/\/ \u30d0\u30c3\u30c1\u5b8c\u4e86\u6642\u306e\u51e6\u7406\n                Log::info('\u30cb\u30e5\u30fc\u30b9\u30ec\u30bf\u30fc\u9001\u4fe1\u5b8c\u4e86', [\n                    'total' =&gt; $batch-&gt;totalJobs,\n                    'failed' =&gt; $batch-&gt;failedJobs,\n                ]);\n            })\n            -&gt;catch(function (Batch $batch, \\Throwable $e) {\n                \/\/ \u30a8\u30e9\u30fc\u767a\u751f\u6642\u306e\u51e6\u7406\n                Log::error('\u30cb\u30e5\u30fc\u30b9\u30ec\u30bf\u30fc\u9001\u4fe1\u30a8\u30e9\u30fc', [\n                    'error' =&gt; $e-&gt;getMessage(),\n                ]);\n            })\n            -&gt;dispatch();\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30ec\u30fc\u30c8\u5236\u9650\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class NewsletterMailer\n{\n    private $rateLimiter;\n\n    public function __construct()\n    {\n        $this-&gt;rateLimiter = new RateLimiter();\n    }\n\n    public function send($users)\n    {\n        return $users-&gt;each(function ($user) {\n            if ($this-&gt;rateLimiter-&gt;tooManyAttempts('mail:'.$user-&gt;id, 60)) {\n                return;  \/\/ \u5236\u9650\u8d85\u904e\n            }\n\n            $this-&gt;rateLimiter-&gt;hit('mail:'.$user-&gt;id);\n            Mail::to($user)-&gt;queue(new NewsletterMail($user));\n        });\n    }\n}<\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30ea\u30c8\u30e9\u30a4<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class BulkMailJob implements ShouldQueue\n{\n    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    public $tries = 3;\n    public $backoff = [30, 60, 120];  \/\/ \u30ea\u30c8\u30e9\u30a4\u9593\u9694\uff08\u79d2\uff09\n\n    public function handle()\n    {\n        try {\n            Mail::to($this-&gt;user)-&gt;send(new BulkMail($this-&gt;data));\n        } catch (\\Exception $e) {\n            if ($this-&gt;attempts() === $this-&gt;tries) {\n                \/\/ \u6700\u7d42\u8a66\u884c\u3067\u5931\u6557\u3057\u305f\u5834\u5408\u306e\u51e6\u7406\n                $this-&gt;logPermanentFailure($e);\n                return;\n            }\n            throw $e;  \/\/ \u30ea\u30c8\u30e9\u30a4\u306e\u305f\u3081\u306b\u4f8b\u5916\u3092\u518d\u30b9\u30ed\u30fc\n        }\n    }\n\n    private function logPermanentFailure($exception)\n    {\n        Log::error('\u30e1\u30fc\u30eb\u9001\u4fe1\u306e\u6c38\u7d9a\u7684\u306a\u5931\u6557', [\n            'user_id' =&gt; $this-&gt;user-&gt;id,\n            'error' =&gt; $exception-&gt;getMessage(),\n            'attempts' =&gt; $this-&gt;attempts()\n        ]);\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d1\u30bf\u30fc\u30f3\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u3067\u4fe1\u983c\u6027\u306e\u9ad8\u3044\u30e1\u30fc\u30eb\u9001\u4fe1\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u7279\u306b\u5927\u898f\u6a21\u306a\u30b7\u30b9\u30c6\u30e0\u3067\u306f\u3001\u30ad\u30e5\u30fc\u3084\u30d0\u30c3\u30c1\u51e6\u7406\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30b7\u30b9\u30c6\u30e0\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u5b89\u5b9a\u6027\u3092\u78ba\u4fdd\u3059\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-19\">\u30e1\u30fc\u30eb\u306e\u30c6\u30b9\u30c8\u3068\u958b\u767a\u74b0\u5883\u3067\u306e\u78ba\u8a8d\u65b9\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">Mailtrap \u3092\u4f7f\u7528\u3057\u305f\u30e1\u30fc\u30eb\u30c6\u30b9\u30c8\u74b0\u5883\u306e\u69cb\u7bc9<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Mailtrap\u306e\u8a2d\u5b9a\u624b\u9806<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># .env \u30d5\u30a1\u30a4\u30eb\u306e\u8a2d\u5b9a\nMAIL_MAILER=smtp\nMAIL_HOST=smtp.mailtrap.io\nMAIL_PORT=2525\nMAIL_USERNAME=your_mailtrap_username\nMAIL_PASSWORD=your_mailtrap_password\nMAIL_ENCRYPTION=tls<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/mail.php \u3067\u306e\u8a2d\u5b9a\u78ba\u8a8d\n'mailers' =&gt; [\n    'smtp' =&gt; [\n        'transport' =&gt; 'smtp',\n        'host' =&gt; env('MAIL_HOST', 'smtp.mailgun.org'),\n        'port' =&gt; env('MAIL_PORT', 587),\n        'encryption' =&gt; env('MAIL_ENCRYPTION', 'tls'),\n        'username' =&gt; env('MAIL_USERNAME'),\n        'password' =&gt; env('MAIL_PASSWORD'),\n        'timeout' =&gt; null,\n        'local_domain' =&gt; env('MAIL_EHLO_DOMAIN'),\n    ],\n],<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Mailtrap\u306e\u6d3b\u7528\u65b9\u6cd5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30c6\u30b9\u30c8\u7528\u306e\u30e1\u30fc\u30eb\u9001\u4fe1\nMail::to('test@example.com')-&gt;send(new WelcomeMail($user));\n\n\/\/ \u958b\u767a\u74b0\u5883\u3067\u306e\u9001\u4fe1\u30c6\u30b9\u30c8\nif (app()-&gt;environment('local')) {\n    Mail::to('developer@example.com')\n        -&gt;send(new WelcomeMail($user));\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30de\u30eb\u30c1\u74b0\u5883\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/services.php\nreturn [\n    'mailtrap' =&gt; [\n        'domain' =&gt; env('MAILTRAP_DOMAIN'),\n        'secret' =&gt; env('MAILTRAP_SECRET'),\n    ],\n];\n\n\/\/ \u30e1\u30fc\u30eb\u8a2d\u5b9a\u306e\u74b0\u5883\u5225\u5207\u308a\u66ff\u3048\n'mailers' =&gt; [\n    'smtp' =&gt; [\n        'transport' =&gt; 'smtp',\n        'host' =&gt; env('APP_ENV') === 'production' \n            ? env('MAIL_HOST') \n            : 'smtp.mailtrap.io',\n        \/\/ ... \u4ed6\u306e\u8a2d\u5b9a\n    ],\n],<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u5358\u4f53\u30c6\u30b9\u30c8\u3067\u306e\u30e1\u30fc\u30eb\u9001\u4fe1\u306e\u30c6\u30b9\u30c8\u65b9\u6cd5<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u30e1\u30fc\u30eb\u30c6\u30b9\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">namespace Tests\\Feature;\n\nuse App\\Mail\\WelcomeMail;\nuse Tests\\TestCase;\nuse Illuminate\\Support\\Facades\\Mail;\n\nclass MailTest extends TestCase\n{\n    public function test_welcome_email_contains_correct_data()\n    {\n        Mail::fake();  \/\/ \u30e1\u30fc\u30eb\u306e\u9001\u4fe1\u3092\u30e2\u30c3\u30af\u5316\n\n        $user = User::factory()-&gt;create();\n\n        \/\/ \u30e1\u30fc\u30eb\u9001\u4fe1\n        Mail::to($user)-&gt;send(new WelcomeMail($user));\n\n        \/\/ \u30e1\u30fc\u30eb\u304c\u9001\u4fe1\u3055\u308c\u305f\u3053\u3068\u3092\u78ba\u8a8d\n        Mail::assertSent(WelcomeMail::class, function ($mail) use ($user) {\n            return $mail-&gt;hasTo($user-&gt;email) &amp;&amp;\n                   $mail-&gt;user-&gt;id === $user-&gt;id;\n        });\n    }\n\n    public function test_welcome_email_content()\n    {\n        $user = User::factory()-&gt;create();\n        $mailable = new WelcomeMail($user);\n\n        \/\/ \u30e1\u30fc\u30eb\u306e\u5185\u5bb9\u3092\u78ba\u8a8d\n        $mailable-&gt;assertSeeInHtml($user-&gt;name);\n        $mailable-&gt;assertSeeInHtml('\u3088\u3046\u3053\u305d');\n\n        \/\/ Markdown\u30e1\u30fc\u30eb\u306e\u5834\u5408\n        $mailable-&gt;assertSeeInText($user-&gt;name);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u9ad8\u5ea6\u306a\u30c6\u30b9\u30c8\u30b1\u30fc\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class MailTest extends TestCase\n{\n    public function test_bulk_mail_sending()\n    {\n        Mail::fake();\n\n        $users = User::factory()-&gt;count(3)-&gt;create();\n\n        \/\/ \u30d0\u30eb\u30af\u30e1\u30fc\u30eb\u9001\u4fe1\u51e6\u7406\n        foreach ($users as $user) {\n            Mail::to($user)-&gt;queue(new BulkMail($user));\n        }\n\n        \/\/ \u9001\u4fe1\u56de\u6570\u306e\u78ba\u8a8d\n        Mail::assertQueued(BulkMail::class, 3);\n\n        \/\/ \u7279\u5b9a\u306e\u30e6\u30fc\u30b6\u30fc\u3078\u306e\u9001\u4fe1\u78ba\u8a8d\n        Mail::assertQueued(BulkMail::class, function ($mail) use ($users) {\n            return $mail-&gt;hasTo($users-&gt;first()-&gt;email);\n        });\n    }\n\n    public function test_attachment_email()\n    {\n        Storage::fake('local');\n        $file = UploadedFile::fake()-&gt;create('document.pdf', 100);\n\n        $mail = new AttachmentMail($file);\n\n        $mail-&gt;assertHasAttachment('document.pdf', function ($attachment) {\n            return $attachment-&gt;hasName('document.pdf') &amp;&amp;\n                   $attachment-&gt;hasType('application\/pdf');\n        });\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30e1\u30fc\u30eb\u9001\u4fe1\u30ad\u30e5\u30fc\u306e\u30c6\u30b9\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class QueuedMailTest extends TestCase\n{\n    public function test_newsletter_queued_properly()\n    {\n        Mail::fake();\n        Queue::fake();\n\n        $users = User::factory()-&gt;count(5)-&gt;create();\n\n        \/\/ \u30cb\u30e5\u30fc\u30b9\u30ec\u30bf\u30fc\u9001\u4fe1\u30b8\u30e7\u30d6\u306e\u30c7\u30a3\u30b9\u30d1\u30c3\u30c1\n        NewsletterJob::dispatch($users);\n\n        \/\/ \u30ad\u30e5\u30fc\u306b\u8ffd\u52a0\u3055\u308c\u305f\u3053\u3068\u3092\u78ba\u8a8d\n        Queue::assertPushed(NewsletterJob::class);\n\n        \/\/ \u30ad\u30e5\u30fc\u306e\u51e6\u7406\u5f8c\u306b\u30e1\u30fc\u30eb\u304c\u9001\u4fe1\u3055\u308c\u308b\u3053\u3068\u3092\u78ba\u8a8d\n        Mail::assertNothingSent();\n\n        \/\/ \u30b8\u30e7\u30d6\u3092\u624b\u52d5\u3067\u5b9f\u884c\n        $job = new NewsletterJob($users);\n        $job-&gt;handle();\n\n        Mail::assertQueued(NewsletterMail::class, 5);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">\u4e00\u822c\u7684\u306a\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u3088\u304f\u3042\u308b\u30a8\u30e9\u30fc\u3068\u89e3\u6c7a\u65b9\u6cd5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ SMTP\u63a5\u7d9a\u30a8\u30e9\u30fc\u306e\u78ba\u8a8d\ntry {\n    Mail::to('test@example.com')-&gt;send(new TestMail);\n} catch (\\Swift_TransportException $e) {\n    Log::error('SMTP\u63a5\u7d9a\u30a8\u30e9\u30fc', [\n        'error' =&gt; $e-&gt;getMessage(),\n        'code' =&gt; $e-&gt;getCode()\n    ]);\n}\n\n\/\/ \u30e1\u30fc\u30eb\u9001\u4fe1\u306e\u72b6\u614b\u78ba\u8a8d\nclass MailHealthCheck\n{\n    public function check()\n    {\n        try {\n            $transport = Mail::getSymfonyTransport();\n            $transport-&gt;start();\n\n            return [\n                'status' =&gt; 'ok',\n                'message' =&gt; 'SMTP\u63a5\u7d9a\u6210\u529f'\n            ];\n        } catch (\\Exception $e) {\n            return [\n                'status' =&gt; 'error',\n                'message' =&gt; $e-&gt;getMessage()\n            ];\n        }\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30c7\u30d0\u30c3\u30b0\u30c4\u30fc\u30eb<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30e1\u30fc\u30eb\u306e\u30c7\u30d0\u30c3\u30b0\u30ed\u30b0\u8a2d\u5b9a\n'mailers' =&gt; [\n    'smtp' =&gt; [\n        \/\/ ... \u4ed6\u306e\u8a2d\u5b9a\n        'stream' =&gt; [\n            'ssl' =&gt; [\n                'allow_self_signed' =&gt; true,\n                'verify_peer' =&gt; false,\n                'verify_peer_name' =&gt; false,\n            ],\n        ],\n    ],\n],\n\n\/\/ \u30c7\u30d0\u30c3\u30b0\u30e2\u30fc\u30c9\u3067\u306e\u30ed\u30b0\u51fa\u529b\nif (config('app.debug')) {\n    Mail::getSwiftMailer()-&gt;registerPlugin(\n        new \\Swift_Plugins_LoggerPlugin(\n            new \\Swift_Plugins_Loggers_ArrayLogger()\n        )\n    );\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u767a\u751f\u6642\u306e\u5bfe\u51e6\u65b9\u6cd5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class MailErrorHandler\n{\n    public static function handle(\\Exception $e)\n    {\n        $errorType = get_class($e);\n        $errorMessage = $e-&gt;getMessage();\n\n        switch ($errorType) {\n            case \\Swift_TransportException::class:\n                \/\/ SMTP\u63a5\u7d9a\u30a8\u30e9\u30fc\u306e\u51e6\u7406\n                self::handleTransportError($e);\n                break;\n\n            case \\Swift_RfcComplianceException::class:\n                \/\/ \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u30a8\u30e9\u30fc\u306e\u51e6\u7406\n                self::handleAddressError($e);\n                break;\n\n            default:\n                \/\/ \u305d\u306e\u4ed6\u306e\u30a8\u30e9\u30fc\u51e6\u7406\n                Log::error('\u30e1\u30fc\u30eb\u9001\u4fe1\u30a8\u30e9\u30fc', [\n                    'type' =&gt; $errorType,\n                    'message' =&gt; $errorMessage\n                ]);\n        }\n    }\n\n    private static function handleTransportError($e)\n    {\n        \/\/ \u518d\u63a5\u7d9a\u3092\u8a66\u307f\u308b\n        try {\n            Mail::getSymfonyTransport()-&gt;stop();\n            Mail::getSymfonyTransport()-&gt;start();\n        } catch (\\Exception $e) {\n            Log::critical('SMTP\u518d\u63a5\u7d9a\u5931\u6557', [\n                'error' =&gt; $e-&gt;getMessage()\n            ]);\n        }\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c6\u30b9\u30c8\u65b9\u6cd5\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u624b\u6cd5\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30e1\u30fc\u30eb\u9001\u4fe1\u6a5f\u80fd\u306e\u4fe1\u983c\u6027\u3092\u78ba\u4fdd\u3057\u3001\u554f\u984c\u304c\u767a\u751f\u3057\u305f\u969b\u306e\u8fc5\u901f\u306a\u5bfe\u5fdc\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-23\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-24\">\u30e1\u30fc\u30eb\u9001\u4fe1\u6642\u306e\u4e00\u822c\u7684\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30ea\u30b9\u30af<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4e00\u822c\u7684\u306a\u8106\u5f31\u6027\u3068\u5bfe\u7b56<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class SecureMailer\n{\n    \/\/ \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\n    public function validateEmail($email)\n    {\n        $rules = [\n            'email' =&gt; ['required', 'email:rfc,dns', 'max:255']\n        ];\n\n        return Validator::make(\n            ['email' =&gt; $email],\n            $rules\n        )-&gt;passes();\n    }\n\n    \/\/ HTML\u30a4\u30f3\u30b8\u30a7\u30af\u30b7\u30e7\u30f3\u5bfe\u7b56\n    public function sanitizeContent($content)\n    {\n        return strip_tags($content, [\n            'p', 'br', 'strong', 'em', 'a', 'ul', 'li'\n        ]);\n    }\n\n    \/\/ \u6a5f\u5bc6\u60c5\u5831\u306e\u6271\u3044\n    public function sendSecureEmail($user, $sensitiveData)\n    {\n        \/\/ \u6a5f\u5bc6\u60c5\u5831\u306f\u76f4\u63a5\u30e1\u30fc\u30eb\u672c\u6587\u306b\u542b\u3081\u306a\u3044\n        $token = $this-&gt;generateSecureToken();\n        $this-&gt;storeSecureData($token, $sensitiveData);\n\n        Mail::to($user-&gt;email)-&gt;send(new SecureMail($token));\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>SPF\u3001DKIM\u3001DMARC\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/mail.php\nreturn [\n    'headers' =&gt; [\n        'X-MS-Exchange-Organization-AuthAs' =&gt; 'Internal',\n        'X-MS-Exchange-Organization-AuthMechanism' =&gt; '04',\n        'X-MS-Exchange-Organization-AuthSource' =&gt; 'example.com',\n        'Message-ID' =&gt; sprintf('&lt;%s@%s&gt;', Str::random(32), config('app.url')),\n    ],\n\n    'dkim' =&gt; [\n        'domain' =&gt; env('MAIL_DKIM_DOMAIN'),\n        'selector' =&gt; env('MAIL_DKIM_SELECTOR'),\n        'private_key' =&gt; storage_path('dkim\/private.key'),\n    ],\n];<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30ec\u30fc\u30c8\u5236\u9650\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class RateLimitedMailer\n{\n    private $limiter;\n\n    public function __construct()\n    {\n        $this-&gt;limiter = new RateLimiter();\n    }\n\n    public function send($user, Mailable $mail)\n    {\n        $key = 'mail:' . $user-&gt;id;\n\n        if ($this-&gt;limiter-&gt;tooManyAttempts($key, 60)) {\n            throw new TooManyRequestsException(\n                '\u9001\u4fe1\u5236\u9650\u3092\u8d85\u904e\u3057\u307e\u3057\u305f\u3002\u3057\u3070\u3089\u304f\u5f85\u3063\u3066\u304b\u3089\u518d\u8a66\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002'\n            );\n        }\n\n        try {\n            Mail::to($user)-&gt;send($mail);\n            $this-&gt;limiter-&gt;hit($key);\n        } catch (\\Exception $e) {\n            report($e);\n            throw new MailerException('\u30e1\u30fc\u30eb\u9001\u4fe1\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002');\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-25\">\u5927\u898f\u6a21\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u5bfe\u7b56<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30fc\u30eb\u9001\u4fe1\u30b5\u30fc\u30d3\u30b9\u306e\u5206\u96e2<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">namespace App\\Services;\n\nclass MailService\n{\n    private $mailer;\n    private $logger;\n    private $rateLimiter;\n\n    public function __construct(\n        MailerInterface $mailer,\n        LoggerInterface $logger,\n        RateLimiter $rateLimiter\n    ) {\n        $this-&gt;mailer = $mailer;\n        $this-&gt;logger = $logger;\n        $this-&gt;rateLimiter = $rateLimiter;\n    }\n\n    public function sendBulkMail(Collection $users, string $mailableClass, array $data)\n    {\n        return $users-&gt;each(function ($user) use ($mailableClass, $data) {\n            try {\n                if ($this-&gt;shouldThrottle($user)) {\n                    return;\n                }\n\n                $mailable = new $mailableClass($user, $data);\n                $this-&gt;mailer-&gt;queue($mailable);\n\n                $this-&gt;logger-&gt;info('\u30e1\u30fc\u30eb\u9001\u4fe1\u6210\u529f', [\n                    'user_id' =&gt; $user-&gt;id,\n                    'mail_type' =&gt; $mailableClass\n                ]);\n\n            } catch (\\Exception $e) {\n                $this-&gt;handleError($e, $user, $mailableClass);\n            }\n        });\n    }\n\n    private function shouldThrottle($user): bool\n    {\n        $key = \"mail:{$user-&gt;id}\";\n        return $this-&gt;rateLimiter-&gt;tooManyAttempts($key, 60);\n    }\n\n    private function handleError(\\Exception $e, $user, $mailableClass)\n    {\n        $this-&gt;logger-&gt;error('\u30e1\u30fc\u30eb\u9001\u4fe1\u30a8\u30e9\u30fc', [\n            'user_id' =&gt; $user-&gt;id,\n            'mail_type' =&gt; $mailableClass,\n            'error' =&gt; $e-&gt;getMessage()\n        ]);\n\n        \/\/ \u30a8\u30e9\u30fc\u901a\u77e5\n        Notification::route('slack', config('services.slack.webhook_url'))\n            -&gt;notify(new MailerErrorNotification($e, $user));\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u76e3\u8996\u3068\u30ed\u30ae\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class MailerMonitor\n{\n    public function monitor()\n    {\n        \/\/ \u30e1\u30fc\u30eb\u9001\u4fe1\u306e\u6210\u529f\u7387\u76e3\u8996\n        $stats = DB::table('mail_logs')\n            -&gt;select(\n                DB::raw('COUNT(*) as total'),\n                DB::raw('SUM(CASE WHEN status = \"success\" THEN 1 ELSE 0 END) as success'),\n                DB::raw('SUM(CASE WHEN status = \"failure\" THEN 1 ELSE 0 END) as failure')\n            )\n            -&gt;whereDate('created_at', Carbon::today())\n            -&gt;first();\n\n        \/\/ \u30a2\u30e9\u30fc\u30c8\u6761\u4ef6\u306e\u78ba\u8a8d\n        if (($stats-&gt;failure \/ $stats-&gt;total) &gt; 0.05) {\n            $this-&gt;sendAlert('\u30e1\u30fc\u30eb\u9001\u4fe1\u30a8\u30e9\u30fc\u7387\u304c5%\u3092\u8d85\u904e\u3057\u307e\u3057\u305f');\n        }\n\n        \/\/ \u30ad\u30e5\u30fc\u306e\u5065\u5168\u6027\u30c1\u30a7\u30c3\u30af\n        $queueSize = Queue::size('emails');\n        if ($queueSize &gt; 1000) {\n            $this-&gt;sendAlert('\u30e1\u30fc\u30eb\u30ad\u30e5\u30fc\u306e\u30b5\u30a4\u30ba\u304c1000\u3092\u8d85\u904e\u3057\u307e\u3057\u305f');\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-26\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ad\u30e5\u30fc\u306e\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OptimizedMailQueue\n{\n    public function dispatch(Collection $users, Mailable $mail)\n    {\n        \/\/ \u30d0\u30c3\u30c1\u30b5\u30a4\u30ba\u306e\u6700\u9069\u5316\n        $users-&gt;chunk(100)-&gt;each(function ($chunk) use ($mail) {\n            dispatch(new SendBulkMailJob($chunk, $mail))\n                -&gt;onQueue('emails')\n                -&gt;delay(now()-&gt;addSeconds(rand(1, 60)));\n        });\n    }\n}\n\nclass SendBulkMailJob implements ShouldQueue\n{\n    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    public $timeout = 120;\n    public $tries = 3;\n    public $backoff = [30, 60, 120];\n\n    private $users;\n    private $mail;\n\n    public function handle()\n    {\n        $this-&gt;users-&gt;each(function ($user) {\n            try {\n                Mail::to($user)-&gt;send($this-&gt;mail);\n                $this-&gt;logSuccess($user);\n            } catch (\\Exception $e) {\n                $this-&gt;handleFailure($user, $e);\n\n                if ($this-&gt;attempts() === $this-&gt;tries) {\n                    $this-&gt;logPermanentFailure($user, $e);\n                }\n            }\n        });\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class MemoryOptimizedMailer\n{\n    public function sendNewsletter(Builder $users)\n    {\n        \/\/ \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30c1\u30e3\u30f3\u30af\u51e6\u7406\n        $users-&gt;chunk(100, function ($chunk) {\n            $chunk-&gt;each(function ($user) {\n                dispatch(new SendNewsletterJob($user-&gt;id))\n                    -&gt;onQueue('newsletters');\n            });\n\n            \/\/ \u30e1\u30e2\u30ea\u89e3\u653e\n            gc_collect_cycles();\n        });\n    }\n}\n\nclass SendNewsletterJob implements ShouldQueue\n{\n    public function handle()\n    {\n        \/\/ \u30e6\u30fc\u30b6\u30fc\u30c7\u30fc\u30bf\u306e\u9045\u5ef6\u30ed\u30fc\u30c9\n        $user = User::find($this-&gt;userId);\n\n        \/\/ \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\n        $view = Cache::remember('newsletter.template', 3600, function () {\n            return view('emails.newsletter')-&gt;render();\n        });\n\n        Mail::to($user)-&gt;send(new Newsletter($view));\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class CacheOptimizedMailer\n{\n    private $cache;\n\n    public function __construct(Cache $cache)\n    {\n        $this-&gt;cache = $cache;\n    }\n\n    public function sendTemplatedMail($user, $templateKey)\n    {\n        $template = $this-&gt;getTemplate($templateKey);\n        $content = $this-&gt;compileTemplate($template, $user);\n\n        Mail::to($user)-&gt;queue(new TemplatedMail($content));\n    }\n\n    private function getTemplate($key)\n    {\n        return $this-&gt;cache-&gt;remember(\n            \"mail.template.{$key}\",\n            3600,\n            fn() =&gt; MailTemplate::findOrFail($key)\n        );\n    }\n\n    private function compileTemplate($template, $user)\n    {\n        return $this-&gt;cache-&gt;tags(['mail.compiled'])\n            -&gt;remember(\n                \"mail.compiled.{$template-&gt;id}.{$user-&gt;id}\",\n                60,\n                fn() =&gt; view()\n                    -&gt;make($template-&gt;view)\n                    -&gt;with(['user' =&gt; $user])\n                    -&gt;render()\n            );\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u5b89\u5168\u3067\u52b9\u7387\u7684\u306a\u30e1\u30fc\u30eb\u9001\u4fe1\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u7279\u306b\u5927\u898f\u6a21\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u5bfe\u7b56\u306f\u5fc5\u9808\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-27\">\u767a\u5c55\u7684\u306a\u4f7f\u7528\u4f8b\u3068\u5fdc\u7528\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-28\">\u30de\u30fc\u30af\u30c0\u30a6\u30f3\u30e1\u30fc\u30eb\u306e\u6d3b\u7528\u65b9\u6cd5<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30de\u30fc\u30af\u30c0\u30a6\u30f3\u30e1\u30fc\u30eb\u306e\u57fa\u672c\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Markdown\u30e1\u30fc\u30eb\u306e\u751f\u6210\nphp artisan make:mail OrderShipped --markdown=emails.orders.shipped\n\n\/\/ Mailable\u30af\u30e9\u30b9\u306e\u5b9f\u88c5\nclass OrderShipped extends Mailable\n{\n    use Queueable, SerializesModels;\n\n    public $order;\n\n    public function __construct(Order $order)\n    {\n        $this-&gt;order = $order;\n    }\n\n    public function build()\n    {\n        return $this-&gt;markdown('emails.orders.shipped')\n                    -&gt;subject('\u6ce8\u6587\u767a\u9001\u306e\u304a\u77e5\u3089\u305b')\n                    -&gt;with([\n                        'orderNumber' =&gt; $this-&gt;order-&gt;number,\n                        'trackingNumber' =&gt; $this-&gt;order-&gt;tracking_number,\n                    ]);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30de\u30fc\u30af\u30c0\u30a6\u30f3\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ resources\/views\/emails\/orders\/shipped.blade.php\n@component('mail::message')\n# \u6ce8\u6587\u767a\u9001\u306e\u304a\u77e5\u3089\u305b\n\n{{ $order-&gt;customer_name }} \u69d8\n\n\u3054\u6ce8\u6587\u306e\u5546\u54c1\u3092\u767a\u9001\u3044\u305f\u3057\u307e\u3057\u305f\u3002\n\n@component('mail::table')\n| \u5546\u54c1\u540d | \u6570\u91cf | \u4fa1\u683c |\n|:-------|:-----|:-----|\n@foreach($order-&gt;items as $item)\n| {{ $item-&gt;name }} | {{ $item-&gt;quantity }} | \u00a5{{ number_format($item-&gt;price) }} |\n@endforeach\n@endcomponent\n\n@component('mail::button', ['url' =&gt; $trackingUrl, 'color' =&gt; 'primary'])\n\u914d\u9001\u72b6\u6cc1\u3092\u78ba\u8a8d\u3059\u308b\n@endcomponent\n\n@component('mail::panel')\n**\u914d\u9001\u60c5\u5831**\n- \u914d\u9001\u696d\u8005: {{ $order-&gt;shipping_company }}\n- \u8ffd\u8de1\u756a\u53f7: {{ $order-&gt;tracking_number }}\n@endcomponent\n\n\u3054\u5229\u7528\u3042\u308a\u304c\u3068\u3046\u3054\u3056\u3044\u307e\u3057\u305f\u3002\n\nThanks,&lt;br&gt;\n{{ config('app.name') }}\n@endcomponent<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u4f5c\u6210<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/View\/Components\/Mail\/StatusBadge.php\nclass StatusBadge extends Component\n{\n    public $status;\n    public $color;\n\n    public function __construct($status)\n    {\n        $this-&gt;status = $status;\n        $this-&gt;color = $this-&gt;getColorForStatus($status);\n    }\n\n    public function render()\n    {\n        return view('components.mail.status-badge');\n    }\n\n    private function getColorForStatus($status)\n    {\n        return [\n            'pending' =&gt; 'yellow',\n            'processing' =&gt; 'blue',\n            'completed' =&gt; 'green',\n            'failed' =&gt; 'red',\n        ][$status] ?? 'gray';\n    }\n}\n\n\/\/ resources\/views\/components\/mail\/status-badge.blade.php\n&lt;span style=\"\n    background-color: {{ $color }};\n    padding: 4px 8px;\n    border-radius: 4px;\n    color: white;\n    font-size: 12px;\n\"&gt;\n    {{ ucfirst($status) }}\n&lt;\/span&gt;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-29\">\u30e1\u30fc\u30eb\u901a\u77e5\u30b7\u30b9\u30c6\u30e0\u306e\u5b9f\u88c5\u4f8b<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u901a\u77e5\u30b7\u30b9\u30c6\u30e0\u306e\u57fa\u672c\u69cb\u9020<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class NotificationService\n{\n    private $preferences;\n    private $mailer;\n\n    public function __construct(UserPreferenceRepository $preferences, MailService $mailer)\n    {\n        $this-&gt;preferences = $preferences;\n        $this-&gt;mailer = $mailer;\n    }\n\n    public function sendNotification(User $user, Notification $notification)\n    {\n        if (!$this-&gt;shouldSendEmail($user, $notification-&gt;type)) {\n            return;\n        }\n\n        $mail = $this-&gt;createMailableFromNotification($notification);\n        $this-&gt;mailer-&gt;send($user, $mail);\n    }\n\n    private function shouldSendEmail(User $user, string $notificationType): bool\n    {\n        return $this-&gt;preferences-&gt;isEmailEnabled($user, $notificationType);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u9ad8\u5ea6\u306a\u901a\u77e5\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30b7\u30b9\u30c6\u30e0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class NotificationTemplateManager\n{\n    private $templates = [];\n\n    public function registerTemplate(string $type, string $template)\n    {\n        $this-&gt;templates[$type] = $template;\n    }\n\n    public function getTemplate(string $type): ?NotificationTemplate\n    {\n        return isset($this-&gt;templates[$type])\n            ? new NotificationTemplate($this-&gt;templates[$type])\n            : null;\n    }\n}\n\nclass DynamicNotificationMail extends Mailable\n{\n    private $template;\n    private $data;\n\n    public function __construct(NotificationTemplate $template, array $data)\n    {\n        $this-&gt;template = $template;\n        $this-&gt;data = $data;\n    }\n\n    public function build()\n    {\n        return $this-&gt;view('emails.notifications.dynamic')\n                    -&gt;with([\n                        'template' =&gt; $this-&gt;template,\n                        'data' =&gt; $this-&gt;data,\n                    ]);\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30d0\u30c3\u30c1\u901a\u77e5\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class BatchNotificationJob implements ShouldQueue\n{\n    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    private $notifications;\n    private $batchSize = 100;\n\n    public function handle()\n    {\n        $this-&gt;notifications\n            -&gt;chunk($this-&gt;batchSize)\n            -&gt;each(function ($chunk) {\n                $this-&gt;processBatch($chunk);\n            });\n    }\n\n    private function processBatch(Collection $notifications)\n    {\n        $notifications-&gt;each(function ($notification) {\n            try {\n                event(new NotificationProcessing($notification));\n                $this-&gt;sendNotification($notification);\n                event(new NotificationSent($notification));\n            } catch (\\Exception $e) {\n                $this-&gt;handleError($notification, $e);\n            }\n        });\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-30\">\u30ab\u30b9\u30bf\u30e0\u30c8\u30e9\u30f3\u30b9\u30dd\u30fc\u30c8\u306e\u4f5c\u6210\u65b9\u6cd5<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30c8\u30e9\u30f3\u30b9\u30dd\u30fc\u30c8\u306e\u57fa\u672c\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">namespace App\\Mail\\Transport;\n\nuse Symfony\\Component\\Mailer\\SentMessage;\nuse Symfony\\Component\\Mailer\\Transport\\AbstractTransport;\nuse Symfony\\Component\\Mime\\MessageConverter;\n\nclass CustomTransport extends AbstractTransport\n{\n    protected function doSend(SentMessage $message): void\n    {\n        $email = MessageConverter::toEmail($message-&gt;getOriginalMessage());\n\n        \/\/ \u30ab\u30b9\u30bf\u30e0\u30ed\u30b8\u30c3\u30af\u306e\u5b9f\u88c5\n        $this-&gt;sendViaCustomService(\n            $email-&gt;getTo(),\n            $email-&gt;getSubject(),\n            $email-&gt;getHtmlBody(),\n            $email-&gt;getTextBody()\n        );\n    }\n\n    private function sendViaCustomService($to, $subject, $htmlBody, $textBody)\n    {\n        \/\/ \u30ab\u30b9\u30bf\u30e0\u9001\u4fe1\u30ed\u30b8\u30c3\u30af\u306e\u5b9f\u88c5\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30c8\u30e9\u30f3\u30b9\u30dd\u30fc\u30c8\u306e\u767b\u9332<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">namespace App\\Providers;\n\nuse Illuminate\\Support\\ServiceProvider;\nuse Illuminate\\Support\\Facades\\Mail;\nuse App\\Mail\\Transport\\CustomTransport;\n\nclass MailServiceProvider extends ServiceProvider\n{\n    public function boot()\n    {\n        Mail::extend('custom', function ($config) {\n            return new CustomTransport(\n                $config['api_key'],\n                $config['api_secret']\n            );\n        });\n    }\n}<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30c8\u30e9\u30f3\u30b9\u30dd\u30fc\u30c8\u306e\u5b9f\u88c5\u4f8b\uff08SMS\u9023\u643a\uff09<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class SMSTransport extends AbstractTransport\n{\n    private $smsService;\n    private $config;\n\n    public function __construct(SMSServiceInterface $smsService, array $config)\n    {\n        $this-&gt;smsService = $smsService;\n        $this-&gt;config = $config;\n\n        parent::__construct();\n    }\n\n    protected function doSend(SentMessage $message): void\n    {\n        $email = MessageConverter::toEmail($message-&gt;getOriginalMessage());\n\n        \/\/ \u30e1\u30fc\u30eb\u306e\u5185\u5bb9\u3092SMS\u7528\u306b\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\n        $smsContent = $this-&gt;formatForSMS(\n            $email-&gt;getSubject(),\n            $email-&gt;getTextBody()\n        );\n\n        \/\/ SMS\u9001\u4fe1\n        foreach ($email-&gt;getTo() as $recipient) {\n            $phoneNumber = $this-&gt;getPhoneNumber($recipient-&gt;getAddress());\n\n            if ($phoneNumber) {\n                $this-&gt;smsService-&gt;send($phoneNumber, $smsContent);\n            }\n        }\n    }\n\n    private function formatForSMS($subject, $body): string\n    {\n        \/\/ SMS\u7528\u306e\u30c6\u30ad\u30b9\u30c8\u6574\u5f62\n        $maxLength = 160;\n        $text = \"{$subject}\\n\\n{$body}\";\n\n        return mb_substr($text, 0, $maxLength);\n    }\n\n    private function getPhoneNumber($email)\n    {\n        \/\/ \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u304b\u3089\u96fb\u8a71\u756a\u53f7\u3092\u53d6\u5f97\u3059\u308b\u30ed\u30b8\u30c3\u30af\n        return User::where('email', $email)\n                  -&gt;value('phone_number');\n    }\n}<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u767a\u5c55\u7684\u306a\u5b9f\u88c5\u4f8b\u3068\u30c6\u30af\u30cb\u30c3\u30af\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u67d4\u8edf\u3067\u9ad8\u5ea6\u306a\u30e1\u30fc\u30eb\u9001\u4fe1\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u7279\u306b\u3001\u30de\u30fc\u30af\u30c0\u30a6\u30f3\u30e1\u30fc\u30eb\u3084\u30ab\u30b9\u30bf\u30e0\u30c8\u30e9\u30f3\u30b9\u30dd\u30fc\u30c8\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30e6\u30fc\u30b6\u30fc\u306b\u3088\u308a\u826f\u3044\u4f53\u9a13\u3092\u63d0\u4f9b\u3067\u304d\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-2644","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-uncategorized","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2644","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2644"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2644\/revisions"}],"predecessor-version":[{"id":2645,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2644\/revisions\/2645"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2644"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2644"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2644"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}