linux PHPMailer 发送邮件sendmail 发邮件失败问题
1、用的腾讯云服务器,折腾了很多资料,发现改错了。谨记检查端口25开放
2、TP框架用PHPMailer 发送邮件,windows本地测试正常,上传到腾讯云linux服务器就发送不成功:
细节如下: [root@VM_82_192_centos ~]# tail -40 /var/log/maillog
把classphpmailerphp中的$this->mailer = smtp;中的smtp换成大写:SMTP。说是因为qq 163等邮箱需要接受发送过来的大写的SMTP;
发现还是不成功
反过头来检查25端口:
发现没反应:yum重装sendmail,还是同样。直接杀到云服务器哪儿,检查25端口是否开放;泪流满面:赶紧解封。
确认:
OK,测试发送 mail -s '33333333555ksTest mail' 2848278204@qqcom < /etc/passwd
回答:figoo
新手
5月16日 11:52 配置电子邮件服务
利用电子邮件服务,您可以在计算机中安装一些组件并将该计算机配置为电子邮件服务器。电子邮件服务包括邮局协议 3 (POP3) 服务以及简单邮件传输协议 (SMTP) 服务,分别用于接收和传送电子邮件。为了向用户提供电子邮件服务(如发送和接收电子邮件),管理员可以在服务器上创建一些邮箱。
POP3
POP3 服务是一种用来接收电子邮件的电子邮件服务。管理员可以使用 POP3 服务,在邮件服务器上存储和管理电子邮件帐户。在邮件服务器中安装了 POP3 服务后,用户即可使用支持 POP3 协议的电子邮件客户端(如 Outlook 或 Outlook Express)连接到邮件服务器,并将电子邮件接收到其本地计算机中。POP3 服务与用来发送外发电子邮件的 SMTP 服务结合使用。
SMTP
SMTP 控制将电子邮件经由组织或 Internet 向目标服务器传输和递送的方式。SMTP 在服务器之间接收和发送电子邮件。在安装 POP3 服务时,就会自动在计算机中安装 SMTP 服务以允许用户发送外发电子邮件。当使用 POP3 服务创建域时,还会将该域添加到 SMTP 服务中,以允许该域中的邮箱发送外发电子邮件。邮件服务器中的 SMTP 服务接收传入的邮件,并将该电子邮件传送到邮件存储中。
设置电子邮件服务
要安装电子邮件服务,请按照以下步骤操作:
1
以“Administrator@contosocom”的身份登录到“HQ-CON-DC-01”中。
2
单击“开始”按钮,单击“控制面板”,然后单击“添加或删除程序”。
3
单击“添加/删除 Windows 组件”,选择“电子邮件服务”复选框,然后单击“下一步”。(注意,您可能需要提供安装 CD 才能继续。)
4
在“Windows 组件向导”完成后,单击“完成”,然后关闭“添加或删除程序”屏幕。
要配置电子邮件服务,请按照以下步骤操作:
1
单击“开始”按钮,指向“所有程序”,指向“管理工具”,然后单击“POP3 服务”。
2
在“POP3 服务”下面,在左侧树中单击“HQ-CON-DC-01”。
3
单击“新域”链接,键入“contosocom”作为“域名”,然后单击“确定”。
4
在右窗格中,双击“contosocom”。在“HQ-CON-DC-01”下面,左窗格中的树将展开并显示“contosocom”域。单击“添加邮箱”链接。
5
在“添加邮箱”屏幕上,键入“mike”作为“邮箱名”,清除“为此邮箱创建相关联的用户”复选框,单击“确定”,在出现“POP3 服务”确认屏幕后,再次单击“确定”。
6
再次单击“添加邮箱”链接,重复步骤 5 为“Administrator”创建邮箱。
注意:由于 Active Directory 帐户是在安装电子邮件服务之前建立的,因此,需要对邮箱进行手动配置。如果登录和邮箱名相同,POP3 服务配置将使用关联的电子邮件地址来更新 Active Directory 用户信息。在定义新的邮箱时,POP3 服务可以自动创建用户帐户。
7
最小化“POP3 服务”MMC。
要测试基本电子邮件功能,请按照以下步骤操作:
1
单击“开始”按钮,指向“所有程序”,然后单击“Outlook Express”。
2
在“Internet 连接向导”屏幕上,键入“Contoso Administrator”作为“显示名”,然后单击“下一步”。
3
键入“administrator@contosocom”作为“电子邮件地址”,然后单击“下一步”。
4
在“接收邮件服务器”和“发送邮件服务器”中,键入“HQ-CON-DC-01”,然后单击“下一步”。
5
在“Internet 邮件登录”屏幕上,将登录名更改为“administrator@contosocom”并提供“Administrator”帐户的“密码”,然后单击“下一步”。
6
单击“完成”。
7
单击“发送/接收”按钮,以确保能够与电子邮件服务器成功交互。
8
单击“创建邮件”,将邮件地址指定为“mike@contosocom”,键入“Test Mail”作为“主题”,然后单击“发送”。
9
最大化“POP3 服务”MMC。
10
在右侧的结果窗格的“HQ-CON-DC-01”树下面,确认 mike 的“邮箱”中有一封邮件,然后关闭“POP3 服务”MMC。
揪错 ┆ 评论1 ┆ 举报
邮件服务都使用了25端口,我们只需要允许来自25端口的连接请求即可。
iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
允许IMAP与IMAPS
# IMAP:143
iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT
# IMAPS:993
iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT
允许POP3与POP3S
# POP3:110
iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT
# POP3S:995
iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT
一、概述:
在配置邮件服务器之前,先解释几个概念。
通常使用Email都很容易,但是Internet的邮件系统是通过几个复杂的部分连接而成的,对于最终用户而言,我们熟悉的Outlook,Foxmail等都是用来收信和发信的,称之为MUA:Mail User Agent,邮件用户代理。
MUA并非直接将邮件发送至收件人手中,而是通过MTA:Mail Transfer Agent,邮件传输代理代为传递,Sendmail和Postfix就是扮演MTA的角色。
一封邮件从MUA发出后,可能通过一个或多个MTA传递,最终到达MDA:Mail Delivery Agent,邮件投递代理,邮件到达MDA后,就存放在某个文件或特殊的数据库里,我们将这个长期保存邮件的地方称之为邮箱。
一旦邮件到达邮箱,就原地不动了,等用户再通过MUA将其取走,就是用Outlook,Foxmail等软件收信的过程。
所以一封邮件的流程是:
发件人:MUA --发送--> MTA -> 若干个MTA -> MTA -> MDA <--收取-- MUA:收件人
MUA到MTA,以及MTA到MTA之间使用的协议就是SMTP协议,而收邮件时,MUA到MDA之间使用的协议最常用的是POP3或IMAP。
需要注意的是,专业邮件服务商都有大量的机器来为用户服务,所以通常MTA和MDA并不是同一台服务器,因此,在Outlook等软件里,我们需要分别填写SMTP发送服务器的地址和POP3接收服务器的地址。
Linux系统下邮件服务器的搭建(Postfix+Dovecot)
对于网站来说,发送各种例如注册通知的邮件是很基本的一个需求,之前我一直用的是腾讯的企业邮箱,感觉挺方便的,直接可以绑定QQ邮箱接收邮件,网站配置一下SMTP也就可以发出邮件。
但是在前几天由于有重要信息需要立即通知用户,所以选择了群发邮件的方式。在当我以为一切都是辣么完美的时候,陆续有用户过来问我什么情况,我都会跟他们说请查收邮件,但是有好几个人说并没有任何
邮件,于是我试着再发一次,结果返回了错误提示。在网上找了下原因,后来看到这个:各大免费邮箱邮件群发账户SMTP服务器配置及SMTP发送量限制情况,才知道是因为发信数量限制了。
所以只好另寻出路了,然后我在知乎上面找到了很多个提供邮件发送的服务商,大概有这些:SendGrid、MailChimp、Amazon SES、SendCloud、Mailgun等等,在看了不少人的建议之后,我选择了Mailgun。
Mailgun注册和配置都挺简单,很快我就成功的发出了第一封邮件,怀着这封欣喜,我又发送了几封邮件,可是悲剧发生在第三封邮件,Mailgun后台有详细的发送记录,这个非常不错,在后台我看到我的邮件被拒收了,原因大概是该服务器IP的发信频率超过腾讯邮箱限制。所以这里就涉及到IP的问题,目前第三方的邮件发送服务普遍都是共享IP(后面还试过SendCloud、),而共享IP并不能确定是否已经达到接收方的数量限制,一旦达到了就无法再发送。这就是说还需要使用独立IP才能保证邮件有较高的到达率,接着就看了各家的独立IP价格,一般都是二十几甚至四十几美刀一个月,这对于我们这种小站长邮件需求不高的来说确实有点贵,买台VPS都不用这个价吧。
经过上面这些折腾,也算明白了如果要想顺畅的发出邮件的话,除了花钱,就只有自己搭建一个邮件服务器了。
好了,下面开始进入正题,教你搭建一个简单的邮件服务器。
用于搭建的服务器信息
阿里云 Centos 65 32位
Postfix-2812targz Postfix MTA(邮件传输代理)
Dovecot-218targz IMAP 和 POP3 邮件服务器
Postfixadmin-235targz 采用PHP编写的开源WEB邮箱及域名账号管理工具
Roundcubemail-081targz 采用php编写的开源IMAP邮件WEB客户端
安装过程
1安装Postfix
yum -y install postfix
安装完成还需要替换系统自带的sendmail:
rpm -e sendmail
或者
yum remove sendmail
修改MTA(默认邮件传输代理)
alternatives --config mta
然后直接回车即可。
检查一下是不是已经设置成功了。
alternatives --display mta
第一行可以看到mta的状态。 例如:mat - status is manual
2安装Dovecot
yum -y install dovecot
3配置Postfix
编辑/etc/postfix/maincf,可以下载下来修改,也可以使用vi进行编辑:
vi /etc/postfix/maincf
修改如下:
# 75行: 取消注释,设置hostname
myhostname = maillomume
# 83行: 取消注释,设置域名
mydomain = lomume
# 99行: 取消注释
myorigin = $mydomain
# 116行: 修改
inet_interfaces = all
# 119行: 推荐ipv4,如果支持ipv6,则可以为all
inet_protocols = ipv4
# 164行: 添加
mydestination = $myhostname, localhost$mydomain, localhost, $mydomain
# 264行: 取消注释,指定内网和本地的IP地址范围
mynetworks = 127000/8, 10000/24
# 419行: 取消注释,邮件保存目录
home_mailbox = Maildir/
# 571行: 添加
smtpd_banner = $myhostname ESMTP
# 添加到最后
# 规定邮件最大尺寸为10M
message_size_limit = 10485760
# 规定收件箱最大容量为1G
mailbox_size_limit = 1073741824
# SMTP认证
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject
修改好了之后使用/etc/rcd/initd/postfix start开启postfix,使用chkconfig postfix on将postfix开机启动。
4配置Dovecot
修改如下:
[root@mail ~]# vi /etc/dovecot/dovecotconf
# 26行: 如果不使用IPv6,请修改为
listen =
[root@mail ~]# vi /etc/dovecot/confd/10-authconf
# 9行: 取消注释并修改
disable_plaintext_auth = no
# 97行: 添加
auth_mechanisms = plain login
[root@mail ~]# vi /etc/dovecot/confd/10-mailconf
# 30行: 取消注释并添加
mail_location = maildir:~/Maildir
[root@mail ~]# vi /etc/dovecot/confd/10-masterconf
# 88-90行: 取消注释并添加
# Postfix smtp验证
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
[root@mail ~]# /etc/rcd/initd/dovecot start
Starting Dovecot Imap: [ OK ]
[root@mail ~]# chkconfig dovecot on
到这里,我们的邮件服务器就已经搭建成功了。
5域名解析
最后别忘了还需要进行域名解析工作。
添加一个子域名mail,A记录解析到服务器IP。
再添加一个MX记录,主机记录为空,记录值为上面解析的二级域名maillomume,优先级10。
注意:解析生效可能需要一段时间。
6防火墙设置
/sbin/iptables -A INPUT -p tcp --dport 25 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 110 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 143 -j ACCEPT
突破封锁25口的转发
/sbin/iptables -t nat -A PREROUTING -p tcp -m tcp --dport 10025 -j REDIRECT --to-ports 25
7邮箱使用
一切都弄好以后,就可以使用Foxmail等第三方软件来收发邮件了。在这里需要说一下,系统用户就是邮件的用户,例如root,就是一个邮箱用户,邮箱是root@domaincom,密码就是root的密码,所以需要创建用户,只要使用useradd创建用户,再使用passwd设置密码。
好了,假如我们创建一个admin的用户:
# 创建用户
useradd admin
#设置密码,会要求输入两次密码
passwd admin
接下来登录Foxmail,如图:
点击创建,进入:
这里需要注意,邮件账号是admin,并不是邮箱,另外我们没有配置SSL,所以也不要勾选。 接下来点击创建,如果一切正常的话,你已经成功了。
Qmail有一个名为rcpthosts(该文件名源于RCPTTO命令)的配置文件,其决定了是否接受一个邮件。只有当一个RCPTTO命令中的接收者地址的域名存在于rcpthosts文件中时,才接受该邮件,否则就拒绝该邮件。若该文件不存在,则所有的邮件将被接受。当一个邮件服务器不管邮件接收者和邮件接收者是谁,而是对所有邮件进行转发(relay),则该邮件服务器就被称为开放转发(openrelay)的。当qmail服务器没有rcpthosts时,其是开放转发的。
设置自己服务器为非openrelay的最简单的办法就是将你的邮件服务器的所有域名(若DNS的MX记录指向该机器,也应该包括该域名。例如你的机器有三个域名maillinxuaidcomcn、mail1linuxaidcomcn,而且linuxaidcomcn的MX指向maillinuxaidcomcn,则qmail的rcphosts的应该包括maillinuxaidcomcn、mail1linuxaidcomcn和linuxaidcomcn)。
但是这将导致你的本地客户也被拒绝使用你的服务器转发邮件,而要支持客户使用MUA来发送邮件,必须允许客户使用服务器转发邮件。qmail-smtpd支持一种有选择性的忽略rcpthosts文件的方法:若qmail-smtpd的环境变量RELAYCLIENT被设置,则rcpthost文件将被忽略,relay将被允许。但是如何识别一个邮件发送者是否是自己的客户呢?qmail并没有采用密码认证的方法,而是判断发送邮件者的源IP地址,若该IP地址属于本地网络,则认为该发送者为自己的客户。
这里就要使用ucspi-tcp软件包。在这里我们要使用该软件包的tcpserver程序。该程序的功能类似于inetd-监听进入的连接请求,为要启动的服务设置各种环境变量,然后启动指定的服务。
tcpserver的配置文件是/etc/tcpsmtp,该文件定义了是否对某个网络设置RELAYCLIENT环境变量。例如,本地网络是地址为192168100/24的C类地址,则tcpsmtp的内容应该设置如下:127001:allow,RELAYCLIENT=""19216810:allow,RELAYCLIENT="":allow
这几个规则的含义是指若连接来自127001和19216810则允许,并且为其设置环境变量RELAYCLIENT,否则允许其他连接,但是不设置RELAYCLIENT环境变量。这样当从其他地方到本地的25号连接将会被允许,但是由于没有被设置环境变量,所以其连接将会被qmail-smptd所拒绝。
但是tcopserver并不直接使用/etc/tcpsmtp文件,而是需要先将该文件转化为cbd文件:
___FCKpd___1nbsp;#tcprulestcpsmtpcdbtcpsmtptemp
然后再回头看在/service/qmail-smtpd目录下的run文件中有
/usr/local/bin/tcpserver-v-p-x/etc/tcpsmtpcdb
可以看到,tcpserver利用了/etc/smtpcbd文件。若本地有多个网络,则需要这些网络都出现在/etc/tcpsmtp文件中。
这样就实现了允许本地客户relay邮件,而防止relay被滥用。
假定你想配置一个 Linux 应用,用于从你的服务器或桌面客户端发送邮件信息。邮件信息可能是邮件简报、状态更新(如 Cachet)、监控警报(如 Monit)、磁盘时间(如 RAID mdadm)等等。当你要建立自己的 邮件发送服务器 传递信息时 ,你可以替代使用一个免费的公共 SMTP 服务器,从而避免遭受维护之苦。
谷歌的 Gmail 服务就是最可靠的 免费 SMTP 服务器 之一。想要从应用中发送邮件通知,你仅需在应用中添加 Gmail 的 SMTP 服务器地址和你的身份凭证即可。
使用 Gmail 的 SMTP
服务器会遇到一些限制,这些限制主要用于阻止那些经常滥用服务器来发送垃圾邮件和使用邮件营销的家伙。举个例子,你一次只能给至多 100
个地址发送信息,并且一天不能超过 500
个收件人。同样,如果你不想被标为垃圾邮件发送者,你就不能发送过多的不可投递的邮件。当你达到任何一个限制,你的 Gmail
账户将被暂时的锁定一天。简而言之,Gmail 的 SMTP 服务器对于你个人的使用是非常棒的,但不适合商业的批量邮件。
说了这么多,是时候向你们展示 如何在 Linux 环境下使用 Gmail 的 SMTP 服务器 了。
Google Gmail SMTP 服务器设置
如果你想要通过你的应用使用 Gmail 的 SMTP 服务器发送邮件,请牢记接下来的详细说明。
邮件发送服务器 (SMTP 服务器): smtpgmailcom
使用认证: 是
使用安全连接: 是
用户名: 你的 Gmail 账户 ID (比如 "alice" ,如果你的邮箱为 alice@gmailcom)
密码: 你的 Gmail 密码
端口: 587
确切的配置根据应用会有所不同。在本教程的剩余部分,我将向你展示一些在 Linux 上使用 Gmail SMTP 服务器的应用示例。
从命令行发送邮件
作为第一个例子,让我们尝试最基本的邮件功能:使用 Gmail SMTP 服务器从命令行发送一封邮件。为此,我将使用一个称为 mutt 的命令行邮件客户端。
先安装 mutt:
对于 Debian-based 系统:
$ sudo apt-get install mutt
对于 Red Hat based 系统:
$ sudo yum install mutt
创建一个 mutt 配置文件(~/muttrc),并和下面一样,在文件中指定 Gmail SMTP 服务器信息。将 <gmail-id> 替换成自己的 Gmail ID。注意该配置只是为了发送邮件而已(而非接收邮件)。
$ vi ~/muttrc
set from = "<gmail-id>@gmailcom"set realname = "Dan Nanni"set smtp_url = "smtp://<gmail-id>@smtpgmailcom:587/"set smtp_pass = "<gmail-password>"
一切就绪,使用 mutt 发送一封邮件:
$ echo "This is an email body" | mutt -s "This is an email subject" alice@yahoocom
想在一封邮件中添加附件,使用 "-a" 选项
$ echo "This is an email body" | mutt -s "This is an email subject" alice@yahoocom -a ~/test_attachmentjpg
使用 Gmail SMTP 服务器意味着邮件将显示是从你 Gmail 账户发出的。换句话说,收件人将视你的 Gmail 地址为发件人地址。如果你想要使用自己的域名作为邮件发送方,你需要使用 Gmail SMTP 转发服务。
当服务器重启时发送邮件通知
如果你在 虚拟专用服务器(VPS)
上跑了些重要的网站,建议监控 VPS 的重启行为。作为一个更为实用的例子,让我们研究如何在你的 VPS
上为每一次重启事件建立邮件通知。这里假设你的 VPS 上使用的是 systemd,并向你展示如何为自动邮件通知创建一个自定义的 systemd
启动服务。
首先创建下面的脚本 reboot_notifysh,用于负责邮件通知。
$ sudo vi /usr/local/bin/reboot_notifysh
#!/bin/sh
echo "`hostname` was rebooted on `date`" | mutt -F /etc/muttrc -s "Notification on `hostname`" alice@yahoocom
$ sudo chmod +x /usr/local/bin/reboot_notifysh
在这个脚本中,我使用 "-F" 选项,用于指定系统级的 mutt 配置文件位置。因此不要忘了创建 /etc/muttrc 文件,并如前面描述的那样填入 Gmail SMTP 信息。
现在让我们创建如下一个自定义的 systemd 服务。
$ sudo mkdir -p /usr/local/lib/systemd/system$ sudo vi /usr/local/lib/systemd/system/reboot-taskservice
[Unit]
Description=Send a notification email when the server gets rebooted
DefaultDependencies=no
Before=reboottarget
[Service]
Type=oneshot
ExecStart=/usr/local/bin/reboot_notifysh
[Install]
WantedBy=reboottarget
在创建服务后,添加并启动该服务。
$ sudo systemctl enable reboot-task$ sudo systemctl start reboot-task
从现在起,在每次 VPS 重启时,你将会收到一封通知邮件。
通过服务器使用监控发送邮件通知
作为最后一个例子,让我展示一个现实生活中的应用程序,Monit,这是一款极其有用的服务器监控应用程序。它带有全面的 VPS 监控能力(比如 CPU、内存、进程、文件系统)和邮件通知功能。
如果你想要接收 VPS 上由 Monit 产生的任何事件的邮件通知,你可以在 Monit 配置文件中添加以下 SMTP 信息。
set mailserver smtpgmailcom port 587
username "<your-gmail-ID>" password "<gmail-password>"
using tlsv12
set mail-format {
from: <your-gmail-ID>@gmailcom
subject: $SERVICE $EVENT at $DATE on $HOST
message: Monit $ACTION $SERVICE $EVENT at $DATE on $HOST : $DESCRIPTION
Yours sincerely,
Monit
}
# the person who will receive notification emails
set alert alice@yahoocom
这是一个因为 CPU 负载超载而由 Monit 发送的邮件通知的例子。
0条评论