前言
在阿里云上買(mǎi)了一個(gè)輕量應(yīng)用服務(wù)器汹桦,之所以選擇這個(gè)是因?yàn)樵擃?lèi)型的服務(wù)器可以在購(gòu)買(mǎi)時(shí)配置開(kāi)發(fā)環(huán)境,而且價(jià)格比較便宜蝗锥。將網(wǎng)站在本地搭好上傳到云上時(shí)氓拼,發(fā)現(xiàn)原本可以運(yùn)行的郵件發(fā)送功能失效了。折騰了將近一天之后晨汹,才發(fā)現(xiàn)問(wèn)題所在豹储,這里記錄一下。
官方教程
阿里云在幫助中提供了SMTP發(fā)郵件的示例程序淘这,各個(gè)語(yǔ)言的版本都有剥扣,很全面:
其中PHP的代碼如下:
<?php
require 'email.class.php';
$mailto='***';
$mailsubject="測(cè)試郵件";
$mailbody='這里是郵件內(nèi)容';
$smtpserver = "smtpdm.aliyun.com";
$smtpserverport = 25;
$smtpusermail = "***";
$smtpuser = "***";
$smtppass = "***";
$mailsubject = "=?UTF-8?B?" . base64_encode($mailsubject) . "?=";
$mailtype = "HTML";
$smtp = new smtp($smtpserver, $smtpserverport, true, $smtpuser, $smtppass);
$smtp->debug = false;
$smtp->sendmail($mailto, $smtpusermail, $mailsubject, $mailbody, $mailtype);
在使用時(shí)我將官方給出的PHP的代碼復(fù)制進(jìn)去,運(yùn)行時(shí)還是出錯(cuò)(訪(fǎng)問(wèn)smtp服務(wù)器超時(shí))铝穷。后來(lái)查了各種資料才發(fā)現(xiàn)阿里云出于安全的考慮钠怯,將25號(hào)端口關(guān)閉了(教程給的就是25號(hào)端口)。實(shí)際中使用SSL協(xié)議曙聂,對(duì)應(yīng)SMTP端口就是465晦炊,將端口改掉,同時(shí)在smtp服務(wù)器地址前加ssl://
即可:
$smtpserver = "ssl://smtpdm.aliyun.com";
$smtpserverport = 465;
實(shí)例代碼
實(shí)際中網(wǎng)站使用PHPMail進(jìn)行郵件的發(fā)送宁脊。代碼如下:
<?php
//該文件名為 sendemailPHPMail.php
/* use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'php/Exception.php';
require 'php/PHPMailer.php';
require 'php/SMTP.php'; */
include_once "class.phpmailer.php";
include_once "class.smtp.php";
//include_once "Exception.php";
//獲取一個(gè)外部文件的內(nèi)容
$mail=new PHPMailer();
///
$send_name=$_POST['name'];
$send_phone=$_POST['phone'];
$send_theme=$_POST['theme'];
$send_kind=$_POST['kind'];
$mailcontent = "姓名昵稱(chēng): ".$send_name."<br>電話(huà)郵箱: ".$send_phone."<br>用途: ".$send_theme."<br>風(fēng)格: ".$send_kind."<br>內(nèi)容: ".$_POST['content'];//郵件內(nèi)容
///
//設(shè)置smtp參數(shù)
$mail->IsSMTP();
$mail->SMTPAuth=true;
$mail->SMTPKeepAlive=true;
$mail->Host="ssl://smtp.163.com";
$mail->Port=465;
//填寫(xiě)你的email賬號(hào)和密碼
$mail->Username="****@163.com";
$mail->Password="****";#注意這里要填寫(xiě)授權(quán)碼就是我在上面網(wǎng)易郵箱開(kāi)啟SMTP中提到的断国,不能填郵箱登錄的密碼哦。
//設(shè)置發(fā)送方朦佩,最好不要偽造地址
$mail->From="***@163.com";
$mail->FromName="***";//發(fā)送者用戶(hù)名
$mail->Subject="****";//郵件標(biāo)題
$mail->AltBody=$mailcontent; //郵件內(nèi)容
$mail->WordWrap=50; // set word wrap
$mail->MsgHTML($mailcontent);
//設(shè)置回復(fù)地址
$mail->AddReplyTo("****@163.com","***");
//設(shè)置郵件接收方的郵箱和姓名
$mail->AddAddress("***@qq.com","**");//接收者郵箱和用戶(hù)名
//使用HTML格式發(fā)送郵件
$mail->IsHTML(true);
//通過(guò)Send方法發(fā)送郵件
//根據(jù)發(fā)送結(jié)果做相應(yīng)處理
if(!$mail->Send()){
//echo "Mailer Error:".$mail->ErrorInfo;
echo "<meta charset=\"UTF-8\">";
echo "<script language=\"JavaScript\">\r\n";
echo " alert(\"對(duì)不起并思,郵件發(fā)送失敗S锍怼宋彼!請(qǐng)充實(shí)\");\r\n";
echo " history.back();\r\n";
echo "</script>";
exit;
exit();
}else{
echo "<meta charset=\"UTF-8\">";
echo "<script language=\"JavaScript\">\r\n";
echo " alert(\"發(fā)送成功!仙畦!\");\r\n";
echo " history.back();\r\n";
echo "</script>";
exit;
} ?>
點(diǎn)擊下載class.phpmailer.php
和class.smtp.php
文件输涕。(提取密碼為:x6at)
前端代碼為:
<form id="frmEmail" name="frmEmail" action="./php/sendemailPHPMail.php" method="post">
<div class="col-md-6 text-box">
<input name="name" type="text" placeholder="姓名昵稱(chēng)" />
<input name="phone" type="text" placeholder="電話(huà)or郵箱" />
<input name="theme" type="text" placeholder="用途" />
<input name="kind" type="text" placeholder="風(fēng)格" />
</div>
<div class="col-md-6 textarea">
<textarea name="content">內(nèi)容</textarea>
</div>
<div class="clearfix"> </div><br />
<input class="btn btn-primary btn-red-lg" type="submit" onClick="toOutLook()" value="提交" />
</form>
后記
被官方教程給坑了一下(╯︵╰),下次要注意慨畸。這里Mark一下( ̄▽?zhuān)?/莱坎。
附另一種smtp郵件發(fā)送方法:php利用smtp類(lèi)輕松的發(fā)送電子郵件,該方法沒(méi)有在阿里云服務(wù)器測(cè)試寸士,不過(guò)本地測(cè)試通過(guò)(PHP高于5.3使用時(shí)會(huì)有問(wèn)題)檐什。