You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 5发送邮件时附件变为.tmp文件的问题求助

解决邮件附件显示为.tmp格式的问题

你猜的没错!问题确实出在getRealPath()上——这个方法返回的是上传文件在服务器临时目录里的路径,而临时文件的后缀本来就是.tmp,直接把这个路径传给attach()的话,Laravel就会用临时文件的默认名称作为附件名,所以收件人看到的就是.tmp后缀的文件。

下面给你两种简单的修复方案,任选其一就行:

方案一:直接传递上传文件实例(推荐)

这种方式最简洁,Laravel会自动处理文件名和MIME类型:

修改控制器代码

public function choiceAnalyst(Request $request){ 
    $userSelect = $request->input('user'); 
    $data = User::where('id', '=', $userSelect)->first(); 
    // 获取上传的文件实例
    $uploadedFile = $request->file('document');
    // 把用户数据和文件实例一起传给Mailable
    Mail::to('eaquino@spi.com.ve')->send(new AnalystMonth($data, $uploadedFile)); 
    return redirect()->route('home', ['message' => 'Correo enviado correctamente']); 
}

修改Mailable类代码

use Illuminate\Http\UploadedFile; // 别忘了引入这个类

class AnalystMonth extends Mailable { 
    use Queueable, SerializesModels; 
    public $user; 
    public $uploadedFile;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct(User $user, UploadedFile $uploadedFile) { 
        $this->user = $user; 
        $this->uploadedFile = $uploadedFile;
    } 

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build() { 
        // 直接传入文件实例,Laravel会自动用原始文件名
        return $this->view('mails.analystMonth')
                    ->attach($this->uploadedFile);
    } 
}

方案二:手动指定附件文件名

如果你不想传递文件实例,也可以在attach时手动设置原始文件名:

修改控制器代码

public function choiceAnalyst(Request $request){ 
    $userSelect = $request->input('user'); 
    $data = User::where('id', '=', $userSelect)->first(); 
    $uploadedFile = $request->file('document');
    // 把临时路径和原始文件名都存在$data里
    $data->attachPath = $uploadedFile->getRealPath();
    $data->originalFileName = $uploadedFile->getClientOriginalName();
    Mail::to('eaquino@spi.com.ve')->send(new AnalystMonth($data)); 
    return redirect()->route('home', ['message' => 'Correo enviado correctamente']); 
}

修改Mailable类代码

class AnalystMonth extends Mailable { 
    use Queueable, SerializesModels; 
    public $user; 

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct(User $user) { 
        $this->user = $user; 
    } 

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build() { 
        return $this->view('mails.analystMonth')
                    ->attach($this->user->attachPath, [
                        'as' => $this->user->originalFileName, // 指定显示的文件名
                        'mime' => $uploadedFile->getClientMimeType() // 可选:指定MIME类型
                    ]);
    } 
}

两种方案都能解决你的问题,推荐第一种,因为更符合Laravel的设计习惯,代码也更简洁。

内容的提问来源于stack exchange,提问作者Edwin Aquino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:10:54