>백엔드 개발 >PHP 튜토리얼 >PHP 검토: 이메일 보내기

PHP 검토: 이메일 보내기

不言
不言원래의
2018-04-16 14:42:511619검색

이 글은 주로 이메일 보내기에 대한 PHP 리뷰를 소개합니다. 이제는 모든 사람과 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.

전재할 때 글의 출처를 표시해 주세요: https://tlanyan.me /php- 리뷰...

PHP 리뷰 시리즈 목차

  • PHP 기본

  • 웹 요청

  • cookie

  • 웹 응답

  • session

  • 데이터베이스 운영

  • 암호화 및 암호 해독

  • Composer

  • 자신만의 Composer 패키지 만들기

이메일 보내기는 사용자 활성화 및 비밀번호 검색과 같은 웹사이트의 일반적인 기능입니다. 이 기사에서는 먼저 이메일 보내기와 관련된 개념을 검토한 다음 PHP를 사용하여 이메일을 보내기 위한 샘플 코드를 제공합니다.

문자 메시지 보내기

기능적으로 문자 메시지는 이메일과 유사하며 알림 및 보안 확인에 자주 사용됩니다. 문자 메시지를 보내려면 (기본적으로) 공급자에게 비용을 지불해야 하므로 SMS 공급자는 사용자가 액세스할 수 있는 명확한 문서와 사용하기 쉬운 인터페이스를 제공할 인센티브가 있습니다. 일반적으로 문자 메시지를 보내는 사람은 다음과 같습니다.

  1. Alibaba Big Fish, 집계 데이터 등과 같은 공급업체를 찾고 있습니다.

  2. 계정을 등록하고 appid 및 appkey를 받으세요.

  3. 템플릿 적용;

  4. 애플리케이션에 통합된 보기 인터페이스 문서

  5. API를 호출하여 문자 메시지를 보냅니다.

과정이 간단하고 이해하기 쉬우며, 접근 및 사용도 매우 편리합니다. 기본적으로 1~2시간 안에 연결 및 테스트가 가능합니다. 사용자는 통신 과정에서 메시지 인코딩 및 주소 지정과 같은 세부 사항을 고려할 필요가 없습니다. 단점은 비용을 지불해야 한다는 것입니다.

이메일은 일반적으로 무료 서비스이지만 관련 지원이 제대로 제공되지 않는다는 점도 이해해야 합니다. 다양한 프로그래밍 언어로 이메일을 보내기 위한 많은 클래스 라이브러리가 있습니다. 소스의 관점에서 보면 기본적으로 로컬 컴퓨터에서 보내는 것과 타사 이메일 서비스 제공업체에서 보내는 두 가지 범주로 나눌 수 있습니다. 이메일을 보내는 과정을 이해하기 위해 먼저 몇 가지 관련 개념을 소개하겠습니다.

관련 개념

인터넷에 노출되는 대부분의 사람들은 이메일 사용 경험이 있지만 기본적으로 이메일 클라이언트, 웹 페이지 및 공급자 개념에 국한됩니다. 개발자로서 이 섹션의 다음 개념을 이해하면 이메일 통신의 세부 사항을 숙지하는 데 더 도움이 됩니다.

MUA: 메일 사용자 에이전트, 메일 사용자 에이전트. 유저 에이전트(User Agent)는 개발 과정에서 자주 접하는 단어로, 주로 인간의 의도를 이해하고 사용자를 대신해 자원을 요청하는 도구를 일컫는다. 예를 들어, 브라우저는 가장 일반적으로 사용되는 사용자 에이전트로 HTTP/HTTPS 프로토콜 형식으로 웹 서버에 요청을 보내고 응답을 구문 분석하여 사용자에게 렌더링합니다. 이메일 사용자 에이전트는 일반적으로 Foxmail 및 Outlook과 같은 도구입니다. 사람들이 이메일을 작성한 후 형식에 따라 이메일 내용을 캡슐화하고 메일 서버와 통신합니다.

MTA

: 메일 전송 에이전트는 사용자가 이메일을 보내고 받는 데 도움을 주는 프로그램입니다. 자주 언급되는 메일 서버는 오픈 소스 프로그램인 sendmail, postfix, QMail 등을 의미합니다.

MRA

: 메일 수집 에이전트인 메일 검색 에이전트는 메일 서버에서 로컬로 사용자의 메일을 검색합니다. 메일 클라이언트는 일반적인 MRA입니다.

SMTP

: 단순 메일 전송 프로토콜, 단순 메일 전송 프로토콜. 사용자, 메일 서버 및 메일 서버는 모두 이 프로토콜을 사용하여 메일을 서로에게 전송합니다(기본값은 일반 텍스트이며 SSLTLS 암호화를 사용할 수 있음).

POP3/IMAP

: Post Office Protocol 버전 ​​3/Internet Message Access Protocol, Post Office Protocol 버전 ​​3 또는 네트워크 정보 액세스 프로토콜, 서버에서 메일을 얻기 위해 클라이언트가 사용하는 프로토콜. 사용자 A(163 메일함)가 사용자 B(Gmail 메일함)에게 편지를 보냅니다. 사용자 B가 편지를 받는 과정은 위의 개념과 관련됩니다. 프로세스와 개념적 관계는 다음과 같은 단순화된 다이어그램으로 표현할 수 있습니다.

用户A  --发送邮件--> 用户B
 M|S                 M|I
 U|M                 R|M
 A|T                 A|A
  |P                  |P
  v                   v
MTA(163)--转发(SMTP)->MTA(gmail)

참고: 위 그림은 이메일을 보내는 일반적인 프로세스를 보여줍니다. 기타 MSA, MDA, ESMTP, SMTPS 등이 전체 프로세스에 나타날 수 있지만 이메일 전송 및 수신에는 영향을 미치지 않습니다. 아래에 언급된 약어 및 개념에 대해서는 직접 확인하시기 바랍니다.

postfix

리눅스에서 이메일을 보내는 소프트웨어는 주로 sendmail과 postfix가 있는데, 위에서 언급한 것처럼 시스템 내에서 MTA/MDA(Mail Delivery Agent, Mail Delivery Agent) 역할을 합니다. 이는 사용자가 아웃바운드 이메일을 보내고 사용자의 편지함(기본 위치 /var/spool/mail/username)으로 전달된 이메일을 받는 데 도움이 됩니다.

sendmail은 매우 높은 평판을 얻은 오랜 전통의 이메일 소프트웨어입니다. 하지만 Wietse(Wiestse Zweitze Venema)는 이에 만족하지 않아 접미사를 생각해 냈습니다. postfix 명령은 sendmail과 (거의) 호환되지만 더 효율적이고 안전합니다(접미사 수정의 출처). 현재 대부분의 Linux 배포판에 대한 기본 이메일 보내기 및 받기 소프트웨어입니다. sendmail 대신 postfix를 사용하는 것이 좋습니다. 수년 전에 이 블로그에 sendmail 구성 방법에 대한 기사가 있었습니다. 당시 저는 어리고 무지했기 때문에 시간을 내어 해당 기사를 개정할 계획이었습니다.

postfix의 기본 구성 파일은 ​​/etc/postfix/main.cf입니다. 구성 파일은 완전히 주석 처리되어 있으며 옵션은 기본적으로 설명이 필요합니다. 가장 중요한 구성은 myhostname, myorigin, inet_interfaces, inet_protocolsmydestination입니다. code> (외부 네트워크로부터 편지를 받으려는 경우). inet_interfaceslocalhost로 구성된 경우 inet_protocols의 값은 ipv4여야 하며, 그렇지 않으면 postfix: fatal과 같은 값이어야 합니다. : inet_interfaces 매개변수가 나타날 수 있습니다. ::1 오류 메시지에 대한 로컬 인터페이스를 찾을 수 없습니다. /etc/postfix/main.cf,配置文件的注释非常全,选项基本是自解释的。最重要的几个配置是:myhostnamemyorigininet_interfacesinet_protocols以及mydestination(如果你打算收外网来信的话)。需要注意inet_interfaces配置为localhost时,inet_protocols的值应为ipv4,否则可能会出现类似postfix: fatal: parameter inet_interfaces: no local interface found for ::1的错误提示。

与邮件相关的几个常用postfix命令是:

  1. mailmailx,发送邮件。tlanyan用户向root发送邮件:mail -s "Greetings" root@localhost -r tlanyan@localhost,接着终端中输入A nice day!,然后回车,按ctrl+D结束正文编辑,邮件就已经发送出去。登录到root账号,会提示在/var/spool/mail/root中有新邮件。用tail或者其他命令可查看邮件的详细信息。

  2. postquque,查看邮件发送队列。postqueue -p可取代sendmail中的mailq命令,postqueue -f刷新队列(强制尝试发送队列中的邮件)。

  3. postcat,查看未发送邮件的信息。例如postcat -q xxxx(xxxx是postqueue或者mailq显示的未发送队列ID)可查看邮件的详细信息,postcat -b -q xxxxx只查看邮件正文。

  4. postsuper,超级用户才可使用的邮件管理程序。postsuper -d xxxx,删除队列ID为xxxxx的邮件;postsuper -h xxxxx,暂停队列ID为xxxx的邮件发送,等。

以上介绍对于发送邮件基本已足够。注意,mail命令发送的邮件能投递的前提是postfix正在运行(ps aux | grep postfix | grep -v grep输出不为空)。

有了postfix,配置好后可以对外发送邮件,也能收取外网发送过来的邮件,但限于命令行操作。想用foxmail等客户端收发邮件,需要让服务器支持POP3/IMAP协议。开源的dovecot可以实现这个功能。dovecot服务于收邮件而非发送,了解其对开发中的帮助不大。如果想搭建一套完整的邮件系统(包括网页端支持、垃圾邮件过滤、病毒查杀、传输加密等),建议参考或使用国产开源的 EwoMail。

了解postfix对开发中发送邮件帮助有多大?说实话,几乎没有帮助。原因是为了防止垃圾邮件泛滥,各大云服务器厂商屏蔽了25端口(Google Cloud连465都干掉了)。亚马逊云通过申请还有放行的可能(但有速率和每日额度限制),其他厂商几乎不会让你使用自己的域名从本机直接发送邮件。封禁25端口,必须使用第三方的邮件服务,几乎是业界的标准做法。

聪明的人可能想到,使用465加密端口(基于SMTPS,SMTP over SSL协议)或587端口(SMTP over STARTTLS协议)发送邮件,是不是就能绕开限制了?阿里云/腾讯云等厂商并不封禁465端口,发送邮件可以使用该端口而无需申请。但注意465和587端口是客户端和邮件服务器通讯使用的端口,邮件服务器之间通讯使用25端口。你可以通过465端口连接到Gmail邮箱对外发送邮件,但无法让postfix使用465端口投递邮件到hotmail邮件服务器。

总结来说,sendmail/postfix作为垃圾和欺诈邮件泛滥前的邮件服务器软件,对业界贡献很大。随着云服务器的盛行,几乎无法以指向本机的域名向外发送邮件,sendmail/postfix除了在本机内发送提醒邮件,用处已然不大。要对外发送邮件,要么自建机房,要么使用第三方邮件系统。

PHP的mail函数

作为PHP开发中,了解sendmail/postfix还是有点用处。mail

메일과 관련된 몇 가지 일반적인 접미사 명령은

PHP 검토: 이메일 보내기mail 또는 mailx로, 메일을 보냅니다. 사용자 tlanyanroot에 이메일을 보냅니다: mail -s "Greetings" root@localhost -r tlanyan@localhost, 그런 다음 를 입력합니다. 터미널 A nice day!를 누른 다음 Enter를 누르고 ctrl+D를 눌러 텍스트 편집을 종료하면 이메일이 전송되었습니다. root 계정에 로그인하면 /var/spool/mail/root에 새 이메일이 있다는 메시지가 표시됩니다. 이메일의 자세한 정보를 보려면 tail 또는 기타 명령을 사용하세요.

    postquque, 이메일 전송 대기열을 확인하세요. postqueue -psendmailmailq 명령을 대체할 수 있으며, postqueue -f는 대기열을 새로 고칩니다(강제로 큐) 메일을 보내십시오).
  1. postcat에서 보내지 않은 이메일의 정보를 볼 수 있습니다. 예를 들어 postcat -q xxxx(xxxx는 postqueue 또는 mailq에 표시되는 전송되지 않은 대기열 ID)를 입력하면 이메일의 세부 정보를 볼 수 있으며, postcat -b -q xxxxx는 이메일 본문만 볼 수 있습니다.
  2. postsuper, 슈퍼 유저만 사용할 수 있는 메일 관리 프로그램입니다. postsuper -d xxxx, 대기열 ID xxxxx를 사용하여 메일을 삭제하고, postsuper -h xxxxx, 대기열 ID xxxx를 사용하여 메일 전송을 일시 중지합니다.
위 소개는 기본적으로 이메일 보내기에 충분합니다. mail 명령으로 보낸 메일은 postfix가 실행 중인 경우에만 배달될 수 있습니다(ps aux | grep postfix | grep -v grep 출력이 비어 있지 않음). 🎜🎜postfix를 사용하면 구성 후 외부로 이메일을 보내고 외부 네트워크에서 이메일을 받을 수 있지만 명령줄 작업으로 제한됩니다. Foxmail과 같은 클라이언트를 사용하여 이메일을 보내고 받으려면 서버가 POP3/IMAP 프로토콜을 지원하도록 해야 합니다. 오픈 소스 비둘기장은 이 기능을 달성할 수 있습니다. Dovecot은 이메일을 보내는 것보다 받는 역할을 합니다. 이를 이해하는 것은 개발에 거의 도움이 되지 않습니다. 완벽한 이메일 시스템(웹페이지 지원, 스팸 필터링, 바이러스 탐지, 전송 암호화 등 포함)을 구축하고 싶다면 국내 오픈소스인 EwoMail을 참고하거나 활용하는 것이 좋습니다. 🎜🎜개발 중에 이메일을 보낼 때 postfix를 아는 것이 얼마나 도움이 되나요? 솔직히 말하면 거의 도움이 되지 않습니다. 그 이유는 스팸 확산을 막기 위해 주요 클라우드 서버 제조사들이 포트 25를 차단했기 때문이다(구글 클라우드는 포트 465까지 차단했다). Amazon Cloud는 애플리케이션을 통해 출시될 수 있으며(단, 속도 및 일일 할당량 제한이 있음), 다른 공급업체에서는 사용자가 자신의 도메인 이름을 사용하여 이 시스템에서 직접 이메일을 보내는 것을 거의 허용하지 않습니다. 포트 25를 차단하고 타사 이메일 서비스를 사용하는 것은 업계에서 거의 표준 관행입니다. 🎜🎜똑똑한 사람들은 이메일을 보내기 위해 암호화된 포트 465(SMTPS, SSL 프로토콜을 통한 SMTP 기반) 또는 포트 587(STARTTLS 프로토콜을 통한 SMTP)을 사용하면 제한을 피할 수 있다고 생각할 수도 있습니다. Alibaba Cloud/Tencent Cloud 및 기타 제조업체는 포트 465를 차단하지 않습니다. 이 포트를 사용하면 신청하지 않고도 이메일을 보낼 수 있습니다. 단, 465 및 587 포트는 클라이언트와 메일 서버 간의 통신에 사용되며, 25 포트는 메일 서버 간의 통신에 사용됩니다. 포트 465를 통해 Gmail 편지함에 연결하여 외부로 이메일을 보낼 수 있지만 postfix가 포트 465를 사용하여 핫메일 메일 서버에 이메일을 전달하도록 할 수는 없습니다. 🎜🎜요약하자면, sendmail/postfix는 스팸과 사기성 이메일이 확산되기 전의 메일 서버 소프트웨어로서 업계에 큰 공헌을 했습니다. 클라우드 서버의 인기로 인해 로컬 컴퓨터를 가리키는 도메인 이름을 사용하여 이메일을 보내는 것은 거의 불가능합니다. Sendmail/postfix는 로컬 컴퓨터 내에서 알림 이메일을 보내는 것 외에는 거의 사용되지 않습니다. 외부로 이메일을 보내려면 자체 컴퓨터실을 구축하거나 타사 이메일 시스템을 사용해야 합니다. 🎜

PHP의 메일 기능

🎜PHP 개발자로서 sendmail/postfix를 이해하는 것은 여전히 ​​유용합니다. mail 기능은 기본적으로 sendmail/postfix를 사용하여 이메일을 보냅니다. 관련 구성을 이해하면 작동할 수 있는 이유와 작동할 수 없는 이유를 알 수 있습니다. 🎜🎜🎜🎜🎜🎜🎜간단히 말하면, PHP 자체 메일 기능이 제대로 작동하도록 하려면 다음을 수행해야 합니다. 🎜🎜🎜🎜도메인 이름을 신청하고, DNS 확인에서 MX 레코드를 설정하고, 로컬 시스템을 가리킵니다. (합법적이지 않은 호스트(FQDN, 정규화된 도메인 이름)는 스팸으로 직접 삭제됩니다.) 🎜🎜🎜🎜sendmail/postfix를 설치하고 소프트웨어를 구성한 후 실행합니다. 🎜🎜🎜🎜방화벽, 보안 그룹 및 릴리스 포트를 구성합니다. . 🎜

发送效率低、非面向对象的调用方式,配置麻烦以及云服务器厂商的封锁,是使用mail函数的最大阻碍。所以做PHP以来,本人并未直接用过mail函数。

PHP发送邮件

发个邮件要了解这么多,会让人觉得很心累。说好的PHP是最好的语言呢?

PHP发送邮件也可以很简单,推荐方式就是使用Swift MailerPHPMailer等类库。引入这些类库后,注册第三方邮箱(比如Gmail、QQ等),填好用户名密码,配置好STMP地址和端口,就能像发送短信一样轻松发送邮件。当然这些类库也支持使用sendmail/postfix发送邮件,但我想你不会再这样做了。

Swift Mailer为例,直接上代码说明使用PHP发送邮件也是一个非常简单的事情!

首先,在项目中引入Swift Mailer

composer require "swiftmailer/swiftmailer:^6.0"

然后准备好邮件内容(以文本文件为例,不带附件):

$message = (new Swift_Message('Test Message'))
    ->setFrom(['tlanyan@tlanyan.me' => 'tlanyan'])
    ->setTo(['tlanyan1@tlanyan.me'])
    ->setBody('Hello, this is a test mail from Swift Mailer!');

接着,设置好邮件传输方式(使用Gmail邮箱):

$transport = (new Swift_SmtpTransport('smtp.gmail.com', 465, 'ssl'))
    ->setUsername('username')
    ->setPassword('password');

或者使用sendmail/postfix的方式(不推荐):

$transport = (new Swift_SendmailTransport());

最后,使用transport构造mailer实例,发送邮件:

$mailer = new Swift_Mailer($transport);
$result = $mailer->send($message);

老板再也不用担心发送邮件收不到了,So easy!

总结

本文先回顾了发送邮件的相关概念,说明不推荐使用内置的mail函数原因,最后给出了使用第三方类库发送邮件的代码示例。

感谢阅读,欢迎评论指正!

参考

  1. http://cn.linux.vbird.org/lin...

  2. http://doc.ewomail.com/ewomai...

  3. http://php.net/manual/en/func...

  4. https://swiftmailer.symfony.com

相关推荐;

怎样选择适合自己php框架

php中传值与传引用的区别

위 내용은 PHP 검토: 이메일 보내기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.