新奥资料免费精准期期准,2024新澳天天资料免费大全,澳门六开彩天天正版免费,澳门天天六开彩正版澳门,最准一肖一码一一中特

您的位置:首页技术文章

PHP laravel使用自定义邮件类实现发送邮件

浏览:9日期:2023-04-15 21:18:57

当登录邮箱为腾讯企业邮箱的时候。

Phpmailer发送邮件就不好用了,具体哪里不好用,我没真没找到。

但是,邮件得发啊,怎么办呢?

我这里搞了一个自定义的发送邮件类,腾讯企业邮箱也可用。

但是,邮件发送失败,不会返回报错信息,这个可能是有点坑。

源码如下:

<?php
?
namespace?App\Extend;
use?Exception;
/**
?*?一个简单的PHP?SMTP?发送邮件类
?*/
?
class?SmtpMail
{
????/**
?????*?@var?string?邮件传输代理用户名
?????*?@access?private
?????*/
????private?$_userName;
?
????/**
?????*?@var?string?邮件传输代理密码
?????*?@access?private
?????*/
????private?$_password;
?
????/**
?????*?@var?string?邮件传输代理服务器地址
?????*?@access?private
?????*/
????private?$_sendServer;
?
????/**
?????*?@var?int?邮件传输代理服务器端口
?????*?@access?private
?????*/
????private?$_port;
?
????/**
?????*?@var?string?发件人
?????*?@access?protected
?????*/
????protected?$_from;
?
????/**
?????*?@var?string?收件人
?????*?@access?protected
?????*/
????protected?$_to;
?
????/**
?????*?@var?string?抄送
?????*?@access?protected
?????*/
????protected?$_cc;
?
????/**
?????*?@var?string?秘密抄送
?????*?@access?protected
?????*/
????protected?$_bcc;
?
????/**
?????*?@var?string?主题
?????*?@access?protected
?????*/
????protected?$_subject;
?
????/**
?????*?@var?string?邮件正文
?????*?@access?protected
?????*/
????protected?$_body;
?
????/**
?????*?@var?string?附件
?????*?@access?protected
?????*/
????protected?$_attachment;
?
????/**
?????*?@var?reource?socket资源
?????*?@access?protected
?????*/
????protected?$_socket;
?
????/**
?????*?@var?reource?是否是安全连接
?????*?@access?protected
?????*/
????protected?$_isSecurity;
?
????/**
?????*?@var?string?错误信息
?????*?@access?protected
?????*/
????protected?$_errorMessage;
?
????protected?$_debug?=?false;
????/*输出调试信息*/
????private?function?debug($msg)
????{
????????if?($this->_debug)?{
????????????echo?$msg,?"<br>",?"\n";
????????}
????}
????public?function?setDebug($val?=?true)
????{
????????$this->_debug?=?$val;
????}
?
????/**
?????*?设置邮件传输代理,如果是可以匿名发送有邮件的服务器,只需传递代理服务器地址就行
?????*?@access?public
?????*?@param?string?$server?代理服务器的ip或者域名
?????*?@param?string?$username?认证账号
?????*?@param?string?$password?认证密码
?????*?@param?int?$port?代理服务器的端口,smtp默认25号端口
?????*?@param?boolean?$isSecurity?到服务器的连接是否为安全连接,默认false
?????*?@return?boolean
?????*/
????public?function?setServer($server,?$username?=?"",?$password?=?"",?$port?=?25,?$isSecurity?=?false)
????{
????????$this->_sendServer?=?$server;
????????$this->_port?=?$port;
????????$this->_isSecurity?=?$isSecurity;
????????$this->_userName?=?empty($username)???""?:?base64_encode($username);
????????$this->_password?=?empty($password)???""?:?base64_encode($password);
????????return?true;
????}
?
????/**
?????*?设置发件人
?????*?@access?public
?????*?@param?string?$from?发件人地址
?????*?@return?boolean
?????*/
????public?function?setFrom($from)
????{
????????$this->_from?=?$from;
????????return?true;
????}
?
????/**
?????*?设置收件人,多个收件人,调用多次.
?????*?@access?public
?????*?@param?string?$to?收件人地址
?????*?@return?boolean
?????*/
????public?function?setReceiver($to)
????{
????????if?(isset($this->_to))?{
????????????if?(is_string($this->_to))?{
????????????????$this->_to?=?array($this->_to);
????????????????$this->_to[]?=?$to;
????????????????return?true;
????????????}?elseif?(is_array($this->_to))?{
????????????????$this->_to[]?=?$to;
????????????????return?true;
????????????}?else?{
????????????????return?false;
????????????}
????????}?else?{
????????????$this->_to?=?$to;
????????????return?true;
????????}
????}
?
????/**
?????*?设置抄送,多个抄送,调用多次.
?????*?@access?public
?????*?@param?string?$cc?抄送地址
?????*?@return?boolean
?????*/
????public?function?setCc($cc)
????{
????????if?(isset($this->_cc))?{
????????????if?(is_string($this->_cc))?{
????????????????$this->_cc?=?array($this->_cc);
????????????????$this->_cc[]?=?$cc;
????????????????return?true;
????????????}?elseif?(is_array($this->_cc))?{
????????????????$this->_cc[]?=?$cc;
????????????????return?true;
????????????}?else?{
????????????????return?false;
????????????}
????????}?else?{
????????????$this->_cc?=?$cc;
????????????return?true;
????????}
????}
?
????/**
?????*?设置秘密抄送,多个秘密抄送,调用多次
?????*?@access?public
?????*?@param?string?$bcc?秘密抄送地址
?????*?@return?boolean
?????*/
????public?function?setBcc($bcc)
????{
????????if?(isset($this->_bcc))?{
????????????if?(is_string($this->_bcc))?{
????????????????$this->_bcc?=?array($this->_bcc);
????????????????$this->_bcc[]?=?$bcc;
????????????????return?true;
????????????}?elseif?(is_array($this->_bcc))?{
????????????????$this->_bcc[]?=?$bcc;
????????????????return?true;
????????????}?else?{
????????????????return?false;
????????????}
????????}?else?{
????????????$this->_bcc?=?$bcc;
????????????return?true;
????????}
????}
?
????/**
?????*?设置邮件附件,多个附件,调用多次
?????*?@access?public
?????*?@param?string?$file?文件地址
?????*?@return?boolean
?????*/
????public?function?addAttachment($file)
????{
????????if?(!file_exists($file))?{
????????????$this->_errorMessage?=?"file?"?.?$file?.?"?does?not?exist.";
????????????return?false;
????????}
????????if?(isset($this->_attachment))?{
????????????if?(is_string($this->_attachment))?{
????????????????$this->_attachment?=?array($this->_attachment);
????????????????$this->_attachment[]?=?$file;
????????????????return?true;
????????????}?elseif?(is_array($this->_attachment))?{
????????????????$this->_attachment[]?=?$file;
????????????????return?true;
????????????}?else?{
????????????????return?false;
????????????}
????????}?else?{
????????????$this->_attachment?=?$file;
????????????return?true;
????????}
????}
?
????/**
?????*?设置邮件信息
?????*?@access?public
?????*?@param?string?$body?邮件主题
?????*?@param?string?$subject?邮件主体内容,可以是纯文本,也可是是HTML文本
?????*?@return?boolean
?????*/
????public?function?setMail($subject,?$body)
????{
????????$this->_subject?=?$subject;
????????$this->_body?=?base64_encode($body);
????????return?true;
????}
?
????/**
?????*?发送邮件
?????*?@access?public
?????*?@return?boolean
?????*/
????public?function?send()
????{
????????$command?=?$this->getCommand();
?
????????$this->_isSecurity???$this->socketSecurity()?:?$this->socket();
?
????????foreach?($command?as?$value)?{
????????????$result?=?$this->_isSecurity???$this->sendCommandSecurity($value[0],?$value[1])?:?$this->sendCommand($value[0],?$value[1]);
????????????if?($result)?{
????????????????continue;
????????????}?else?{
????????????????return?false;
????????????}
????????}
?
????????//其实这里也没必要关闭,smtp命令:QUIT发出之后,服务器就关闭了连接,本地的socket资源会自动释放
????????$this->_isSecurity???$this->closeSecutity()?:?$this->close();
????????return?true;
????}
?
????/**
?????*?返回错误信息
?????*?@return?string
?????*/
????public?function?error()
????{
????????if?(!isset($this->_errorMessage))?{
????????????$this->_errorMessage?=?"";
????????}
????????return?$this->_errorMessage;
????}
?
????/**
?????*?返回mail命令
?????*?@access?protected
?????*?@return?array
?????*/
????protected?function?getCommand()
????{
????????$separator?=?"----=_Part_"?.?md5($this->_from?.?time())?.?uniqid();?//分隔符
?
????????$command?=?array(
????????????array("HELO?sendmail\r\n",?250)
????????);
????????if?(!empty($this->_userName))?{
????????????$command[]?=?array("AUTH?LOGIN\r\n",?334);
????????????$command[]?=?array($this->_userName?.?"\r\n",?334);
????????????$command[]?=?array($this->_password?.?"\r\n",?235);
????????}
?
????????//设置发件人
????????$command[]?=?array("MAIL?FROM:?<"?.?$this->_from?.?">\r\n",?250);
????????$header?=?"FROM:?<"?.?$this->_from?.?">\r\n";
?
????????//设置收件人
????????if?(is_array($this->_to))?{
????????????$count?=?count($this->_to);
????????????for?($i?=?0;?$i?<?$count;?$i++)?{
????????????????$command[]?=?array("RCPT?TO:?<"?.?$this->_to[$i]?.?">\r\n",?250);
????????????????if?($i?==?0)?{
????????????????????$header?.=?"TO:?<"?.?$this->_to[$i]?.?">";
????????????????}?elseif?($i?+?1?==?$count)?{
????????????????????$header?.=?",<"?.?$this->_to[$i]?.?">\r\n";
????????????????}?else?{
????????????????????$header?.=?",<"?.?$this->_to[$i]?.?">";
????????????????}
????????????}
????????}?else?{
????????????$command[]?=?array("RCPT?TO:?<"?.?$this->_to?.?">\r\n",?250);
????????????$header?.=?"TO:?<"?.?$this->_to?.?">\r\n";
????????}
?
????????//设置抄送
????????if?(isset($this->_cc))?{
????????????if?(is_array($this->_cc))?{
????????????????$count?=?count($this->_cc);
????????????????for?($i?=?0;?$i?<?$count;?$i++)?{
????????????????????$command[]?=?array("RCPT?TO:?<"?.?$this->_cc[$i]?.?">\r\n",?250);
????????????????????if?($i?==?0)?{
????????????????????????$header?.=?"CC:?<"?.?$this->_cc[$i]?.?">";
????????????????????}?elseif?($i?+?1?==?$count)?{
????????????????????????$header?.=?",<"?.?$this->_cc[$i]?.?">\r\n";
????????????????????}?else?{
????????????????????????$header?.=?",<"?.?$this->_cc[$i]?.?">";
????????????????????}
????????????????}
????????????}?else?{
????????????????$command[]?=?array("RCPT?TO:?<"?.?$this->_cc?.?">\r\n",?250);
????????????????$header?.=?"CC:?<"?.?$this->_cc?.?">\r\n";
????????????}
????????}
?
????????//设置秘密抄送
????????if?(isset($this->_bcc))?{
????????????if?(is_array($this->_bcc))?{
????????????????$count?=?count($this->_bcc);
????????????????for?($i?=?0;?$i?<?$count;?$i++)?{
????????????????????$command[]?=?array("RCPT?TO:?<"?.?$this->_bcc[$i]?.?">\r\n",?250);
????????????????????if?($i?==?0)?{
????????????????????????$header?.=?"BCC:?<"?.?$this->_bcc[$i]?.?">";
????????????????????}?elseif?($i?+?1?==?$count)?{
????????????????????????$header?.=?",<"?.?$this->_bcc[$i]?.?">\r\n";
????????????????????}?else?{
????????????????????????$header?.=?",<"?.?$this->_bcc[$i]?.?">";
????????????????????}
????????????????}
????????????}?else?{
????????????????$command[]?=?array("RCPT?TO:?<"?.?$this->_bcc?.?">\r\n",?250);
????????????????$header?.=?"BCC:?<"?.?$this->_bcc?.?">\r\n";
????????????}
????????}
?
????????//主题
????????$header?.=?"Subject:?"?.?$this->_subject?.?"\r\n";
????????if?(isset($this->_attachment))?{
????????????//含有附件的邮件头需要声明成这个
????????????$header?.=?"Content-Type:?multipart/mixed;\r\n";
????????}?elseif?(false)?{
????????????//邮件体含有图片资源的需要声明成这个
????????????$header?.=?"Content-Type:?multipart/related;\r\n";
????????}?else?{
????????????//html或者纯文本的邮件声明成这个
????????????$header?.=?"Content-Type:?multipart/alternative;\r\n";
????????}
?
????????//邮件头分隔符
????????$header?.=?"\t"?.?"boundary=""?.?$separator?.?""";
????????$header?.=?"\r\nMIME-Version:?1.0\r\n";
????????$header?.=?"\r\n--"?.?$separator?.?"\r\n";
????????$header?.=?"Content-Type:text/html;?charset=utf-8\r\n";
????????$header?.=?"Content-Transfer-Encoding:?base64\r\n\r\n";
????????$header?.=?$this->_body?.?"\r\n";
????????$header?.=?"--"?.?$separator?.?"\r\n";
?
????????//加入附件
????????if?(isset($this->_attachment)?&&?!empty($this->_attachment))?{
????????????if?(is_array($this->_attachment))?{
????????????????$count?=?count($this->_attachment);
????????????????for?($i?=?0;?$i?<?$count;?$i++)?{
????????????????????$header?.=?"\r\n--"?.?$separator?.?"\r\n";
????????????????????$header?.=?"Content-Type:?"?.?$this->getMIMEType($this->_attachment[$i])?.?";?name=""?.?basename($this->_attachment[$i])?.?"""?.?"\r\n";
????????????????????$header?.=?"Content-Transfer-Encoding:?base64\r\n";
????????????????????$header?.=?"Content-Disposition:?attachment;?filename=""?.?basename($this->_attachment[$i])?.?"""?.?"\r\n";
????????????????????$header?.=?"\r\n";
????????????????????$header?.=?$this->readFile($this->_attachment[$i]);
????????????????????$header?.=?"\r\n--"?.?$separator?.?"\r\n";
????????????????}
????????????}?else?{
????????????????$header?.=?"\r\n--"?.?$separator?.?"\r\n";
????????????????$header?.=?"Content-Type:?"?.?$this->getMIMEType($this->_attachment)?.?";?name=""?.?basename($this->_attachment)?.?"""?.?"\r\n";
????????????????$header?.=?"Content-Transfer-Encoding:?base64\r\n";
????????????????$header?.=?"Content-Disposition:?attachment;?filename=""?.?basename($this->_attachment)?.?"""?.?"\r\n";
????????????????$header?.=?"\r\n";
????????????????$header?.=?$this->readFile($this->_attachment);
????????????????$header?.=?"\r\n--"?.?$separator?.?"\r\n";
????????????}
????????}
?
????????//结束邮件数据发送
????????$header?.=?"\r\n.\r\n";
?
????????$command[]?=?array("DATA\r\n",?354);
????????$command[]?=?array($header,?250);
????????$command[]?=?array("QUIT\r\n",?221);
?
????????return?$command;
????}
?
????/**
?????*?发送命令
?????*?@access?protected
?????*?@param?string?$command?发送到服务器的smtp命令
?????*?@param?int?$code?期望服务器返回的响应吗
?????*?@return?boolean
?????*/
????protected?function?sendCommand($command,?$code)
????{
????????//debug("Send?command:"?.?$command?.?",expected?code:"?.?$code?);
????????//发送命令给服务器
????????try?{
????????????if?(socket_write($this->_socket,?$command,?strlen($command)))?{
?
????????????????//当邮件内容分多次发送时,没有$code,服务器没有返回
????????????????if?(empty($code))?{
????????????????????return?true;
????????????????}
?
????????????????//读取服务器返回
????????????????$data?=?trim(socket_read($this->_socket,?1024));
????????????????//debug(?"response:"?.?$data);
?
????????????????if?($data)?{
????????????????????$pattern?=?"/^"?.?$code?.?"/";
????????????????????if?(preg_match($pattern,?$data))?{
????????????????????????return?true;
????????????????????}?else?{
????????????????????????$this->_errorMessage?=?"Error:"?.?$data?.?"|**|?command:";
????????????????????????return?false;
????????????????????}
????????????????}?else?{
????????????????????$this->_errorMessage?=?"Error:"?.?socket_strerror(socket_last_error());
????????????????????return?false;
????????????????}
????????????}?else?{
????????????????$this->_errorMessage?=?"Error:"?.?socket_strerror(socket_last_error());
????????????????return?false;
????????????}
????????}?catch?(Exception?$e)?{
????????????$this->_errorMessage?=?"Error:"?.?$e->getMessage();
????????}
????}
?
????/**
?????*?发送命令
?????*?@access?protected
?????*?@param?string?$command?发送到服务器的smtp命令
?????*?@param?int?$code?期望服务器返回的响应吗
?????*?@return?boolean
?????*/
????protected?function?sendCommandSecurity($command,?$code)
????{
????????//debug("Send?command:"?.?$command?.?",expected?code:"?.?$code?);
????????try?{
????????????if?(fwrite($this->_socket,?$command))?{
????????????????//当邮件内容分多次发送时,没有$code,服务器没有返回
????????????????if?(empty($code))?{
????????????????????return?true;
????????????????}
????????????????//读取服务器返回
????????????????$data?=?trim(fread($this->_socket,?1024));
????????????????//debug(?"response:"?.?$data?);
?
????????????????if?($data)?{
????????????????????$pattern?=?"/^"?.?$code?.?"/";
????????????????????if?(preg_match($pattern,?$data))?{
????????????????????????return?true;
????????????????????}?else?{
????????????????????????$this->_errorMessage?=?"Error:"?.?$data?.?"|**|?command:";
????????????????????????return?false;
????????????????????}
????????????????}?else?{
????????????????????return?false;
????????????????}
????????????}?else?{
????????????????$this->_errorMessage?=?"Error:?"?.?$command?.?"?send?failed";
????????????????return?false;
????????????}
????????}?catch?(Exception?$e)?{
????????????$this->_errorMessage?=?"Error:"?.?$e->getMessage();
????????}
????}
?
????/**
?????*?读取附件文件内容,返回base64编码后的文件内容
?????*?@access?protected
?????*?@param?string?$file?文件
?????*?@return?mixed
?????*/
????protected?function?readFile($file)
????{
????????if?(file_exists($file))?{
????????????$file_obj?=?file_get_contents($file);
????????????return?base64_encode($file_obj);
????????}?else?{
????????????$this->_errorMessage?=?"file?"?.?$file?.?"?dose?not?exist";
????????????return?false;
????????}
????}
?
????/**
?????*?获取附件MIME类型
?????*?@access?protected
?????*?@param?string?$file?文件
?????*?@return?mixed
?????*/
????protected?function?getMIMEType($file)
????{
????????if?(file_exists($file))?{
????????????$mime?=?mime_content_type($file);
????????????if?(!preg_match("/gif|jpg|png|jpeg/",?$mime))?{
????????????????$mime?=?"application/octet-stream";
????????????}
????????????return?$mime;
????????}?else?{
????????????return?false;
????????}
????}
?
????/**
?????*?建立到服务器的网络连接
?????*?@access?private
?????*?@return?boolean
?????*/
????private?function?socket()
????{
????????//创建socket资源
????????$this->_socket?=?socket_create(AF_INET,?SOCK_STREAM,?getprotobyname("tcp"));
?
????????if?(!$this->_socket)?{
????????????$this->_errorMessage?=?socket_strerror(socket_last_error());
????????????return?false;
????????}
?
????????socket_set_block($this->_socket);?//设置阻塞模式
?
????????//连接服务器
????????if?(!socket_connect($this->_socket,?$this->_sendServer,?$this->_port))?{
????????????$this->_errorMessage?=?socket_strerror(socket_last_error());
????????????return?false;
????????}
????????$str?=?socket_read($this->_socket,?1024);
????????if?(!strpos($str,?"220"))?{
????????????$this->_errorMessage?=?$str;
????????????return?false;
????????}
?
????????return?true;
????}
?
????/**
?????*?建立到服务器的SSL网络连接
?????*?@access?private
?????*?@return?boolean
?????*/
????private?function?socketSecurity()
????{
????????$remoteAddr?=?"tcp://"?.?$this->_sendServer?.?":"?.?$this->_port;
????????$this->_socket?=?stream_socket_client($remoteAddr,?$errno,?$errstr,?30);
????????if?(!$this->_socket)?{
????????????$this->_errorMessage?=?$errstr;
????????????return?false;
????????}
?
????????//设置加密连接,默认是ssl,如果需要tls连接,可以查看php手册stream_socket_enable_crypto函数的解释
????????stream_socket_enable_crypto($this->_socket,?true,?STREAM_CRYPTO_METHOD_SSLv23_CLIENT);
?
????????stream_set_blocking($this->_socket,?1);?//设置阻塞模式
????????$str?=?fread($this->_socket,?1024);
????????if?(!strpos($str,?"220"))?{
????????????$this->_errorMessage?=?$str;
????????????return?false;
????????}
?
????????return?true;
????}
?
????/**
?????*?关闭socket
?????*?@access?private
?????*?@return?boolean
?????*/
????private?function?close()
????{
????????if?(isset($this->_socket)?&&?is_object($this->_socket))?{
????????????$this->_socket->close();
????????????return?true;
????????}
????????$this->_errorMessage?=?"No?resource?can?to?be?close";
????????return?false;
????}
?
????/**
?????*?关闭安全socket
?????*?@access?private
?????*?@return?boolean
?????*/
????private?function?closeSecutity()
????{
????????if?(isset($this->_socket)?&&?is_object($this->_socket))?{
????????????stream_socket_shutdown($this->_socket,?STREAM_SHUT_WR);
????????????return?true;
????????}
????????$this->_errorMessage?=?"No?resource?can?to?be?close";
????????return?false;
????}
}

关于laravel5.8框架如何引入第三方类库,请参考下文补充内容 laravel8大同小异。

调用方法:

/**
?????*?@name:?发送邮件方法
?????*?@author:?camellia
?????*?@date:?2021-01-19?
?????*?@param:??$email??string??发送给谁
?????*?@param:??$mail_title?string??邮件标题
?????*?@param:??$mail_body??string??邮件内容
?????*?@return:?$result?bool????true/false
?????*/
????public?function?send_mail($email,?$mail_title,?$mail_body)
????{
????????$mail?=?new?SmtpMail();
????????$mail->setServer(EMAIL_SERVER,?SEND_EMAIL,?EMAIL_SECERT,?465,?true);?//参数1(qq邮箱使用smtp.qq.com,qq企业邮箱使用smtp.exmail.qq.com),参数2(邮箱登陆账号),参数3(邮箱登陆密码,也有可能是独立密码,就是开启pop3/smtp时的授权码),参数4(默认25,腾云服务器屏蔽25端口,所以用的465),参数5(是否开启ssl,用465就得开启)//$mail->setServer("XXXXX",?"joffe@XXXXX",?"XXXXX",?465,?true);
????????$mail->setFrom(SEND_EMAIL,"时间里的博客");?//发送者邮箱
????????$mail->setReceiver($email);?//接收者邮箱
????????$mail->addAttachment("");?//Attachment?附件,不用可注释
????????$mail->setMail($mail_title,?$mail_body);?//标题和内容
????????$result?=?$mail->send();?//可以var_dump一下,发送成功会返回true,失败false
????????return?$result;//*/
????}

代码亲测可用。

补充

laravel5.8引入第三方类库的方法详解

有需求需要使用PHPMailer发送邮件。

那么首先需要引入PHPMailer这个第三方的类库。我是这样做的:

1:在app目录下新建Extend目录。如下图所示:

将PHPMailer放入Extend目录下。如下图所示

2:修改项目根目录下的composer.json文件

"autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories",
            "app/Extend/PHPMailer/src"
        ]
    },

添加你第三方类库的位置到autoload中

3:执行composer命令,在网站根目录下:

composer dump-autoload

4:调用:

(1):使用命名空间

use PHPMailer\src\PHPMailer;

(2):调用

 //实例化PHPMailer核心类
$mail = new PHPMailer();

如果报错,就在实例化前边加一个转义符\

至此,laravel引入第三方类库成功。

以上就是PHP laravel使用自定义邮件类实现发送邮件的详细内容,更多关于PHP laravel发送邮件的资料请关注其它相关文章!

标签: PHP