مشکل ایمیل در لاراول

مشکل ارسال ایمیل در لاراول (اخطار proc_close )

دسته بندی : لاراول سطح مقاله : زمان مطالعه : دقیقه آخرین بروز رسانی: 20 مرداد 1397

سلام دوستان عزیز

در این مقاله چگونگی بر طرف کردن مشکل ارسال ایمیل هاست های اشتراکی در لاراول ورژن 5 به بالا که با اخطار proc_close خود را نمایان می کنند را بدون اینکه از سرویس دهنده خود کمک بگیرید را شرح خواهیم داد.

شرکت های ارائه دهنده هاست اشتراکی به دلیل بالا بودن کاربران روی یک سرور مجبورند که محدودیت هایی را اعمال کنند.

یکی از این محدودیت ها بستن سرویس proc-close می باشد.

لاراول از این سرویس در روند ارسال ایمیل استفاده می کند که متاسفانه به دلیل بسته بودن این سرویس در هاست های اشتراکی بعداز ارسال ایمیل به اخطار زیر مواجه می شویم:

ErrorException (E_WARNING)
proc_close() has been disabled for security reasons

نحوه برطرف کردن اخطار proc_close

متاسفانه تمامی توسعه دهندگان لاراول که در این مورد پست و مقاله ایی را ارسال کرده اند بر این باورند که حتما باید سرویس دهنده شما این امکان را فعال کند اما راه حلی وجد دارد که خود شما با تغییراتی بسیار کوچک این مشکل را بر طرف می کنید.

برای بر طرف کردن اخطار proc_close  ابتدا به مسیر زیر در پوشه لاراول خدو مراجعه کنید:

laravel/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php

فایل StreamBuffer.php را در یک ادیتور (مهم نیست چه ادیتوری باشه) باز کنید و در اون به دنبال کد زیر بگردید:

    /**
     * Perform any shutdown logic needed.
     */
    public function terminate()
    {
        if (isset($this->stream)) {
            switch ($this->params['type']) {
                case self::TYPE_PROCESS:
                    fclose($this->in);
                    fclose($this->out);
                    proc_close($this->stream);
                    break;
                case self::TYPE_SOCKET:
                default:
                    fclose($this->stream);
                    break;
            }
        }
        $this->stream = null;
        $this->out = null;
        $this->in = null;
    }

خب حالا تنها کافیه که proc_close رو کامنت کنید و یا حذف کنید (کامنت کنید که بعدا قابل دسترسی باشه)

حالا کد شما باید به شکل زیر در بیاد:

    /**
     * Perform any shutdown logic needed.
     */
    public function terminate()
    {
        if (isset($this->stream)) {
            switch ($this->params['type']) {
                case self::TYPE_PROCESS:
                    fclose($this->in);
                    fclose($this->out);
                    //proc_close($this->stream);
                    break;
                case self::TYPE_SOCKET:
                default:
                    fclose($this->stream);
                    break;
            }
        }
        $this->stream = null;
        $this->out = null;
        $this->in = null;
    }

خب دوستان به همین سادگی مشکل شما بر طرف میشه و دیگه این اخطار رو نخواهید دید.

امیدوارم این آموزش برای شما مفید واقع شده باشه.

این مقاله چقدر براتون مفید بود؟

میانگین رتبه : 5/5 - تعداد رای : 3