Permalink
Find file
Fetching contributors…
Cannot retrieve contributors at this time
110 lines (74 sloc) 4.3 KB
layout title date categories tags
post
ssmtp-命令行发送邮件
2016-10-07 07:14:44 -0700
IT
System Bash

想在提交任务后在任务完成时发送邮件到指定邮箱进行通知.

经搜索有说安装mailutils来执行mail的, 有安装ssmtp来发送邮件的. 经测试SSMTP可行.

SSMTP只使用SMTP提供发送功能, 并不提供收邮件功能. 请注意发送的邮箱smtp功能已开放 ( 尤其163/126系的邮箱, 请自行百度开启SMTP细节)

安装在ubuntu就是sudo apt install ssmtp

然后是配置发送邮箱. 编辑配置文件

sudo vi /etc/ssmtp/ssmtp.conf

#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=username@126.com

# The place where the mail goes. The actual machine name is required no 
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=smtp.126.com:25

# Where will the mail seem to come from?
rewriteDomain=126.com

# The full hostname
hostname=Your-Hostname

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES

AuthUser=username
AuthPass=userpasswd

UseTLS=Yes
UseSTARTTLS=Yes 

基本要做的是更改root (发送邮箱名), mailhub (邮箱服务地址), 添加后面四项. FromLineOverride 哪一项取消注释, hostname是你主机名, 其实无所谓的. rewriteDomain一般就是发件人邮箱后半截.

这里mailhub是发件人邮箱提供商所提供的SMTP地址, 包括端口号. 例如:

  • hotmail: smtp-mail.outlook.com:587
  • gmail: smtp.gmail.com:587

这里的密码要注意了, 如果是有这个服务的服务用户名和密码, AuthUser/Pass部分记得是那个名和密码而不是邮箱的密码.

随后, 就可以使用 ssmtp receiver@mail.com 来给收件人发邮件了. 输入这个命令后, 进入输入状态, 输入完成后以Ctrl+D 结束.

To: recipient_email@example.com
From: myemailaddress@gmail.com
Subject: test email

Hello World!

上面是发送输入的实例. 这里, To和From的位置是无所谓的 (注意From: 后面有个空格哦), 发送内容在所有抬头后空一行输入.

然后测试成功后, 应该没有返回信息, 如果有, 就要检查问题了. 问题会有:

  • 发送人From部分和ssmtp指定发送人不一致. 额, 为啥都指定了还要再输入一次呢..
  • 554 DT:SPM : 这个问题可就多了.. 官方解释说是 表示发件人发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。表示发件人发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件。 另外, 我在用126邮箱发给hotmail邮箱时无论怎样都会这个错, 但是不写 To: 部分倒是可以发送 (但邮件发送到ssmtp命令的邮箱后显示没有收件人(这是伪收件人,可以指定别的地址,这个地址收不到邮件的))

还有些高级用法, 例如设置别名: sudo vi /etc/ssmtp/revaliases, 可以设置别名, 但其实也没有必要. 详细可以参考附录的reference帖子.

我进一步封装了发送的方法为一个sendmail 脚本, 输入 sendmail "receiver@qq.com" A B C 就可以根据模板改变发送对象和内容. 如果更简单, 就是将$2 替换为固定收件人邮箱, ${@:2} 替换为$@, 这样就会接收所有参数到脚本指定部分.

#! /bin/bash                                                                    

echo "From: user@126.com
To: $2
Subject: Calculation result for ${@:2} from Hom-Home

The job for ${@:2} finish! Please check it soon~
" | ssmtp $2

在运行任务后, 执行以上sendmail 脚本 (或者直接某个ssmtp命令), 就可以实现任务完成后发送邮件通知了~ 示例如下脚本交任务:

#! /bin/bash                                                                                                                   

# Setup job running environment
source ~/setup.sh
# submit job
nohup mission $1 >> nohup.out 2>&1 &

sendmail "receiver@qq.com" Mission job $1

Reference