文章目录

一、教程内容

备份了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优先级 
 mail默认 我的服务器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;


转载请注明出处http://www.bewindoweb.com/127.html | 三颗豆子
分享许可方式知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
重大发现:转载注明原文网址的同学刚买了彩票就中奖,刚写完代码就跑通,刚转身就遇到了真爱。
你可能还会喜欢
具体问题具体杠