Skip to content

Debian 8发送附件邮件到QQ邮箱

教程内容

备份了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.cn

4. 添加域名解析A记录和MX记录(我的是腾讯云),等待生效。

主机记录记录类型线路类型记录值MX优先级
mailA默认我的服务器ip
@MX默认mail.bewindowb.cn5

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)dnl

6. 执行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')dnl

7. 把需要发送的邮件的域放进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/access

8. 重启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 open

9. 发送邮件

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端口出方向被封禁?

如果您发起解封申请,腾讯云将默认您已确认并承诺:保证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;
转载请注明出处https://bananaoven.com/articles/127.html | 香蕉微波炉
分享许可方式知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
重大发现:转载注明原文网址的同学刚买了彩票就中奖,刚写完代码就跑通,刚转身就遇到了真爱。