使用mail/mailx通过office365 SMTP发送邮件

Mailx是一个智能邮件处理系统,提供POSIX mailx命令功能,提供MIME、IMAP、POP3、SMTP和S/MIME扩展,通过调用sendmail来发送邮件。

安装mailx:

# yum install mailx

mailx语法

mailx [-BDdEFintv~] [-s subject] [-a attachment ] [-c cc-addr] [-b bcc-addr] [-r from-addr] [-h hops] [-A account] [-S variable[=value]] to-addr . . .
mailx [-BDdeEHiInNRv~] [-T name] [-A account] [-S variable[=value]] -f [name]
mailx [-BDdeEinNRv~] [-A account] [-S variable[=value]] [-u user]

发送邮件

Options

选项 说明
-s subject 主题
-a attachment 附件
-c cc-addr 抄送地址
-b bcc-addr 密送地址
-r from-addr 发件人地址
-h hops 用指定的hop count调用sendmail(hopcount_limit),当使用SMTP时无效
-A account 执行一account命令
to-addr 收件人地址

说明:
hop是源到目标路径中的一个部分,数据包通过路由器、网关等传输,每经过的一个网络设备即为一个hop。

发送本地邮件

$ echo "Hello COCO" | mail -s "Hello COCO" [email protected]

以上命令向本地用户ec2-user发送了一个邮件,邮件保存在文件/var/mail/ec2-user内,内容如下:

From [email protected]  Wed Nov  7 09:44:20 2018
Return-Path: <[email protected]>
X-Original-To: [email protected]
Delivered-To: [email protected]
Received: by techqa-nfe-ansible.iata-awscn.org (Postfix, from userid 1000)
        id 7C28999A79; Wed,  7 Nov 2018 09:44:20 +0000 (UTC)
Date: Wed, 07 Nov 2018 09:44:20 +0000
To: [email protected]
Subject: Hello COCO
User-Agent: Heirloom mailx 12.5 7/5/10
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-Id: <[email protected]>
From: [email protected] (Cloud User)

Hello COCO

从文件读取内容发送:

$ mail -s "Hello COCO" [email protected] < hello.txt
或
$ cat hello.txt | mail -s "Hello COCO" [email protected]

向多人发送:

$ mail -s "Hello COCO" [email protected],[email protected] < hello.txt

发送附件:

$ echo "Hello COCO" | mail -s "Hello COCO" -a hello.txt [email protected]

指定Reply To:

$ echo "Hello COCO" | mail -s "Hello COCO" -S replyto="Jason<[email protected]>"  [email protected]

读取邮件

Options

选项 说明
-T name 文件名,将邮件信息中‘Message-Id‘ 和 ‘Article-Id‘写入文件
-f [name] 从指定文件读取邮件

执行不带任何参数的mailx命令,将读取当前用户的邮件,输入quit退出。输出内容如下:

Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/ec2-user": 1 message
>   1 Cloud User            Thu Nov  8 05:41  32/1017  "Hello COCO"
&

从文件读取邮件并将Message-Id写入文件

$ mailx -T test -f /var/mail/ec2-user

使用Office365 SMTP发送邮件

SMTP Options

使用外部SMTP服务器时,需用-S设定SMTP参数:

$ echo "Hello COCO" | mail -r "[email protected]" -s "Hello COCO" -S smtp="smtp.office365.com:587" -S smtp-use-starttls -S smtp-auth=login -S smtp-auth-user="[email protected]" -S smtp-auth-password="password" -S ssl-verify=ignore -S nss-config-dir=~/.mozilla/firefox/default.clm [email protected]
选项 说明
smtp 指定SMTP地址(host ip:port)
smtp-use-starttls 使用TLS加密来保证通讯安全
smtp-auth 设置SMTP验证方法,可选值: login、cram-md5、plain
smtp-auth-user SMTP验证用户名
smtp-auth-password SMTP密码
ssl-verify SSL证书验证出错时的处理方式,可选值:strict、ask、warn、ignore
nss-config-dir 包含文件certN.db、keyN.db、secmod.db的目录

nss-config-dir: 从certN.db中检索证书, 从keyN.db中检索私钥,N为数字。系统如安装了Firefox,其profile中包含这些文件。

运行如上命令可以发送邮件,但有错误:Error in certificate: Peer‘s certificate issuer is not recognized。原因是未导入office365的证书。上例nss-config-dir配置的是firefox profile目录,虽然mailx仅读取其内容不会修改,但若mailx正在运行时其内容被firefox修改时,会导致错误。因此实际应用中,需将certN.db、keyN.db、secmod.db复制到新的目录,或使用certutil创建这些文件。

certutil

certutil是证书和密钥管理工具
语法:

certutil [options] [[arguments]]
Options 选项 说明
-A 添加证书
-D 删除证书
-F 删除私钥
-G 生成密钥对
-L 列出所有证书
-M ×××的trust属性,需使用-t参数
-N 创建证书和密钥数据库
-V 检查证书

Arguments
-d 包含证书和密钥数据库文件的目录
-n nickname,指定证书或密钥的nickname
-t trust参数

创建证书和密钥数据库

$ mkdir ~/.certs
$ certutil -N -d ~/.certs
Enter a password which will be used to encrypt your keys.
The password should be at least 8 characters long,
and should contain at least one non-alphabetic character.

Enter new password:
Re-enter password:

获取office 365证书

$ echo -n | openssl s_client -starttls smtp -crlf -connect smtp.office365.com:587 | sed -ne ‘/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p‘ > ~/.certs/office365.crt

然后在Windows下导出Root CA:

  1. 在Windows下打开office365.crt

  1. 选中Root CA(DigiCert),点击View Certificate,然后选中Details选项卡,点击Copy to File

  1. 根据证书导出向导导出证书。


将根证书导入:

$ certutil -A -n "DigiCert Global Root CA" -t "C,P,C" -d ~/.certs -i ~/.certs/DigiCert.cer

说明:
-t trust参数,对于每个证书有三类trust参数,顺序是:SSL、email、object signing,参数可以使用none、any或以下属性代码:
? p - Valid peer
? P - Trusted peer (implies p)
? c - Valid CA
? C - Trusted CA (implies c)
? T - trusted CA for client authentication (ssl server only)

检查证书:

$ certutil -L -d ~/.certs

再次执行如下命令将完全正常的发送邮件。

$ echo "Hello COCO" | mail -r "[email protected]" -s "Hello COCO" -S smtp="smtp.office365.com:587" -S smtp-use-starttls -S smtp-auth=login -S smtp-auth-user="[email protected]" -S smtp-auth-password="password" -S ssl-verify=ignore -S nss-config-dir=~/.certs [email protected]

配置mail.rc

如发送邮件时每次都配置SMTP参数,比较繁琐,可以在文件/etc/mail.rc设置默认值,在其末尾添加如下内容:

set [email protected]
set smtp=smtp.office365.com:587
set smtp-auth=login
set [email protected]
set smtp-auth-password=abc123
set smtp-use-starttls
set ssl-verify=ignore
set nss-config-dir=~/.certs

再次运行如下命令测试:

$ echo "Hello COCO" | mail  -s "Hello COCO" [email protected]

参考文档

Linux mailx command
Linux sendmail command
certutil (1) - Linux Man Pages
9 mail/mailx command examples to send emails from command line on Linux

原文地址:http://blog.51cto.com/7308310/2315192

时间: 2024-08-28 18:54:58

使用mail/mailx通过office365 SMTP发送邮件的相关文章

Linux下mail/mailx命令发送邮件

最近看到项目中经常会用mail/mailx命令发送由java程序生成的report,比较新鲜.下面就简单介绍下mail/mailx命令用法.本文以mail命令举例(mail/mailx)效果都是一样的. 把打印的内容作为标准输入,送给mail命令 [[email protected] www]# echo "Hello, Tough" | mail -s "Tough's Greeting" [email protected] -s表示主题,"< m

使用 phpMailer 基于(SMTP) 发送邮件

PHPMailer是一个用于发送电子邮件的PHP函数包.它提供的功能包括:在发送邮时指定多个收件人,抄送地址,暗送地址和回复地址.支持多种邮件编码包括:8bit,base64,binary和quoted-printable.支持SMTP验证.支持带附件的邮件和Html格式的邮件. 实现代码 : <?php include 'class.smtp.php'; include 'class.phpmailer.php'; $mail = new PHPMailer; $mail->isSMTP()

通过SMTP发送邮件的Python代码

贴上一段用Python开发的发送邮件程序 #coding=UTF-8 import smtplib from email.mime.text import MIMEText smtp_host="smtp.163.com" smtp_port="25" mail_user="[email protected]" mail_password="1111222" def send_mail(to_list,subject,cont

再谈用java实现Smtp发送邮件之Socket编程

很多其它内容欢迎訪问个人站点   http://icodeyou.com 前几天利用Socket实现了用java语言搭建webserver,全程下来应该会对Socket这个东西已经使用的很熟悉了.尽管抽象,可是使用过一次之后就会感受到它在网络通信上的作用是多么的强大.正好,今天就继续用Socket来练习使用下面Smtp协议发送一封简单的电子邮件.今天的故事呢,是我要约我女神出去吃饭啦啦啦~~~所以,面对Smtp.仅仅许成功,不许失败. 全局假定我的邮箱为[email protected]   女

将PHPMailer整合到ThinkPHP中实现SMTP发送邮件

ThinkPHP没有邮件发送的功能,于是,我就想了想,就将PHPMailer整合到ThinkPHP中吧. PHPMailer是不符合ThinkPHP规范的插件程序,所以,我们需要先将PHPMailer程序放到ThinkPHP的 Library/Vendor目录下,我这里是最新版的ThinkPHP 3.2,如果是是ThinkPHP 3.2之前的版本,可能就是Lib目录了.Vendor目录专门用于存放非标准ThinkPHP插件的目录,如下: PHPMailer整合到ThinkPHP中的存放目录 接下

python通过SMTP发送邮件失败,报错505/535

python通过SMTP发送邮件失败:错误1:smtplib.SMTPAuthenticationError: (550, b'User has no permission')    我们使用python发送邮件时相当于自定义客户端根据用户名和密码登录,然后使用SMTP服务发送邮件,新注册的163邮箱是默认不开启客户端授权的(对指定的邮箱大师客户端默认开启),因此登录总是被拒绝,解决办法(以163邮箱为例):进入163邮箱-设置-客户端授权密码-开启(授权码是用于登录第三方邮件客户端的专用密码)

php中通过curl smtp发送邮件

先google了一下,发现很多问相关问题的但没有相关的解答,在phpclasses里也没有找到相关的类于是自己边看stmp的相关协议边开始尝试curl SMTP协议 这个在网上可以找到多相关的例子,可以自己实验一下使用telnet去连接mail服务器 $ telnet 邮箱SMTP服务地址 25 Trying 邮箱服务IP地址... Connected to 邮箱SMTP服务地址. Escape character is '^]'. exchange邮箱服务器地址 Microsoft ESMTP

WordPress SMTP发送邮件插件:WP SMTP

对于一个网站而言,发送邮件的功能是必不可少的,现在的主机一般都支持发送邮件,但是不同的主机由于函数限制或者某些其他原因,可能造成没办法正常发送邮件.这时候,我们可能就要借助第三方SMTP发送邮件. 对于使用WordPress建站的朋友来说,SMTP发送邮件的插件还是比较多的,功能大多类似,下面以WP SMTP为例讲解一下配置. WP SMTP简介 WP SMTP插件是国人制作的,设置页面的顶部包含了 Gmail邮箱.微软邮箱.163邮箱.QQ邮箱的设置示例,可以点击对应的图标查看示例截图,其他邮

gitlab配置通过smtp发送邮件(QQ exmail腾讯企业为例)

gitlab配置通过smtp发送邮件(QQ exmail腾讯企业为例) 首先祭出官网文档链接:https://docs.gitlab.com/omnibus/settings/smtp.html 其实官网已经说的很清楚了,并且给出了QQ邮箱的范例(BAT还是屌的) 1. 编辑/etc/gitlab/gitlab.rb文件(加到文件最后面就好了).以QQ企业邮箱为例: 1 2 3 4 5 6 7 8 9 gitlab_rails['smtp_enable'] = true gitlab_rails