douyingmou1389
2014-07-25 11:37 阅读 53
已采纳

带有消息'fopen(/ tmp / ...)的SwiftMailer'ErrorException'无法打开流:权限被拒绝'

I've deployed a laravel app on a cpanel shared host.

When sending email usign Mail class, the following error occurs randomly. (sometimes the mail is sent but sometimes the error occurs)

production.ERROR: exception 'ErrorException' with message 'fopen(/tmp/e19839f1a2d67e4ab7c83a5951c31bfd/body): failed to open stream: Permission denied' in /home/ekbatana/laravel4/vendor/swiftmailer/swiftmailer/lib/classes/Swift/KeyCache/DiskKeyCache.php:300

I contacted the host support they said I need to change the default temporary directory.

In SwiftMailer package lib/preferences.php a variable called $tmp is set to getenv('TMPDIR') and a comment in the file says that:

// You can override the default temporary directory by setting the TMPDIR environment variable.

I tried to set the TMPDIR in different ways

1) .htaccess: SetEnv TMPDIR /home/.../laravel4/app/storage/my_temp

2) in app/start/global.php and also in App::before callback function using php putenv function

3) in lib/preferences.php before the line that $temp is set using php putenv function

but non of them changes the path to the file that is opened and causes failed to open stream: Permission denied error

the following is the swiftmailer/lib/preferences.php

<?php

/****************************************************************************/
/*                                                                          */
/* YOU MAY WISH TO MODIFY OR REMOVE THE FOLLOWING LINES WHICH SET DEFAULTS  */
/*                                                                          */
/****************************************************************************/

$preferences = Swift_Preferences::getInstance();

// Sets the default charset so that setCharset() is not needed elsewhere
$preferences->setCharset('utf-8');

// Without these lines the default caching mechanism is "array" but this uses a lot of memory.
// If possible, use a disk cache to enable attaching large attachments etc.
// You can override the default temporary directory by setting the TMPDIR environment variable.

// The @ operator in front of is_writable calls is to avoid PHP warnings
// when using open_basedir
$tmp = getenv('TMPDIR');
if ($tmp && @is_writable($tmp)) {
    $preferences
        ->setTempDir($tmp)
        ->setCacheType('disk');
} elseif (function_exists('sys_get_temp_dir') && @is_writable(sys_get_temp_dir())) {
    $preferences
        ->setTempDir(sys_get_temp_dir())
        ->setCacheType('disk');
}

// this should only be done when Swiftmailer won't use the native QP content encoder
// see mime_deps.php
if (version_compare(phpversion(), '5.4.7', '<')) {
    $preferences->setQPDotEscape(false);
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

1条回答 默认 最新

  • 已采纳
    dptrmt4366 dptrmt4366 2014-07-25 13:24

    You need to check whether the directory is writable by the process trying to write to the directory. You can verify which user and group is used by your process by executing:

    <?php
        echo getmyuid().':'.getmygid();
    ?>
    

    This will give you something like user:group. Then you need to chown the directory to write to with:

    chown -R user:group writable_directory/
    
    点赞 评论 复制链接分享

相关推荐