PHP發送郵件需要開啟下面幾個服務:
SMTP:簡單郵件傳輸協議,用來發送郵件
POP3:簡單的郵件訪問協議,單向的,本地對郵件的操作不會同步到郵件服務器,用來接收郵件
IMAP:是一種比POP3更復雜的郵件訪問協議,是雙向的,本地對郵箱的操作會同步到郵箱服務器,用來接收郵件
發送之前需要擁有自己的郵件服務器,測試的時候其實用自己申請的免費郵箱就行,不需要自己搭建服務器了,可能要配置郵箱的SMTP服務,大部分公共郵箱(163、qq等)為了安全默認是關閉的,需要手動開啟。
網易郵箱配置
QQ郵箱配置
基本的介紹完之后,開始說怎么用(以QQ郵箱為例)。
一、開啟服務
登陸QQ郵箱,頂部有設置按鈕,點擊賬戶,拉到最后,開啟第一行的 POP3/SMTP 服務,開啟之后會有一串密碼,復制下來一會要用。
二、下載安裝PHPMailer
1、從 github 上下載: https://github.com/PHPMailer/PHPMailer/
2、使用 composer 安裝:
composer require phpmailer/phpmailer
如果只是發送郵件,只留phpmailer.php和smtp.php就行。在vendor文件夾下新建phpmailer文件夾,把下載的文件放到這個文件夾下,打開composer.json文件,在autoload下加入一行代碼 phpmailer 是命名空間名,vendor/phpmailer是對應的文件名
"autoload": { "psr-4": { "app\\": "application", "phpmailer\\": "vendor/phpmailer" } },
分別打開PHPMailer.php和SMTP.php,修改其命名空間,為 “ namespace phpmailer; ”,兩個文件都要修改,要不然會找不到文件
打開cmd,進入到項目根目錄,使用composer命令加載第三方類庫,執行composer dump-autoload
三、控制器代碼
<?php namespace app\index\controller; use think\Controller; use phpmailer\PHPMailer; use phpmailer\Exception; class Sendmail extends Controller { // public function index() { $toemail = '*****@126.com'; //這里寫的是收件人的郵箱 $mail=new Phpmailer(); $mail->isSMTP(); // 使用SMTP服務(發送郵件的服務) $mail->CharSet = "utf8"; // 編碼格式為utf8,不設置編碼的話,中文會出現亂碼 $mail->Host = "smtp.qq.com"; // 發送方的SMTP服務器地址 $mail->SMTPAuth = true; // 是否使用身份驗證 $mail->Username = "12*****186@qq.com"; // 申請了smtp服務的郵箱名(自己的郵箱名) $mail->Password = "hcstaffeplbcjgii"; // 發送方的郵箱密碼,不是登錄密碼,是qq的第三方授權登錄碼,要自己去開啟(之前叫你保存的那個密碼) $mail->SMTPSecure = "ssl"; // 使用ssl協議方式, $mail->Port = 465; // QQ郵箱的ssl協議方式端口號是465/587 $mail->setFrom("12*****186@qq.com","測試發件人"); // 設置發件人信息,如郵件格式說明中的發件人, $mail->addAddress($toemail,'測試收件人'); // 設置收件人信息,如郵件格式說明中的收件人 $mail->addReplyTo("12*****186@qq.com","Reply"); // 設置回復人信息,指的是收件人收到郵件后,如果要回復,回復郵件將發送到的郵箱地址 //$mail->addCC("xxx@163.com"); // 設置郵件抄送人,可以只寫地址,上述的設置也可以只寫地址(這個人也能收到郵件) //$mail->addBCC("xxx@163.com"); // 設置秘密抄送人(這個人也能收到郵件) //$mail->addAttachment("bug0.jpg"); // 添加附件 $mail->Subject = "這是一個測試郵件"; // 郵件標題 $mail->Body = '<h1>這里是郵件內容</h1>' . date('Y-m-d H:i:s');// 郵件正文 //$mail->AltBody = "This is the plain text純文本";// 這個是設置純文本方式顯示的正文內容,如果不支持Html方式,就會用到這個,基本無用** if(!$mail->send()){ // 發送郵件 echo "Message could not be sent."; echo "Mailer Error: ".$mail->ErrorInfo; // 輸出錯誤信息 }else{ echo ''; return '發送成功'; } } }
四、運行
sendmail.bat
@echo off start http://網址/sendmail.php exit
五、運行結果
發件人郵箱
收件人郵箱