教程内容
备份了mysql数据库内容后,想让它定时发送到QQ邮箱进行备份,所以用了sendmail,这里仅介绍如何配置,没有发送成功,原因是腾讯云封禁了25端口。
操作系统:debian 8.9
操作步骤
1. 安装sendmail-bin
shell
apt-get install sendmail-bin如果不装这个会报错:
text
下列软件包有未满足的依赖关系:
sendmail : 依赖: sendmail-bin 但是它将不会被安装
E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。2. 安装sendmail
shell
apt-get install sendmail期间报错,但是没有管,因为不需要php发送邮件。
text
正在设置 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. 修改主机名
shell
vi /etc/hostname输入内容
text
bewindoweb.cn使其快速生效(F要大写)
shell
hostname -F /etc/hostname查看是否生效
shell
hostname
# 提示:bewindoweb.cn4. 添加域名解析A记录和MX记录(我的是腾讯云),等待生效。
| 主机记录 | 记录类型 | 线路类型 | 记录值 | MX优先级 |
|---|---|---|---|---|
| A | 默认 | 我的服务器ip | ||
| @ | MX | 默认 | mail.bewindowb.cn | 5 |
5. 修改/etc/mail/sendmail.mc
shell
vi /etc/mail/sendmail.mc默认情况下,sendmail只支持本地,我开始发了一封就发现分给了自己……因此要修改sendmail.mc的这一行(port为stmp),将127.0.0.1改为0.0.0.0:
text
DAEMON_OPTIONS(`Family=inet, Name=MTA-v4, Port=smtp, Addr=0.0.0.0′)dnl在末尾加入:
yaml
MASQUERADE_AS(bewindoweb.cn)dnl
FEATURE(masquerade_envelope)dnl
FEATURE(masquerade_entire_domain)dnl
MASQUERADE_DOMAIN(bewindoweb.cn)dnl6. 执行m4命令
shell
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf这时可能出现:
text
*** 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命令,就不会出现问题了。
yaml
MAILER_DEFINITIONS
MAILER(`local')dnl
MAILER(`smtp')dnl7. 把需要发送的邮件的域放进access
shell
vi /etc/mail/access内容加入:
yaml
163.com RELAY
qq.com RELAY
gmail.com RELAY生成access.db文件:
shell
makemap – v hash /etc/mail/access.db < /etc/mail/access8. 重启sendmail
shell
service sendmail restart查看状态:
shell
netstat -tlunp | grep 25
# 提示:tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 6269/sendmail: MTA:或者:
shell
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 open9. 发送邮件
shell
echo "测试内容" | mail -s "测试标题" -a 附件.txt 12345678@qq.com
mail 12345678@qq.com -s "主题" < 邮件内容.txt其他相关内容
术语解释
- 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)
查看邮件队列滞留情况
shell
sendmail -bp或者:
shell
mailq删除邮件队列
shell
cd /var/spool/mqueue
rm -rf *查看邮件
shell
mail
查看邮件:enter
退出:exit强制送信
shell
对MTA队列强制送信:sendmail -q -v
对MSP队列强制送信:sendmail -q -v -Ac我为什么没发成功
sendmail -bp发信的状态提示是:
text
(Deferred: Connection timed out with mx1.qq.com.)于是查到可能是安全组设置没有开放25端口,去腾讯云面板查看发现:
注意:为了提升腾讯云IP地址发邮件的质量,将默认限制云主机TCP25端口连接外部地址。您申请自动解封:鼠标移动到导航栏-帐号-25端口解封。
看了《云主机TCP25端口出方向被封禁?》这篇官方文档,发现: 
如果您发起解封申请,腾讯云将默认您已确认并承诺:保证TCP25端口仅用来连接第三方的SMTP服务器,并从第三方的SMTP服务器向外发邮件。如发现您使用申请的IP直接通过SMTP发送邮件,腾讯云有权永久性封禁TCP25端口,并不再提供解封服务,如有其它问题,请提工单申请。
厉害了我的腾讯云,阿里云也是一样的。查到的一篇解决方法:《阿里云服务器不能发邮件,禁用25端口的解决办法》,以后再继续弄,php代码如下:
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;


粤公网安备44030602007943号