前言

很多时候我们需要发送邮件,比如定时任务,比如邮件验证码等等。

各大编程语言都可以实现发送邮件功能,但还是太麻烦了,所以通过tcpdump抓包发现smtp发送邮件原理还是很简单嘛。

所以就想着能不能通过shell搞定,这样在Linux平台下就很通用,不必准备各种安装环境啥的。

鉴赏代码

该脚本需要安装sudo apt-get install expect telnet这两个工具,一个负责tcp连接到smtp服务器,一个负责收发指令。

执行./mail.sh xxx@163.com password yyy@qq.com sendMsg 123456命令即可发送一封邮件。

需要注意的是现在各大邮件服务器发送邮件的密码是授权码,而不是登录邮箱密码。

可以试着使用编程语言发送复杂邮件,通过tcpdump抓包分析发送邮件的具体机制,自行模拟一下下就ok了。

#!/bin/bash

user=$1
pass=$2
to=$3
subject=$4
data=$5 username=$(echo -n $user | base64)
password=$(echo -n $pass | base64) expect <<EOF
spawn telnet smtp.163.com 25
expect "220 163.com*" send "EHLO localhost\n"
expect "250 8BITMIME" send "AUTH LOGIN\n"
expect "334 dXNlcm5hbWU6" send "$username\n"
expect "334 UGFzc3dvcmQ6" send "$password\n"
expect "235 Authentication successful" send "MAIL FROM:<$user> BODY=8BITMIME\n"
expect "250 Mail OK" send "RCPT TO: <$to>\n"
expect "250 Mail OK" send "DATA\n"
expect "354 End data with <CR><LF>.<CR><LF>" send "Mime-Version: 1.0\n"
send "From: <$user>\n"
send "To: $to\n"
send "Subject: $subject\n"
send "Content-Type: text/plain; charset=UTF-8\n"
send "Content-Transfer-Encoding: quoted-printable\n\n"
send $data
send "\n.\n"
expect "250 Mail OK*" send "QUIT\n"
expect EOF
EOF

总结

该脚本解决了我的发送邮件验证码的小需求,以前都是通过编程语言去实现,有些有依赖,各种准备环境也麻烦。

而使用上述脚本可以灵活的满足各种需求,需要改动时直接修改shell脚本就ok了。妈妈再也不用担心我发邮件麻烦了。

最新文章

  1. 如何正确的使用json?如何在.Net中使用json?
  2. css元素排列
  3. InfluxDB学习之InfluxDB的HTTP API写入操作
  4. August 26th 2016 Week 35th Friday
  5. CE5 中断
  6. JAVA基础学习day23--GUI基础
  7. Group Shifted Strings
  8. java static
  9. thinkphp中SQLSTATE[42S02]: Base table or view not found: 1146 Table错误解决方法
  10. Android 一步步教你从ActionBar迁移到ToolBar
  11. PHP面向对象编程
  12. iOS内存管理系列之一:对象所有权与引用计数
  13. js页面加载进度条
  14. HDU 4121 Xiangqi
  15. crawler_如何从页面获取新浪cookie
  16. Resin4安装配置
  17. C语言之linux内核可变参实现printf,sprintf
  18. 如何在.Net Core调用NodeJs
  19. 如何用git上传代码到github详细步骤
  20. 解析url成对象形式

热门文章

  1. 《应用计算方法教程》matlab作业一
  2. MySQL中的事务原理和锁机制
  3. Android的Toolbar(含溢出菜单设置[弹出菜单的使用])的使用PopMenu的样式
  4. Spring Boot 集成 MQTT
  5. Python使用import导入模块时执行了模块的文件但报ModuleNotFoundError错误的愚蠢问题
  6. PyCharm中怎么将非当前工程文件的目录的文件加到当前工程中
  7. tensorflow 打印全部变量的一种方法
  8. 软工项目WordCount
  9. js setTimeout运行机制
  10. mybatis-generator 插件用法