이 기사의 예에서는 Gmail을 통해 이메일을 보내는 phplist 및 phpmailer의 구성 방법을 설명합니다. 참고하실 수 있도록 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.
일반적으로 Gmail 사서함을 사용하지 않는 한 phplist를 사용하여 이메일을 보내는 것은 이전 "PHP 대량 메일 시스템의 phplist 구성 방법에 대한 자세한 요약". 하지만 나처럼 운이 좋지 않아 Gmail과 같은 SSL 확인이 포함된 이메일을 사용해야 한다면 축하합니다. 며칠 간의 노력 끝에 마침내 gmail과 phplist를 성공적으로 결합했습니다. 저와 같은 상황에 있는 모든 동지들에게 도움이 되길 바라면서 제 경험을 이곳에서 공유하고 있습니다. 그리고 phplist의 핵심은 phpmailer인데 제가 제안한 솔루션은 주로 phpmailer를 중심으로 진행되기 때문에 Gmail을 통해 이메일을 보내기 위해 phpmailer를 사용해야 하는데 성공하지 못하는 분들도 제 방법을 참고하시면 될 것 같습니다.
먼저 "SMTP 서버에 연결되어 있지 않다는 것을 알고 있다면 또 다른 유명한 오픈 소스 소프트웨어인 phpmailer인 phplist 이메일 전송의 핵심에 문제가 있다는 의미입니다.온라인에서 Gmail 이메일을 보내는 phpmailer에 대한 정보를 확인한 결과, 사람들이 이전 버전의 phpmailer가 SSL 확인을 지원하지 않고 Gmail의 SMTP 서버에 연결할 수 없다고 말하는 것을 발견했습니다. 이 문제는 phpmailer의 새 버전에서 해결되었습니다.
lists/admin/phpmailer/ChangeLog.txt를 열고 최신 버전의 phplist가 2005년에 출시된 phpmailer 버전 1.73과 함께 제공되는 것을 확인하세요. 이는 실제로 새로운 것이 아닙니다. 그래서 phpmailer 공식 홈페이지에 가서 최신 5.1을 다운로드 받았습니다.
먼저 phpmailer의 새 버전이 SSL 확인 문제를 어떻게 해결하는지 연구하고 싶었기 때문에 함께 제공되는 문서 중 일부를 살펴보던 중 PHPMailer_v5.1/docs에서 use_gmail.txt를 발견했습니다. 관계자는 Gmail 문제에 더 많은 관심을 기울이고 사람들이 참고할 수 있도록 특별히 데모를 출시했습니다. 열어보면 그야말로 완전한 PHP 페이지 파일입니다. 기본적으로는 파일 확장자, 이메일 사용자 이름, 비밀번호만 수정하면 사용이 가능합니다. 하지만 이렇게만 수정하면 테스트 접속 시 오류가 발생합니다. 페이지의 공식 데모를 모릅니다. 실제로 정의되지 않은 함수를 호출하고 불필요한 구성 요소가 있는 경우 어떻게 이런 오류가 발생할 수 있습니까? 이메일이 정상적으로 전송되는지 테스트해보고 싶어서 다음과 같이 변경했습니다.
<?php // example on using PHPMailer with GMAIL include("class.phpmailer.php"); include("class.smtp.php"); // note, this is optional - gets called from main class if not already loaded $mail = new PHPMailer(); $body = "test"; $mail->IsSMTP(); $mail->SMTPAuth = true; // enable SMTP authentication $mail->SMTPSecure = "ssl"; // sets the prefix to the servier $mail->Host = "smtp.gmail.com"; // sets GMAIL as the SMTP server $mail->Port = 465; // set the SMTP port $mail->Username = "myname@gmail.com"; // GMAIL username $mail->Password = "mypassword"; // GMAIL password $mail->From = "myname@gmail.com"; $mail->FromName = "Webmaster"; $mail->Subject = "This is the subject"; $mail->AltBody = "This is the body when user views in plain text format"; //Text Body $mail->WordWrap = 50; // set word wrap $mail->MsgHTML($body); $mail->AddReplyTo("myname@gmail.com","Webmaster"); $mail->AddAddress("myname@gmail.com","First Last"); $mail->IsHTML(true); // send as HTML if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message has been sent"; } ?>
이때 문득 PHPMailer_v5.1/docs 밑에 Note_for_SMTP_debugging.txt라는 파일이 있다는 게 생각났어요. 이제 SMTP 서버에 접속이 안 될까봐 걱정되서 한번 살펴보는 게 좋을 것 같아요. 디버깅 방법이 제공됩니다.
파일을 열어서 첫줄을 읽어보니 눈이 번쩍 뜨이더라구요. 사실 사용법도 아주 간단해요
만 이용하시면 됩니다
$mail->IsSMTP();
$mail->SMTPDebug = 1;
이렇게 수정한 후 페이지 방문 시 더 자세한 지침을 받았습니다. - "SMTP -> 오류: 서버 연결 실패: 소켓 전송 "ssl"을 찾을 수 없습니다. - 활성화할 때 활성화하는 것을 잊었나요? PHP(28593608)를 구성했습니까?
그렇습니다. 그래서 PHP 구성 파일(C://Windows/php.ini)을 열고 ssl을 검색했는데, 당연히 ssl에 대한 확장자를 찾았습니다
;extension=php_openssl.dll
它没有被打开。去掉其前面用于注释的“;”,然后重启服务器,再次访问测试页面use_gmail.php,仍然是同样的错误提示。
没办法了,我上网查了一下关于php以及apache的ssl配置的文章,发现仅仅是将ssl扩展模块开启是不够的,还要对openssl进行配置,在Windows环境下配置方法倒是很简单——找到php安装目录下的ssleay32.dll和libeay32.dll,将这二者复制到windows下的system32目录中即可(在php.ini中开启extension=php_openssl.dll还是必要的)。当然,不想“污染”system32目录的同志们可以用修改环境变量的方法,只要让ssleay32.dll和libeay32.dll在系统路径下就可以了。(如果你使用的不是winidows操作系统,请上网查找针对你的操作系统的配置ssl的方法,应该不难找到)
这回再访问use_gmail.php发现可以成功发送了!
在此基础上,我们的phplist的问题也可以解决了:用新版phpmailer中的class.phpmailer.php和class.smtp.php覆盖lists/admin/phpmailer中的对应文件,然后修改lists/admin/class.phplistmailer.php中36行左右处的
$this->SMTPAuth = true; $this->Helo = getConfig("website"); $this->Host = PHPMAILERHOST;
为:
$this->IsSMTP(); # Add $this->SMTPAuth = true; $this->SMTPSecure = "ssl"; # Add $this->Helo = getConfig("website"); $this->Host = PHPMAILERHOST; $this->Port = 465 # Add
其中phpmailer默认端口号为25,是大多数smtp服务器的端口号,但是gmail使用的端口号是465,所以要重新设置。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《php操作office文档技巧总结(包括word,excel,access,ppt)》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。