이 기사의 예에서는 PHP가 소켓을 기반으로 이메일을 보내기 위해 SMTP를 구현하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
php는 소켓을 사용하여 SMTP를 통해 이메일을 보냅니다.
php의 php-sockets 확장을 사용하면 일반 텍스트 및 html 형식으로 이메일을 보낼 수 있습니다. 코드는 다음과 같습니다.
/**
* 이메일 보내기 수업
* 일반 텍스트 이메일 및 HTML 형식 이메일 전송 지원
* @예제
* $config = 배열(
* "from" => "*****",
* "에" => "***",
* "주제" => "테스트",
* "본문" => "테스트>",
* "사용자 이름" => "***",
* "비밀번호" => "****",
* "isHTML" => 참
* );
*
* $mail = 새로운 MySendMail();
*
* $mail->setServer("smtp.126.com");
*
* $mail->setMailInfo($config);
* if(!$mail->sendMail()) {
* echo $mail->error();
* 1을 반환;
* }
*/
MySendMail 클래스 {
/**
* @var 메일 전송 에이전트 사용자 이름
* @액세스 비공개
*/
개인 $_userName;
/**
* @var 메일 전송 에이전트 비밀번호
* @액세스 비공개
*/
개인 $_password;
/**
* @var 메일 전송 프록시 서버 주소
* @접속 보호됨
*/
보호된 $_sendServer;
/**
* @var 메일 전송 프록시 서버 포트
* @접속 보호됨
*/
보호됨 $_port=25;
/**
* @var 발신자
* @접속 보호됨
*/
$_from;
보호됨
/**
* @var 수신자
* @접속 보호됨
*/
보호된 $_to;
/**
* @var 테마
* @접속 보호됨
*/
보호된 $_subject;
/**
* @var 이메일 내용
* @접속 보호됨
*/
보호된 $_body;
/**
* @var HTML 형식의 이메일인가요
* @접속 보호됨
*/
보호됨 $_isHTML=false;
/**
* @var 소켓 리소스
* @접속 보호됨
*/
보호된 $_socket;
/**
* @var 오류 메시지
* @접속 보호됨
*/
보호된 $_errorMessage;
공개 함수 __construct($from="", $to="", $subject="", $body="", $server="", $username="", $password="",$isHTML=" ", $port="") {
if(!empty($from)){
$this->_from = $from;
}
if(!empty($to)){
$this->_to = $to;
}
if(!empty($subject)){
$this->_subject = $subject;
}
if(!empty($body)){
$this->_body = $body;
}
if(!empty($isHTML)){
$this->_isHTML = $isHTML;
}
if(!empty($server)){
$this->_sendServer = $서버;
}
if(!empty($port)){
$this->_port = $port;
}
if(!empty($username)){
$this->_userName = $username;
}
if(!empty($password)){
$this->_password = $password;
}
}
/**
* 메일 전송 에이전트 설정
* @param string $server 프록시 서버의 IP 또는 도메인 이름
* @param int $port 프록시 서버의 포트, SMTP 기본 포트 25
* @param int $localPort 로컬 포트
* @return 부울
*/
공용 함수 setServer($server, $port=25) {
if(!isset($server) || 비어 있음($server) || !is_string($server)) {
$this->_errorMessage = "첫 번째 매개변수가 유효하지 않습니다.";
false를 반환합니다.
}
if(!is_numeric($port)){
$this->_errorMessage = "처음 두 개는 잘못된 매개변수입니다.";
false를 반환합니다.
}
$this->_sendServer = $서버;
$this->_port = $port;
true를 반환합니다.
}
/**
* 이메일 설정
* @접속공개
* @param array $config 이메일 구성 정보
* 이메일 발신자, 수신자, 제목, 내용, 이메일 전송 담당자의 확인 정보가 포함되어 있습니다
* @return 부울
*/
공개 함수 setMailInfo($config) {
if(!is_array($config) || count($config) < 6){
$this->_errorMessage = "매개변수가 필요합니다";
false를 반환합니다.
}
$this->_from = $config['from'];
$this->_to = $config['to'];
$this->_subject = $config['subject'];
$this->_body = $config['body'];
$this->_userName = $config['사용자 이름'];
$this->_password = $config['password'];
if(isset($config['isHTML'])){
$this->_isHTML = $config['isHTML'];
}
true를 반환합니다.
}
/**
* 이메일 보내기
* @접속공개
* @return 부울
*/
공개 함수 sendMail() {
$command = $this->getCommand();
$this->소켓();
foreach($command를 $value로) {
if($this->sendCommand($value[0], $value[1])) {
계속;
}
그렇지 않으면{
false를 반환합니다.
}
}
$this->close(); //其实这里也没必要关闭,smtp命令:QUIT发信后,服务器就关闭了连接,本地적소켓资源会自动释放
echo '메일 OK!';
true를 반환합니다.
}
/**
* 반환 오류 메시지
* @return 문자열
*/
공개 함수 오류(){
if(!isset($this->_errorMessage)) {
$this->_errorMessage = "";
}
$this->_errorMessage;
반환
}
/**
* 메일 명령어로 돌아가기
* @접속 보호됨
* @return 배열
*/
보호된 함수 getCommand() {
if($this->_isHTML) {
$mail = "MIME 버전:1.0rn";
$mail .= "콘텐츠 유형:텍스트/html;charset=utf-8rn";
$mail .= "FROM:테스트<" . $this->_from . ">rn";
$mail .= "받는 사람:<" . $this->_to . ">rn";
$mail .= "제목:" . $this->_subject ."rnrn";
$mail .= $this->_body . "rn.rn";
}
그렇지 않으면{
$mail = "FROM:테스트<" . $this->_from . ">rn";
$mail .= "받는 사람:<" . $this->_to . ">rn";
$mail .= "제목:" . $this->_subject ."rnrn";
$mail .= $this->_body . "rn.rn";
}
$명령 = 배열(
array("HELO sendmailrn", 250),
array("AUTH LOGINrn", 334),
array(base64_encode($this->_userName) . "rn", 334),
array(base64_encode($this->_password) . "rn", 235),
array("MAIL FROM:<" . $this->_from . ">rn", 250),
array("RCPT TO:<" . $this->_to . ">rn", 250),
array("DATArn", 354),
배열($mail, 250),
array("QUITrn", 221)
);
$명령을 반환하세요;
}
/**
* @접속 보호됨
* @param string $command 서버로 보낸 SMTP 명령
* @param int $code 서버에서 응답이 반환될 것으로 예상하십니까
* @param 부울
*/
보호된 함수 sendCommand($command, $code) {
echo '명령 보내기:' . $ 명령 . ',예상 코드:' . $코드 . '
';
//发送命令给服务器
시도해 보세요{
if(socket_write($this->_socket, $command, strlen($command))){
//读取服务器返回
$data = 트림(socket_read($this->_socket, 1024));
에코 '응답:' . $데이터 . '
';
if($data) {
$pattern = "/^".$code."/";
if(preg_match($pattern, $data)) {
true를 반환합니다.
}
그렇지 않으면{
$this->_errorMessage = "오류:" . $데이터 . "|**| 명령:";
false를 반환합니다.
}
}
그렇지 않으면{
$this->_errorMessage = "오류:" . 소켓_strerror(socket_last_error());
false를 반환합니다.
}
}
그렇지 않으면{
$this->_errorMessage = "오류:" . 소켓_strerror(socket_last_error());
false를 반환합니다.
}
}catch(예외 $e) {
$this->_errorMessage = "오류:" . $e->getMessage();
}
}
/**
* 서버에 네트워크 연결을 설정하세요
* @액세스 비공개
* @return 부울
*/
개인 함수 소켓() {
if(!function_exists("socket_create")) {
$this->_errorMessage = "php-socket 확장 기능을 활성화해야 합니다";
false를 반환합니다.
}
//소켓소켓
$this->_socket = 소켓_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
if(!$this->_socket) {
$this->_errorMessage = 소켓_strerror(socket_last_error());
false를 반환합니다.
}
//连接服务器
if(!socket_connect($this->_socket, $this->_sendServer, $this->_port)) {
$this->_errorMessage = 소켓_strerror(socket_last_error());
false를 반환합니다.
}
소켓_read($this->_socket, 1024);
true를 반환합니다.
}
/**
* 소켓
* @액세스 비공개
* @return 부울
*/
개인 함수 close() {
if(isset($this->_socket) && is_object($this->_socket)) {
$this->_socket->close();
true를 반환합니다.
}
$this->_errorMessage = "가까울 수 있는 리소스가 없습니다.";
false를 반환합니다.
}
}
/**************************** 시험 *********************** ************/
$config = 배열(
"에서" => "XXXXX",
"에" => "XXXXX",
"주제" => "테스트",
"본체" => "테스트",
"사용자 이름" => "XXXXX",
"비밀번호" => "********",
//"isHTML" => 사실
);
$mail = 새로운 MySendMail();
$mail->setServer("smtp.126.com");
$mail->setMailInfo($config);
if(!$mail->sendMail()) {
echo $mail->error();
1을 반환;
}
希望本文所述对大家程序设计有所帮助。