解決Moodle在上傳使用者時無法自動傳送賬號密碼郵件

luozz發表於2019-02-16

問題描述

由於某些原因,不能讓使用者進行註冊,只能有運營人員手動新增使用者,單個新增使用者比較麻煩,因此選擇使用上傳檔案的形式來批量生成使用者,但是上傳使用者在不給定 password 欄位時,應該生成密碼並通知使用者,但是最終結果是生成使用者成功了,郵件並沒有發出(郵件伺服器已正確配置,除了上傳使用者無法傳送郵件外,其它新增使用者或者忘記密碼等操作都可以傳送郵件),進過近一個星期對 moodle 原始碼的研究,終於找到 問題所在並解決,特此記錄,望接下來遇到此問題的夥伴能儘快解決此問題!

Moodle簡介

簡介來自百度百科

Moodle(Modular Object-Oriented Dynamic Learning Environment)是一個用於製作網路課程或網站的軟體包。它是一個全球性的開發專案,用以支援社會建構主義(social constructionist)的教育框架。Moodle是一個自由的開源軟體 (在GNU 公共許可協議下),也就是說Moodle是有版權的,但是你有額外的自由。你可以自由地複製、使用或者修改Moodle,前提條件是你同意:為他人提供程式碼,沒有修改或刪除原有的版權和許可,以及將相似的版權應用於衍生的作品。

當前工作環境

  • 伺服器:阿里雲Linux伺服器 Apache
  • moodle版本: MOODLE_33_STABLE
  • 其它moodle所需環境包括PHPMySQL等和moodle官網安裝推薦一致,伺服器路徑也一致

解決辦法

  • 鎖定問題檔案

    • 找到moodle目錄下 admin/tool/uploaduser/index.php
    • 該檔案便是上傳使用者時所有操作流程的檔案
  • 鎖定問題所在位置

    • 滾動到831行左右,找到如下程式碼:

      if ($user->password === `to be generated`) {
          set_user_preference(`create_password`, 1, $user);
      }
  • 解決問題

    • 將以上程式碼替換成如下程式碼:

      if ($user->password === `to be generated`) {
          setnew_password_and_mail($user);
          unset_user_preference(`create_password`, $user);
          set_user_preference(`auth_forcepasswordchange`, 1, $user);
      }
    • 程式碼釋義:之前的程式碼是隻生成了密碼,但是並未執行傳送賬號密碼郵件給使用者,因此替換後的程式碼會先執行傳送賬號密碼郵件,在清除已設定的密碼,最後設定使用者登入時強制修改密碼

問題總結

目前在本地和線上測試上傳單個或多個使用者都能正常傳送郵件,目的算是達到了!
解決此問題花費了不少時間,也怪筆者對 PHP 只能算是個半吊子,還未正式開發過 PHP 專案
因此走了不少彎路,但是最後問題得到解決,甚感欣慰!

*友情提示: 更改線上環境或測試環境程式碼後,記得重啟伺服器,例如當前環境就執行:service apache2 restart

相關文章