HEX
Server: Apache
System: Linux s198.coreserver.jp 5.15.0-151-generic #161-Ubuntu SMP Tue Jul 22 14:25:40 UTC 2025 x86_64
User: nagasaki (10062)
PHP: 7.1.33
Disabled: NONE
Upload Files
File: /virtual/nagasaki/public_html/ec/tests/Eccube/Tests/Service/MailServiceTest.php
<?php

namespace Eccube\Tests\Service;

use Eccube\Service\MailService;

/**
 * MailService test cases.
 *
 * このテストは MailCatcher を使用します.
 * 事前に MailCatcher をインストールし, 起動させておく必要があります.
 *
 * インストール)
 * $ gem install mailcatcher
 *
 * 起動)
 * $ mailcatcher
 *
 * MailCatcher については下記リンクを参考にしてください
 * @link http://mailcatcher.me/
 * @link http://qiita.com/suzuki86/items/258694fb535071f0110f
 * @link http://kirii.hateblo.jp/entry/2014/07/18/000000
 */
class MailServiceTest extends AbstractServiceTestCase
{

    protected $client;
    protected $Customer;
    protected $BaseInfo;

    public function setUp()
    {
        parent::setUp();
        $this->initializeMailCatcher();
        $paths = array($this->app['config']['template_default_realdir']);
        $this->app['twig.loader']->addLoader(new \Twig_Loader_Filesystem($paths));
        $this->Customer = $this->createCustomer();
        $this->BaseInfo = $this->app['eccube.repository.base_info']->get(1);
    }

    public function tearDown()
    {
        $this->cleanUpMailCatcherMessages();
        parent::tearDown();
    }

    public function testSendCustomerConfirmMail()
    {
        $url = 'http://example.com/confirm';
        $this->app['eccube.service.mail']->sendCustomerConfirmMail($this->Customer, $url);
        $Messages = $this->getMessages();
        $Message = $this->getMessage($Messages[0]->id);

        $this->expected = $url;
        $this->verifyRegExp($Message, 'URLは'.$url.'ではありません');

        $this->expected = '[' . $this->BaseInfo->getShopName() . '] 会員登録のご確認';
        $this->actual = $Message->subject;
        $this->verify();

        $this->expected = '<'.$this->Customer->getEmail().'>';
        $this->actual = $Message->recipients[0];
        $this->verify();

        $this->expected = 'Reply-To: '.$this->BaseInfo->getEmail03();
        $this->verifyRegExp($Message, 'Reply-Toは'.$this->BaseInfo->getEmail03().'ではありません');

        $BccMessage = $this->getMessage($Messages[1]->id);
        $this->expected = 'Bcc: '.$this->BaseInfo->getEmail01();
        $this->verifyRegExp($BccMessage, 'BCC');
    }

    public function testSendCustomerCompleteMail()
    {
        $this->app['eccube.service.mail']->sendCustomerCompleteMail($this->Customer);

        $Messages = $this->getMessages();
        $Message = $this->getMessage($Messages[0]->id);

        $this->expected = '[' . $this->BaseInfo->getShopName() . '] 会員登録が完了しました。';
        $this->actual = $Message->subject;
        $this->verify();

        $this->expected = '<'.$this->Customer->getEmail().'>';
        $this->actual = $Message->recipients[0];
        $this->verify();

        $this->expected = 'Reply-To: '.$this->BaseInfo->getEmail03();
        $this->verifyRegExp($Message, 'Reply-Toは'.$this->BaseInfo->getEmail03().'ではありません');

        $BccMessage = $this->getMessage($Messages[1]->id);
        $this->expected = 'Bcc: '.$this->BaseInfo->getEmail01();
        $this->verifyRegExp($BccMessage, 'BCC');
    }

    public function testSendCustomerWithdrawMail()
    {
        $email = 'draw@example.com';
        $this->app['eccube.service.mail']->sendCustomerWithdrawMail($this->Customer, $email);

        $Messages = $this->getMessages();
        $Message = $this->getMessage($Messages[0]->id);

        $this->expected = '[' . $this->BaseInfo->getShopName() . '] 退会手続きのご完了';
        $this->actual = $Message->subject;
        $this->verify();

        $this->expected = '<'.$email.'>';
        $this->actual = $Message->recipients[0];
        $this->verify();

        $this->expected = 'Reply-To: '.$this->BaseInfo->getEmail03();
        $this->verifyRegExp($Message, 'Reply-Toは'.$this->BaseInfo->getEmail03().'ではありません');

        $BccMessage = $this->getMessage($Messages[1]->id);
        $this->expected = 'Bcc: '.$this->BaseInfo->getEmail01();
        $this->verifyRegExp($BccMessage, 'BCC');
    }

    /**
     * @link https://github.com/EC-CUBE/ec-cube/issues/1315
     * @deprecated since 3.0.0, to be removed in 3.1
     */
    public function testSendrContactMail()
    {
        $faker = $this->getFaker();
        $name01 = $faker->lastName;
        $name02 = $faker->firstName;
        $kana01 = $faker->lastName;
        $kana02 = $faker->firstName;
        $email = $faker->email;
        $zip = $faker->postCode;
        $zip01 = substr($zip, 0, 3);
        $zip02 = substr($zip, 3, 7);
        $Pref = $this->app['eccube.repository.master.pref']->find(1);
        $addr01 = $faker->city;
        $addr02 = $faker->streetAddress;
        $tel = explode('-', $faker->phoneNumber);
        $tel01 = $tel[0];
        $tel02 = $tel[1];
        $tel03 = $tel[2];

        $formData = array(
            'name01' => $name01,
            'name02' => $name02,
            'kana01' => $kana01,
            'kana02' => $kana02,
            'zip01' => $zip01,
            'zip02' => $zip02,
            'pref' => $Pref,
            'addr01' => $addr01,
            'addr02' => $addr02,
            'tel01' => $tel01,
            'tel02' => $tel02,
            'tel03' => $tel03,
            'email' => $email,
            'contents' => 'お問い合わせ内容'
        );

        $this->app['eccube.service.mail']->sendrContactMail($formData);

        $Messages = $this->getMessages();
        $Message = $this->getMessage($Messages[0]->id);

        $this->expected = '[' . $this->BaseInfo->getShopName() . '] お問い合わせを受け付けました。';
        $this->actual = $Message->subject;
        $this->verify();

        $this->expected = '<'.$email.'>';
        $this->actual = $Message->recipients[0];
        $this->verify();

        $this->expected = 'Reply-To: '.$this->BaseInfo->getEmail03();
        $this->verifyRegExp($Message, 'Reply-Toは'.$this->BaseInfo->getEmail03().'ではありません');

        $this->expected = 'お問い合わせ内容';
        $this->verifyRegExp($Message, 'お問い合わせ内容');

        $BccMessage = $this->getMessage($Messages[1]->id);
        $this->expected = 'Bcc: '.$this->BaseInfo->getEmail01();
        $this->verifyRegExp($BccMessage, 'BCC');
    }

    public function testSendContactMail()
    {
        $faker = $this->getFaker();
        $name01 = $faker->lastName;
        $name02 = $faker->firstName;
        $kana01 = $faker->lastName;
        $kana02 = $faker->firstName;
        $email = $faker->email;
        $zip = $faker->postCode;
        $zip01 = substr($zip, 0, 3);
        $zip02 = substr($zip, 3, 7);
        $Pref = $this->app['eccube.repository.master.pref']->find(1);
        $addr01 = $faker->city;
        $addr02 = $faker->streetAddress;
        $tel = explode('-', $faker->phoneNumber);
        $tel01 = $tel[0];
        $tel02 = $tel[1];
        $tel03 = $tel[2];

        $formData = array(
            'name01' => $name01,
            'name02' => $name02,
            'kana01' => $kana01,
            'kana02' => $kana02,
            'zip01' => $zip01,
            'zip02' => $zip02,
            'pref' => $Pref,
            'addr01' => $addr01,
            'addr02' => $addr02,
            'tel01' => $tel01,
            'tel02' => $tel02,
            'tel03' => $tel03,
            'email' => $email,
            'contents' => 'お問い合わせ内容'
        );

        $this->app['eccube.service.mail']->sendContactMail($formData);

        $Messages = $this->getMessages();
        $Message = $this->getMessage($Messages[0]->id);

        $this->expected = '[' . $this->BaseInfo->getShopName() . '] お問い合わせを受け付けました。';
        $this->actual = $Message->subject;
        $this->verify();

        $this->expected = '<'.$email.'>';
        $this->actual = $Message->recipients[0];
        $this->verify();

        $this->expected = 'Reply-To: '.$this->BaseInfo->getEmail03();
        $this->verifyRegExp($Message, 'Reply-Toは'.$this->BaseInfo->getEmail03().'ではありません');

        $this->expected = 'お問い合わせ内容';
        $this->verifyRegExp($Message, 'お問い合わせ内容');

        $BccMessage = $this->getMessage($Messages[1]->id);
        $this->expected = 'Bcc: '.$this->BaseInfo->getEmail01();
        $this->verifyRegExp($BccMessage, 'BCC');
    }

    public function testSendOrderMail()
    {
        $Order = $this->createOrder($this->Customer);
        $this->app['eccube.service.mail']->sendOrderMail($Order);

        $Messages = $this->getMessages();
        $Message = $this->getMessage($Messages[0]->id);

        $this->expected = '[' . $this->BaseInfo->getShopName() . '] ご注文ありがとうございます';
        $this->actual = $Message->subject;
        $this->verify();

        $this->expected = '<'.$this->Customer->getEmail().'>';
        $this->actual = $Message->recipients[0];
        $this->verify();

        $this->expected = 'Reply-To: '.$this->BaseInfo->getEmail03();
        $this->verifyRegExp($Message, 'Reply-Toは'.$this->BaseInfo->getEmail03().'ではありません');

        $BccMessage = $this->getMessage($Messages[1]->id);
        $this->expected = 'Bcc: '.$this->BaseInfo->getEmail01();
        $this->verifyRegExp($BccMessage, 'BCC');
    }

    public function testSendAdminCustomerConfirmMail()
    {
        $this->app['twig']->addGlobal('BaseInfo', $this->BaseInfo);
        $url = 'http://example.com/confirm';
        $this->app['eccube.service.mail']->sendAdminCustomerConfirmMail($this->Customer, $url);
        $Messages = $this->getMessages();
        $Message = $this->getMessage($Messages[0]->id);

        $this->expected = $url;
        $this->verifyRegExp($Message, 'URLは'.$url.'ではありません');

        $this->expected = '[' . $this->BaseInfo->getShopName() . '] 会員登録のご確認';
        $this->actual = $Message->subject;
        $this->verify();

        $this->expected = '<'.$this->Customer->getEmail().'>';
        $this->actual = $Message->recipients[0];
        $this->verify();

        $this->expected = 'Reply-To: '.$this->BaseInfo->getEmail03();
        $this->verifyRegExp($Message, 'Reply-Toは'.$this->BaseInfo->getEmail03().'ではありません');

        $BccMessage = $this->getMessage($Messages[1]->id);
        $this->expected = 'Bcc: '.$this->BaseInfo->getEmail01();
        $this->verifyRegExp($BccMessage, 'BCC');
    }

    public function testSendAdminOrderMail()
    {
        $Order = $this->createOrder($this->Customer);
        $faker = $this->getFaker();
        $header = $faker->paragraph;
        $footer = $faker->paragraph;
        $subject = $faker->sentence;
        $formData = array(
            'header' => $header,
            'footer' => $footer,
            'subject' => $subject
        );
        $this->app['eccube.service.mail']->sendAdminOrderMail($Order, $formData);

        $Messages = $this->getMessages();
        $Message = $this->getMessage($Messages[0]->id);

        $this->expected = '[' . $this->BaseInfo->getShopName() . '] '.$subject;
        $this->actual = $Message->subject;
        $this->verify();

        $this->expected = '<'.$this->Customer->getEmail().'>';
        $this->actual = $Message->recipients[0];
        $this->verify();

        $this->expected = 'Reply-To: '.$this->BaseInfo->getEmail03();
        $this->verifyRegExp($Message, 'Reply-Toは'.$this->BaseInfo->getEmail03().'ではありません');

        $BccMessage = $this->getMessage($Messages[1]->id);
        $this->expected = 'Bcc: '.$this->BaseInfo->getEmail01();
        $this->verifyRegExp($BccMessage, 'BCC');
    }

    public function testSendPasswordResetNotificationMail()
    {
        $this->app['twig']->addGlobal('BaseInfo', $this->BaseInfo);
        $url = 'http://example.com/reset';
        $this->app['eccube.service.mail']->sendPasswordResetNotificationMail($this->Customer, $url);
        $Messages = $this->getMessages();
        $Message = $this->getMessage($Messages[0]->id);

        $this->expected = $url;
        $this->verifyRegExp($Message, 'URLは'.$url.'ではありません');

        $this->expected = '[' . $this->BaseInfo->getShopName() . '] パスワード変更のご確認';
        $this->actual = $Message->subject;
        $this->verify();

        $this->expected = '<'.$this->Customer->getEmail().'>';
        $this->actual = $Message->recipients[0];
        $this->verify();

        $this->expected = 'Reply-To: '.$this->BaseInfo->getEmail03();
        $this->verifyRegExp($Message, 'Reply-Toは'.$this->BaseInfo->getEmail03().'ではありません');

        $this->assertLessThanOrEqual(1, count($Messages), 'Bccメールは送信しない');
    }

    public function testSendPasswordResetCompleteMail()
    {
        $this->app['twig']->addGlobal('BaseInfo', $this->BaseInfo);
        $faker = $this->getFaker();
        $password = $faker->password;
        $this->app['eccube.service.mail']->sendPasswordResetCompleteMail($this->Customer, $password);
        $Messages = $this->getMessages();
        $Message = $this->getMessage($Messages[0]->id);

        $this->expected = '[' . $this->BaseInfo->getShopName() . '] パスワード変更のお知らせ';
        $this->actual = $Message->subject;
        $this->verify();

        $this->expected = '<'.$this->Customer->getEmail().'>';
        $this->actual = $Message->recipients[0];
        $this->verify();

        $this->expected = 'Reply-To: '.$this->BaseInfo->getEmail03();
        $this->verifyRegExp($Message, 'Reply-Toは'.$this->BaseInfo->getEmail03().'ではありません');

        $this->assertLessThanOrEqual(1, count($Messages), 'Bccメールは送信しない');
    }

    protected function getMessages()
    {
        return $this->getMailCatcherMessages();
    }

    protected function getMessage($id)
    {
        return $this->getMailCatcherMessage($id);
    }

    protected function verifyRegExp($Message, $errorMessage = null)
    {
        $Source = $this->parseMailCatcherSource($Message);
        $this->assertRegExp('/'.preg_quote($this->expected, '/').'/', $Source, $errorMessage);
    }
}