一、教程内容
备份了mysql数据库内容后,想让它定时发送到QQ邮箱进行备份,所以用了sendmail,这里仅介绍如何配置,没有发送成功,原因是腾讯云封禁了25端口。
操作系统:debian 8.9
二、操作步骤
1、安装sendmail-bin
apt-get install sendmail-bin
如果不装这个会报错:
下列软件包有未满足的依赖关系:
sendmail : 依赖: sendmail-bin 但是它将不会被安装
E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
2、安装sendmail
apt-get install sendmail
期间报错,但是没有管,因为不需要php发送邮件。
正在设置 php7.0-fpm (7.0.24-1~dotdeb+8.1) ...
NOTICE: Not enabling PHP 7.0 FPM by default.
NOTICE: To enable PHP 7.0 FPM in Apache2 do:
NOTICE: a2enmod proxy_fcgi setenvif
NOTICE: a2enconf php7.0-fpm
NOTICE: You are seeing this message because you have apache2 package installed.
Job for php7.0-fpm.service failed. See 'systemctl status php7.0-fpm.service' and 'journalctl -xn' for details.
invoke-rc.d: initscript php7.0-fpm, action "restart" failed.
在处理时有错误发生:
php7.0-fpm
E: Sub-process /usr/bin/dpkg returned an error code (1)
3、修改主机名
vi /etc/hostname
输入内容
bewindoweb.cn
使其快速生效(F要大写)
hostname -F /etc/hostname
查看是否生效
hostname
提示:bewindoweb.cn
4、添加域名解析A记录和MX记录(我的是腾讯云),等待生效。
腾讯云添加A和MX记录
主机记录 | 记录类型 | 线路类型 | 记录值 | MX优先级 |
---|---|---|---|---|
A | 默认 | 我的服务器ip | ||
@ | MX | 默认 | mail.bewindowb.cn | 5 |
5、修改/etc/mail/sendmail.mc
vi /etc/mail/sendmail.mc
默认情况下,sendmail只支持本地,我开始发了一封就发现分给了自己……因此要修改sendmail.mc的这一行(port为stmp),将127.0.0.1改为0.0.0.0:
DAEMON_OPTIONS(`Family=inet, Name=MTA-v4, Port=smtp, Addr=0.0.0.0′)dnl
在末尾加入:
MASQUERADE_AS(bewindoweb.cn)dnl
FEATURE(masquerade_envelope)dnl
FEATURE(masquerade_entire_domain)dnl
MASQUERADE_DOMAIN(bewindoweb.cn)dnl
6、执行命令:
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
这时可能出现:
*** ERROR: FEATURE() should be before MAILER()
*** MAILER(`local') must appear after FEATURE(`always_add_domain')*** ERROR: FEATURE() should be before MAILER()
*** MAILER(`local') must appear after FEATURE(`allmasquerade')*** ERROR: FEATURE() should be before MAILER()
*** ERROR: FEATURE() should be before MAILER()
*** ERROR: FEATURE() should be before MAILER()
找到/etc/mail/sendmail.mc
中的以下内容,放到文档的最后,再重新执行m4命令,就不会出现问题了。
MAILER_DEFINITIONS
MAILER(`local')dnl
MAILER(`smtp')dnl
7、把需要发送的邮件的域放进access
vi /etc/mail/access
内容加入:
163.com RELAY
qq.com RELAY
gmail.com RELAY
生成access.db文件:
makemap – v hash /etc/mail/access.db < /etc/mail/access
8、重启sendmail
service sendmail restart
查看状态:
netstat -tlunp | grep 25
提示:tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 6269/sendmail: MTA:
或者:
service sendmail status
提示:
● sendmail.service - LSB: powerful, efficient, and scalable Mail Transport Agent
Loaded: loaded (/etc/init.d/sendmail)
Active: active (running) since 四 2017-12-07 21:37:13 CST; 27min ago
Process: 12002 ExecStop=/etc/init.d/sendmail stop (code=exited, status=0/SUCCESS)
Process: 12033 ExecStart=/etc/init.d/sendmail start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/sendmail.service
├─ 6522 sendmail: MTA: ./vB7CbI1x006520 163mx02.mxmail.netease.com.: user open
├─12078 sendmail: MTA: accepting connections
└─13839 sendmail: MTA: ./vB7DaUiS011921 mx1.qq.com.: user open
9、发送邮件
echo "测试内容" | mail -s "测试标题" -a 附件.txt 12345678@qq.com
mail 12345678@qq.com -s "主题" < 邮件内容.txt
三、其他相关内容
0、一些解释
sendmail.cf:sendmail核心配置文件
sendmail.mc:sendmail提供sendmail文件模板,通过编辑此文件后再使用m4工具将结果导入sendmail.cf完成配置sendmail核心配置文件,降低配置复杂度
access.db:用来设置sendmail服务器为哪些主机进行转发邮件,位于/etc/mail/access.db
aliases.db:用来定义邮箱别名,位于/etc/mail/aliases.db
MUA:邮件用户代理(Mail User Agent)
MTA:邮件传输代理(Mail Transfer Agent)
MDA:邮件递送代理(Mail Delivery Agent)
1、查看邮件队列滞留情况:
sendmail -bp
或者:
mailq
2、删除邮件队列:
cd /var/spool/mqueue
rm -rf *
3、查看邮件:
mail
查看邮件:enter
退出:exit
4、强制送信
对MTA队列强制送信:sendmail -q -v
对MSP队列强制送信:sendmail -q -v -Ac
四、我为什么没发成功
sendmail -bp
发信的状态提示是:
(Deferred: Connection timed out with mx1.qq.com.)
于是查到可能是安全组设置没有开放25端口,于是去腾讯云面板查看发现:
注意:为了提升腾讯云IP地址发邮件的质量,将默认限制云主机TCP25端口连接外部地址。您申请自动解封:鼠标移动到导航栏-帐号-25端口解封。
看了《云主机 TCP 25 端口出方向被封禁?》这篇官方文档,发现:
如果您发起解封申请,腾讯云将默认您已确认并承诺:保证 TCP 25 端口仅用来连接第三方的 SMTP 服务器 ,并从第三方的 SMTP 服务器向外发邮件。如发现您使用申请的 IP 直接通过 SMTP 发送邮件,腾讯云有权永久性封禁 TCP 25 端口,并不再提供解封服务,如有其它问题,请提 工单申请。
厉害了我的腾讯云,阿里云也是一样的。查到的一篇解决方法:《阿里云服务器不能发邮件,禁用25端口的解决办法》,以后再继续弄,php代码如下:
<?php
header("content-type:text/html;charset=utf-8");
include("/PHPMailer/class.phpmailer.php");
include("/PHPMailer/class.smtp.php");
$mail = new PHPMailer(true);
$mail->IsSMTP();
$mail->CharSet='UTF-8'; //设置邮件的字符编码,这很重要,不然中文乱码
$mail->SMTPAuth = true; //开启认证
$mail->SMTPSecure = 'ssl';//设置使用ssl加密方式登录鉴权
$mail->Port = 465;
$mail->Host = "smtp.163.com";
$mail->Username = "邮箱名";
$mail->Password = "授权码";
//$mail->IsSendmail(); //如果没有sendmail组件就注释掉,否则出现“Could not execute: /var/qmail/bin/sendmail ”的错误提示
$mail->AddReplyTo("邮箱名","mckee");//回复地址
$mail->From = "邮箱名";
$mail->FromName = "www.phpddt.com";
$to = "收件人";
$mail->AddAddress($to);
$mail->Subject = "本测试标题";
$mail->Body = "<h1>phpmail演示</h1>这是php点点通(<font color=red>www.phpddt.com</font>)对phpmailer的测试内容";
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; //当邮件不支持html时备用显示,可以省略
$mail->WordWrap = 80; // 设置每行字符串的长度
//$mail->AddAttachment("f:/test.png"); //可以添加附件
$mail->IsHTML(true);
if(!$mail->Send())
{
echo "邮件发送有误 <p>";
echo "邮件错误信息: " . $mail->ErrorInfo;
exit;
}
else {
echo "邮件发送成功!<br />";
}
?>
其实也就在配置里加了
$mail->SMTPSecure = 'ssl';//设置使用ssl加密方式登录鉴权
$mail->Port = 465;