• Linux使用mail发送电子邮件


    一、说明

        mail和mailx就像我们windows上的foxmail,是个客户端工具,在Linux运维环境中可能会用到一些报警之类的功能,可通过系统mail命令直接发送电子邮件到指定的邮箱用来实现告警,本文就mail客户端配置和常见使用格式做下学习。

    二、不加密发送邮件

    1、安装mail,使用yum install mailx即可直接安装。

    2、编辑mail配置文件,对发件人身份、服务器、端口等进行基本配置,/etc/mail.rc

    ###vim /etc/mail.rc
    ## smtp服务器发信的用户名和昵称
    set from
    =test@tompig.cn(nickname)
    ## smtp服务器的地址
    set smtp=smtp://smtp.mxhichina.com

    ## 邮件认证的方式 set smtp-auth=login

    ## smtp服务器认证的用户名 set smtp-auth-user=test@tompig.cn
    ## smtp服务器认证的用户密码(授权码) set smtp
    -auth-password=password

    至此,配置文件配置完成,可使用下面的命令进行发信测试

    echo "mail warning test,this is a test email" | mail -s "mail report" 150xxxxxxxx@139.com

    注意:1)smtp发信需要邮件系统管理员配置该认证账户的发信权限,允许使用smtp协议发信,认证密码根据实际情况填写,有的云邮箱可能是个动态授权码。

       2)有些云邮箱本身自带反垃圾功能,如果由于邮件内容写的比较简单或其他原因导致被识别为垃圾邮件,可能会出现报错“Unexpected EOF on SMTP connection”,也可能本地没有报错,但是登陆到邮箱网页会收到退信,此退信并不是最终的收件人邮箱服务器产生的退信,而是发信服务器在发信之前就判断成了垃圾邮件,产生退信。可以适当修改邮件内容、主题等信息,避免因为内容被识别成垃圾邮件。加密传输也可能出现"Unexpected EOF on SMTP connection",基本上是由于端口只支持SMTPS导致,将协议改成smtps://,参考下文配置。

    三、加密发送邮件

    上述情况在使用smtp发信时用的是25端口,而有些邮件服务器端是不允许开启25端口的,可能会使用smtps(465)、starttls(587)等加密端口发信,这里以465端口举例。

    修改配置文件(/etc/mail.rc)如下:

    ## smtp服务器发信的用户名
    set from=test@tompig.cn
    ## smtp服务器的地址,注意"smtps"协议名和后面的端口号
    set smtp=smtps://smtp.mxhichina.com:465
    ## 邮件认证的方式 set smtp-auth=login

    ## smtp服务器认证的用户名 set smtp-auth-user=test@tompig.cn
    ## smtp服务器认证的用户密码(授权码) set smtp
    -auth-password=password

    ## 忽略验证错误 set ssl-verify=ignore
    ##指定证书文件存放目录,自定义 set nss
    -config-dir=/root/.cert/

    这里在配置文件中多加入验证配置和证书文件存放目录配置2行,需要手动导入认证邮件服务器的证书,添加信任。

    执行步骤如下:

    ##创建自定义目录
    mkdir /root/.certs
    ##进入证书目录 cd
    /root/.certs ##获取邮件服务器证书秘钥(465端口) echo -n "" | openssl s_client -connect smtp.mxhichina.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > aliyun_smtps.crt
    ##附:获取邮件服务器证书秘钥(587端口) #
    echo -n | openssl s_client -starttls smtp -connect smtp.mxhichina.com:587 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > aliyun_starttls.crt

    ##将证书添加到受信任列表 certutil
    -A -n 'aliyun' -t "P,P,P" -d . -i ./aliyun_smtps.crt

    上述certutil命令中-A表示添加,-n是nickname(昵称),可以随意取,例如126或qq;-t表示受信任的标签,可取值是t/c/p三种或者其组合;-d表示证书所在目录,-i指示证书文件的位置。

    至此,配置完成,可使用mail命令直接发信,这里简单说明一下:

    1)如果是465端口,需要加上smtps://协议;如果是587端口,不需要加smtps://或者写smtp://;
    2)如果使用587端口通讯,应当显示设置smtp-use-starttls;
    3)邮件的来源应当与邮箱相同,或者将发信人姓名写在邮箱后的括号中。例如:set from=user@xxxx.com或set from=user@xxx.com(nickname);如果邮箱与认证的不一致,将出现“smtp-server: 553 Mail from must equal authorized user”的错误;
    4)有些邮件服务器的587端口不是使用STARTTLS而是SMTPS,此时仍需加上smtps://协议,例如126邮箱

    四、mail常用命令简介

    1、在标准输入中输入邮件内容:

    ~]# mail -s 'mail test' xxx@139.com
    
    this is a test email

    输入完成后成按Ctrl+D结束并发送邮件。连按两次Ctrl+C键则中断工作,不送此信件。

    2、通过管道传送邮件正文

    ~]# echo 'test mail' | mail -s 'mail test' xxx@139.com

    其中echo值为邮件内容,-s参数指定邮件主题,最后面跟收件人邮箱地址

    3、使用输入重定向,从文件中获取邮件内容

    mail -s 'mail test' xxx@139.com < file.txt

    4、如果需要发送给多个收件人,收件人之间用逗号隔开即可。如下:

    mail -s 'mail test' xxx@139.com,xxx@126.com < file.txt

    5、其他参数补充

    -b<地址>:指定密件副本的收信人地址;
    -c<地址>:指定副本的收信人地址;
    -f<邮件文件>:读取指定邮件文件中的邮件;
    -i:不显示终端发出的信息;
    -I:使用互动模式;
    -n:程序使用时,不使用mail.rc文件中的设置;
    -N:阅读邮件时,不显示邮件的标题;
    -s<邮件主题>:指定邮件的主题;
    -u<用户帐号>:读取指定用户的邮件;
    -v:执行时,显示详细的信息。

    参考资料:

    https://tlanyan.me/config-mail-use-smtp/

  • 相关阅读:
    书单
    将博客搬至CSDN
    《当我谈跑步时,我谈些什么》读后笔记
    jQuery EasyUI 教程-Tabs(选项卡)
    jqGrid中的formatter
    jqGrid中的编辑
    struts2中action接收参数的方法
    Hibernate基础(4):基础配置@Table@Column@Temporal@Transient@Enumerated
    Hibernate @Temporal
    搭建python项目
  • 原文地址:https://www.cnblogs.com/itbox/p/13207227.html
Copyright © 2020-2023  润新知