PHPMailer:修訂版本之間的差異
出自福留子孫
(→(二)gogopublic.net、ourlearning.tw) |
|||
(未顯示同用戶所作出之23次版本) | |||
第 1 行: | 第 1 行: | ||
[[分類:應用軟體]] | [[分類:應用軟體]] | ||
+ | ==布署情形== | ||
+ | [https://github.com/PHPMailer/PHPMailer/releases 各歷史版本下載點] | ||
+ | |||
+ | 有兩種平行版本: | ||
+ | #兼容 PHP 5.5 以下的環境,最後版本是 5.2.28 版(2020.3.19) | ||
+ | #一路適應到 PHP 8.4 ,最後版本是 6.9.1 版(2023.11.26) | ||
+ | 振鐸使用的是前者。 | ||
+ | |||
+ | ===一、均優新=== | ||
+ | *admin@quality-learning.net 可用 | ||
+ | *處理「跨校選修」報名 | ||
+ | */httpdocs/mail | ||
+ | *PHPMailer 版本 5.2.28 | ||
+ | |||
+ | ===二、戰國策舊網頁伺服器=== | ||
+ | ====(一)全民科學==== | ||
+ | *admin@science4everyone.net 可用外,被彰師大建了 77 個 mail 帳號,丁丁 2024.4.7 加以刪除 | ||
+ | *未被使用,即使以程式成功寄信,郵件也沒有真正發出 | ||
+ | */httpdocs/mail | ||
+ | *PHPMailer 版本 5.2.28 | ||
+ | |||
+ | ====(二)gogopublic.net、ourlearning.tw==== | ||
+ | * admin@gogopublic.net | ||
+ | * 驅動:http://preschool.gogopublic.net/mail/sm.php | ||
+ | * 信箱:http://webmail.gogopublic.net | ||
+ | * 方法 1,3 均可使 gmail 收到信 | ||
+ | * /httpdocs/mail | ||
+ | * PHPMailer 版本 5.2.28 | ||
+ | * [[Gogopublic.net域名管理|相關的 DNS 設定說明]] | ||
+ | |||
+ | ===三、DS216=== | ||
+ | *無郵件伺服器 | ||
+ | *在放標準版本 | ||
+ | */web/mails,逐步同步於均優 | ||
+ | *PHPMailer 版本 5.2.28 | ||
+ | |||
==寄信== | ==寄信== | ||
− | === | + | ===一、寄信類別=== |
2017年版本:6.0.3版,適用於 PHP Version 5.5 | 2017年版本:6.0.3版,適用於 PHP Version 5.5 | ||
第 16 行: | 第 52 行: | ||
<pre><?php | <pre><?php | ||
require("./class/phpmailer/PHPMailer.php"); | require("./class/phpmailer/PHPMailer.php"); | ||
− | $mail = new | + | $mail = new 名字空間\PHPMailer; // 依類別造物件 |
$mail->CharSet='utf-8'; // 設字集為utf-8,預設為iso-8859-1 | $mail->CharSet='utf-8'; // 設字集為utf-8,預設為iso-8859-1 | ||
$mail->IsSMTP(); // 設屬性 Mailer = 'smtp',指定由 SMTP 寄信 | $mail->IsSMTP(); // 設屬性 Mailer = 'smtp',指定由 SMTP 寄信 | ||
第 76 行: | 第 112 行: | ||
?></pre> | ?></pre> | ||
− | === | + | ===二、寄信布署=== |
當要寄數千封信時,不要用一支 php 程式從頭寄到底,中途會逾時。比較好的做法如下: | 當要寄數千封信時,不要用一支 php 程式從頭寄到底,中途會逾時。比較好的做法如下: | ||
*在 /etc/crontab 中加一行,每十鐘觸動一次排程: | *在 /etc/crontab 中加一行,每十鐘觸動一次排程: | ||
第 95 行: | 第 131 行: | ||
?> | ?> | ||
*在指定路徑下建立寄信程式,如果由通道送入約定,就開始寄信。 | *在指定路徑下建立寄信程式,如果由通道送入約定,就開始寄信。 | ||
− | === | + | *寄信休息期間將 smsEDM.php 改名為 smsEDM-.php ,即可停止發信。 |
− | *[https://support.google.com/mail/answer/22839?p=ReceivingRate&visit_id=1-636546776249481473-869653802&rd=2 google 每日寄信數量限制的說明(英文)]中說每天限寄 500 | + | ===三、gmail 的寄信限制=== |
+ | *[https://support.google.com/mail/answer/22839?p=ReceivingRate&visit_id=1-636546776249481473-869653802&rd=2 google 每日寄信數量限制的說明(英文)]中說每天限寄 500 封信,實測結果在2018年初寄信上限大約在每天 1000 封上下,過量會無法寄信,但過當地時間午夜12點,會恢復寄信功能。 | ||
*該信建議使用通訊群組做相同的事,但我們並沒辦法做到通信群組中人人都認同,所以並不可行。 | *該信建議使用通訊群組做相同的事,但我們並沒辦法做到通信群組中人人都認同,所以並不可行。 | ||
+ | |||
+ | ===四、寄信資料表的整理要領=== | ||
+ | #用「select * from 表名 where 姓名欄 regexp '\\w+'」來找出機器人報名、註冊的人,其姓名欄會只有英,數字元。 | ||
+ | #將含有「@googlegroups.com」排在前面。 | ||
+ | |||
+ | ===五、寄完信的善後=== | ||
+ | |||
==收信== | ==收信== | ||
− | === | + | IMAP 和 POP 是存取電子郵件的兩種方法。如果需要在多個不同裝置(例如手機、膝上型電腦、平板電腦)上檢查電子郵件,就建議使用 IMAP。 |
+ | |||
+ | 使用 IMAP 存取或讀取電子郵件時,並非實際將郵件下載或儲存於 client 端的電腦,而是從電子郵件服務中讀取。比起 POP,可以快速的檢查郵件。 | ||
+ | |||
+ | POP 的運作方式是與郵件伺服器連線,並下載郵件伺服器中的所有新郵件。一旦郵件下載至 client 端後,郵件伺服器就會將它們刪除。這表示電子郵件下載之後,就只能使用同一台電腦來存取該郵件。 | ||
+ | |||
+ | ===POP3.php中的方法=== | ||
====公開的方法==== | ====公開的方法==== | ||
#popBeforeSmtp:用authorise登入POP並回傳結果。在寄信之前先以 POP3 收信,由於收信的認證資料會有短時間存在主機裡面,因此在 POP 收信完成後,就可以寄信,這個時候的寄信認證的機制就是使用前一時間的 POP 的認證。 | #popBeforeSmtp:用authorise登入POP並回傳結果。在寄信之前先以 POP3 收信,由於收信的認證資料會有短時間存在主機裡面,因此在 POP 收信完成後,就可以寄信,這個時候的寄信認證的機制就是使用前一時間的 POP 的認證。 | ||
第 122 行: | 第 172 行: | ||
#用 fclose(連結):繳還連結。 | #用 fclose(連結):繳還連結。 | ||
====POP3指令清單==== | ====POP3指令清單==== | ||
+ | 信件編號為n | ||
#TELNET mail.company.com.tw 110 | #TELNET mail.company.com.tw 110 | ||
#USER:命令輸入用戶信箱名。例:USER sendname | #USER:命令輸入用戶信箱名。例:USER sendname | ||
第 130 行: | 第 181 行: | ||
#RETR n:顯示第n個信件的全部內容。 | #RETR n:顯示第n個信件的全部內容。 | ||
#DELE n:刪除指定的第n個信件。 | #DELE n:刪除指定的第n個信件。 | ||
+ | #RSET:將所有標示為『刪除』的信件, 全部還原成尚未標示成刪除的狀態。(Reset,重設) | ||
#LAST:顯示下一個信件的編號。 | #LAST:顯示下一個信件的編號。 | ||
+ | #UIDL [n]:將指定信件的識別碼列出來。沒有 n 則全列。(Unique-ID Listing,識別碼列示) | ||
#NOOP:不執行任何操作,僅用來測試伺服器的回應是否正常。 | #NOOP:不執行任何操作,僅用來測試伺服器的回應是否正常。 | ||
− | #QUIT:退出 | + | #QUIT:退出 Server,結束信件查閱過程,POP3伺服器進入更新階段。郵件伺服器會刪除掉『已標示刪除』的信件, 傳回『再見』訊息, 結束『更新』階段。 |
− | === | + | ===POP3.php中的屬性=== |
<pre>Array | <pre>Array | ||
( | ( | ||
第 145 行: | 第 198 行: | ||
) | ) | ||
</pre> | </pre> | ||
+ | |||
+ | ===PHP 有 IMAP 的專屬函式=== | ||
+ | 連接範例如下: | ||
+ | <pre><?php | ||
+ | $res=@imap_open("{localhost/imap/ssl}","帳號","密碼",NULL,1); | ||
+ | imap_errors();imap_alerts(); // 消滅錯誤訊息 | ||
+ | if($res===false){echo "login failed";} | ||
+ | else{imap_close($res);echo "login successed";} | ||
+ | ?></pre> | ||
+ | 運用這些函式做成類別 receivemail.class.php ,其使用範例是 example.php 。 | ||
+ | |||
===參考資料=== | ===參考資料=== | ||
#[http://hweily.pixnet.net/blog/post/22585676-指令--pop3 POP3指令] | #[http://hweily.pixnet.net/blog/post/22585676-指令--pop3 POP3指令] | ||
#[http://mrynlin.blogspot.tw/2010/12/smtppop3.html SMTP及POP3指令] | #[http://mrynlin.blogspot.tw/2010/12/smtppop3.html SMTP及POP3指令] | ||
#[http://www.cpcm.pu.edu.tw/files/recruit/33_15e1dabb.pdf 設定Gmail信箱使用POP3協定收其他非gmail帳號的信] | #[http://www.cpcm.pu.edu.tw/files/recruit/33_15e1dabb.pdf 設定Gmail信箱使用POP3協定收其他非gmail帳號的信] | ||
+ | #[https://support.google.com/mail/answer/7126229?hl=zh-Hant 變更 IMAP 設定以便使用其他程式查看 Gmail] | ||
#[https://support.google.com/mail/answer/7104828?hl=zh-Hant 使用其他電子郵件程式讀取 Gmail 郵件(透過POP協定)] | #[https://support.google.com/mail/answer/7104828?hl=zh-Hant 使用其他電子郵件程式讀取 Gmail 郵件(透過POP協定)] | ||
#google 蒐「gmail 使用 POP3」能得到更多有用的說明。 | #google 蒐「gmail 使用 POP3」能得到更多有用的說明。 | ||
− | + | #[http://download.csdn.net/download/life169/3034961 參考資料列表] | |
− | + | #[http://download.csdn.net/download/lzl41108891/6302439 PHP接收邮件类receivemail.class.php] | |
− | + | #[http://blog.csdn.net/god_7z1/article/details/6759178 用PHP写的POP3电子邮件收取流程] |
2024年4月7日 (日) 20:37的最新修訂版本
目錄
布署情形
有兩種平行版本:
- 兼容 PHP 5.5 以下的環境,最後版本是 5.2.28 版(2020.3.19)
- 一路適應到 PHP 8.4 ,最後版本是 6.9.1 版(2023.11.26)
振鐸使用的是前者。
一、均優新
- admin@quality-learning.net 可用
- 處理「跨校選修」報名
- /httpdocs/mail
- PHPMailer 版本 5.2.28
二、戰國策舊網頁伺服器
(一)全民科學
- admin@science4everyone.net 可用外,被彰師大建了 77 個 mail 帳號,丁丁 2024.4.7 加以刪除
- 未被使用,即使以程式成功寄信,郵件也沒有真正發出
- /httpdocs/mail
- PHPMailer 版本 5.2.28
(二)gogopublic.net、ourlearning.tw
- admin@gogopublic.net
- 驅動:http://preschool.gogopublic.net/mail/sm.php
- 信箱:http://webmail.gogopublic.net
- 方法 1,3 均可使 gmail 收到信
- /httpdocs/mail
- PHPMailer 版本 5.2.28
- 相關的 DNS 設定說明
三、DS216
- 無郵件伺服器
- 在放標準版本
- /web/mails,逐步同步於均優
- PHPMailer 版本 5.2.28
寄信
一、寄信類別
2017年版本:6.0.3版,適用於 PHP Version 5.5
寄信兩檔:
- PHPMailer.php
- SMTP.php
將它們置於同一個資料夾。
在 PHPMailer.php 的「protected function smtpSend($header, $body)」函式裡增加一行:
require_once 'SMTP.php'; // by jj
使其自動載入 SMTP.php 。
寄信的範例程式 smDemo.php:
<?php require("./class/phpmailer/PHPMailer.php"); $mail = new 名字空間\PHPMailer; // 依類別造物件 $mail->CharSet='utf-8'; // 設字集為utf-8,預設為iso-8859-1 $mail->IsSMTP(); // 設屬性 Mailer = 'smtp',指定由 SMTP 寄信 $mail->Host="smtp.gmail.com"; // SMTP servers 是那一台機器,預設值為 'localhost' $mail->SMTPSecure='tls'; // GMail指定的認證方式,預設值為空字串 $mail->Port=587; // GMail指定TLS認證的 port ,預設值為 25 $mail->SMTPAuth=true; // 為打開 SMTP 認證,預設值為 false $mail->Username='xxx@gmail.com';// SMTP 帳號,預設值為空字串 $mail->Password='********'; // SMTP 密碼,預設值為空字串 $mail->WordWrap=200; // 多少字折行,預設值為 0,不折行 $mail->IsHTML(true); // 設 ContentType='text/html',信是 HTML 格式 $mail->From='xxx@gmail.com'; // 寄件人郵址,預設值為 'root@localhost' $mail->FromName='○○○'; // 寄件人姓名,預設值為 'Root User' $mail->FromName='=?UTF-8?B?'.base64_encode($mail->FromName).'?='; $mail->Subject='這是示範信件'; // 主旨,預設值為空字串 $mail->Subject='=?UTF-8?B?'.base64_encode($mail->Subject).'?='; // 信文從此開始,屬性Body,預設值為空字串 $images=array(); $fn='../路徑/示範信.html'; $bodyDirname=dirname($fn); if(filesize($fn)>0){ // 信文檔不是空檔 $f=fopen($fn,"r"); $body=fread($f,filesize($fn)); fclose($f); $mail->Body=str_replace("src='./images/","src='cid:",$body); // 將 src 換成 cid,並移除路徑 $temp=cuts("src='","'",$body); // 將所有src指示的圖檔,取成陣列 foreach($temp as $k=>$v){$images[$v]=1;} // 利用索引的唯一性,消除重覆的圖檔 $images=array_keys($images); // 索引才是我們想要的諸檔 }else{$mail->Body='';} // 信文到此結束 /// 加信的圖 foreach($images as $image){ if($image){ $mail->AddEmbeddedImage($bodyDirname.'/'.$image,basename($image),basename($image),"base64","image/".substr(basename($image),-1*(strlen(strstr(basename($image),'.'))-1))); } } $mail->ClearAllRecipients(); // 清空收件者陣列 $mail->AddAddress('yyy@gmail.com','=?UTF-8?B?'.base64_encode('☆☆☆').'?='); // 加入收件者 $mail->Send(); // 以 $start開始、$end結束所夾的字串,蒐集起來構成陣列 function cuts($start,$end,$str,$se=null){ $len1=strlen($start); $len2=strlen($end); $ret=array(); while(strlen($str)>0){ $str=strstr($str,$start); $str=substr($str,$len1); if(strlen(substr($str,0,strpos($str,$end)))>0){ if($se==1){$ret[]=$start.substr($str,0,strpos($str,$end));} elseif($se==2){$ret[]=substr($str,0,strpos($str,$end)).$end;} elseif($se==3){$ret[]=$start.substr($str,0,strpos($str,$end)).$end;} else{$ret[]=substr($str,0,strpos($str,$end));} } $str=strstr($str,$end); $str=substr($str,$len2); } return $ret; } ?>
二、寄信布署
當要寄數千封信時,不要用一支 php 程式從頭寄到底,中途會逾時。比較好的做法如下:
- 在 /etc/crontab 中加一行,每十鐘觸動一次排程:
#minute hour mday month wday who command */5 * * * * root /usr/bin/php /volume1/web/smsEDM.php
- 相應修改 php 的最長執行時間:
- 因為DS216+在 /volume1/@appstore/Apache2.2/usr/local/etc/apache22/conf/extra/httpd-default.conf 設定「Timeout 300」除非修改它,否則最多只能五分鐘觸動一次。
- 修改「DSM/Web Station/PHP 設定/編輯配置檔/核心設定/搜尋max_execution_time/預設為 240 改為 300/確定」
- 相應修改 default.php 中的 $limit 變數,改為 65 。
- 在文件根目錄中,造 smsEDM.php ,供排程觸動,簡單版如下:
#!/usr/bin/php <?php $socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP); socket_connect($socket,'localhost',80); $command="GET /路徑/smsEDM.php?act=約定 HTTP/1.0\nhost:localhost\n\n"; socket_write($socket,$command,strlen($command)); socket_close($socket); ?>
- 在指定路徑下建立寄信程式,如果由通道送入約定,就開始寄信。
- 寄信休息期間將 smsEDM.php 改名為 smsEDM-.php ,即可停止發信。
三、gmail 的寄信限制
- google 每日寄信數量限制的說明(英文)中說每天限寄 500 封信,實測結果在2018年初寄信上限大約在每天 1000 封上下,過量會無法寄信,但過當地時間午夜12點,會恢復寄信功能。
- 該信建議使用通訊群組做相同的事,但我們並沒辦法做到通信群組中人人都認同,所以並不可行。
四、寄信資料表的整理要領
- 用「select * from 表名 where 姓名欄 regexp '\\w+'」來找出機器人報名、註冊的人,其姓名欄會只有英,數字元。
- 將含有「@googlegroups.com」排在前面。
五、寄完信的善後
收信
IMAP 和 POP 是存取電子郵件的兩種方法。如果需要在多個不同裝置(例如手機、膝上型電腦、平板電腦)上檢查電子郵件,就建議使用 IMAP。
使用 IMAP 存取或讀取電子郵件時,並非實際將郵件下載或儲存於 client 端的電腦,而是從電子郵件服務中讀取。比起 POP,可以快速的檢查郵件。
POP 的運作方式是與郵件伺服器連線,並下載郵件伺服器中的所有新郵件。一旦郵件下載至 client 端後,郵件伺服器就會將它們刪除。這表示電子郵件下載之後,就只能使用同一台電腦來存取該郵件。
POP3.php中的方法
公開的方法
- popBeforeSmtp:用authorise登入POP並回傳結果。在寄信之前先以 POP3 收信,由於收信的認證資料會有短時間存在主機裡面,因此在 POP 收信完成後,就可以寄信,這個時候的寄信認證的機制就是使用前一時間的 POP 的認證。
- authorise:連接POP並login。
- connect:用fsockopen去連接POP。
- login:用sendString方法(即fwrite)去登入POP。
- disconnect:用fclose去結束POP連線。
- getErrors:return $this->errors;。
私用的方法
- getResponse($size=128):用fgets由POP連線取回應,一方面echo 回應,一方面return 回應。
- sendString($string):用fwrite將$string寫入pop連線並回傳結果,同時echo $string。
- checkResponse($string):檢查$string前三byte是否為'+OK',是就回傳真,否就回傳假,並將$string塞入屬性errors陣列,成為其一個元素。
- setError($error):將$error字串塞入屬性errors陣列,並依屬性do_debug的值,決定是否印出。
- catchWarning($errno,$errstr,$errfile,$errline):串接$errno,$errstr,$errfile,$errline成長字串,塞給setError方法。
原始指令
- 用 fsockopen(POP3 Host,Port,Error Number,Error Message,Timeout seconds)去得到連結。
- 用 fwrite(連結,命令,命令長度) 下命令:
- USER 帳號換行:提供帳號。
- PASS 密碼換行:提供密碼。
- QUIT:結束。
- 用 fclose(連結):繳還連結。
POP3指令清單
信件編號為n
- TELNET mail.company.com.tw 110
- USER:命令輸入用戶信箱名。例:USER sendname
- PASS:輸入用戶信箱密碼。例:PASS sendpassword
- STAT:伺服器將告訴用戶共有多少封信件在信箱中。
- LIST:顯示信件個數、序號和每個信件的大小。
- TOP n m:顯示第n個信件前m行的內容。
- RETR n:顯示第n個信件的全部內容。
- DELE n:刪除指定的第n個信件。
- RSET:將所有標示為『刪除』的信件, 全部還原成尚未標示成刪除的狀態。(Reset,重設)
- LAST:顯示下一個信件的編號。
- UIDL [n]:將指定信件的識別碼列出來。沒有 n 則全列。(Unique-ID Listing,識別碼列示)
- NOOP:不執行任何操作,僅用來測試伺服器的回應是否正常。
- QUIT:退出 Server,結束信件查閱過程,POP3伺服器進入更新階段。郵件伺服器會刪除掉『已標示刪除』的信件, 傳回『再見』訊息, 結束『更新』階段。
POP3.php中的屬性
Array ( [do_debug] => 0 [host] => [port] => [tval] => [username] => [password] => )
PHP 有 IMAP 的專屬函式
連接範例如下:
<?php $res=@imap_open("{localhost/imap/ssl}","帳號","密碼",NULL,1); imap_errors();imap_alerts(); // 消滅錯誤訊息 if($res===false){echo "login failed";} else{imap_close($res);echo "login successed";} ?>
運用這些函式做成類別 receivemail.class.php ,其使用範例是 example.php 。
參考資料
- POP3指令
- SMTP及POP3指令
- 設定Gmail信箱使用POP3協定收其他非gmail帳號的信
- 變更 IMAP 設定以便使用其他程式查看 Gmail
- 使用其他電子郵件程式讀取 Gmail 郵件(透過POP協定)
- google 蒐「gmail 使用 POP3」能得到更多有用的說明。
- 參考資料列表
- PHP接收邮件类receivemail.class.php
- 用PHP写的POP3电子邮件收取流程