从零实现邮件中继服务

news2024/12/23 20:27:19

    • 背景
    • 目的
    • 验证准备
      • 前提
      • 前置过程
      • 网络约束
      • 节点信息
      • 账号信息
    • 具体验证过程
    • 转发测试
    • 相关问题

背景

在当前现场环境中,我们面临着一个重要的问题。我们的系统部署在一个内网环境中,邮件告警模块需要连接公网的邮件服务器以便发送邮件来及时通知我们关键事件和紧急情况,而集群与公共互联网络隔离,导致邮件无法发送。为了解决邮件无法发送的问题,我们需要一个可以连接公网环境的节点,通过该节点将邮件转发到对应的邮件服务器上。

目的

如何在内网集群内,将邮件通过可以连接到公网的机器,然后发送到对应的邮件服务器上,实现邮件告警的目的。
在这里插入图片描述

验证准备

前提

准备一个不通公网的机器,一个可以连接公网的机器
注意:当前使用的环境为centos8,postfix版本为3.x,其他版本或有不同

前置过程

安装2个虚拟机节点,即192.168.96.130和192.168.96.187
在这里插入图片描述

修改每个节点的hostname
在这里插入图片描述
在这里插入图片描述

网络约束

在96.130上的网络配置中将网关移除,然后重启网络服务

在这里插入图片描述
在这里插入图片描述

使得96.130无法访问公网,但可以连接局域网
在这里插入图片描述

节点信息

按照以上步骤完成后,得到一个内网和一个可以通公网的环境,且两者互通,并随时可以根据快照恢复至最初。

节点IP外网访问权限
fs_96_130192.168.96.130×
fs_96_187192.168.96.187

账号信息

选项
发信人账号xxx
发信人授权码xxx
邮件服务器smtp.qq.com
邮件服务器端口465
收件人地址xxx

具体验证过程

1、在96.187(跳板机)上安装postfix软件包,以实现邮件中继功能

在这里插入图片描述

2、alternatives --config mta命令用于查看和设置当前系统上的邮箱服务,此时选择postfix作为邮箱服务。
在这里插入图片描述

3、配置96.187(跳板机),使其在接收到96.130(内网机)的邮件后直接发送出去。
进入到postfix配置目录
在这里插入图片描述

修改主配置文件main.cf,并在其中添加如下内容

注释smtp_tls_security_level = may这一行,即736行
在这里插入图片描述

注释inet_interfaces = localhost这一行,即135行

在这里插入图片描述

然后添加下面的内容

smtp_sasl_auth_enable = yes
# 设置qq发件邮箱的发信人和授权码
smtp_sasl_password_maps = static:发信人账户:发信人授权码
smtp_sasl_security_options = noanonymous
smtp_tls_wrappermode = yes
smtp_tls_security_level = encrypt
header_size_limit = 4096000

# 设置发件邮箱的邮件服务器地址和端口号
relayhost = [smtp.qq.com]:465
# 设置允许接收来自xx网络的邮件
mynetworks=192.168.96.0/24

# 指定邮件服务器监听的网络接口
inet_interfaces = all

然后保存退出

5、重启postfix服务
在这里插入图片描述

转发测试

1、从96.187(跳板机)上下载golang相关包并传到96.130(内网机)上
在这里插入图片描述
在96.130(内网机)上安装相关golang包
在这里插入图片描述
在96.130(内网机)上编写发送邮件的go代码进行测试

package main
 
import (
    "crypto/tls"
    "fmt"
    "log"
    "net/smtp"
)
 
func main() {
    from := "731413853@qq.com"
    to := "lirul@snapmail.cc"
    smtpServer := "192.168.96.187"
    smtpPort := 25
 
    // 邮件内容
    subject := "Hello"
    body := fmt.Sprintf("hello %s, This is the test mail", from)
 
    // 构建邮件内容,包括发件人、收件人、主题和正文
    message := []byte(fmt.Sprintf("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n%s", from, to, subject, body))
 
    // 连接到SMTP服务器
    addr := fmt.Sprintf("%s:%d", smtpServer, smtpPort)
    client, err := smtp.Dial(addr)
    if err != nil {
        log.Fatal("connect mail server failed: ", err)
    }
    defer client.Close()
 
    // 配置TLS并跳过证书验证
    tlsConfig := &tls.Config{InsecureSkipVerify: true}
    if err = client.StartTLS(tlsConfig); err != nil {
        log.Fatal("set tls config failed: ", err)
    }
    // 设置发件人
    if err = client.Mail(from); err != nil {
        log.Fatal("set mail sender failed: ", err)
    }
 
    // 设置收件人
    if err = client.Rcpt(to); err != nil {
        log.Fatal("set mail receiver failed: ", err)
    }
 
    // 发送邮件内容
    w, Er := client.Data()
    if Er != nil {
        log.Fatal("set mail data failed:", Er)
    }
 
    _, err = w.Write(message)
    if err != nil {
        log.Fatal("set mail content failed:", err)
    }
 
    if err = w.Close(); err != nil {
        log.Fatal("set mail writer close failed:", err)
    }
 
    if err = client.Quit(); err != nil {
        log.Fatal("set client quit failed:", err)
    }
    log.Println("send success")
}

在96.130(内网机)上执行代码
在这里插入图片描述
查看96.187(跳板机)的邮件中继服务postfix是否收到邮件并转发
在这里插入图片描述
查看邮箱
在这里插入图片描述

相关问题

出现这种情况时
在这里插入图片描述
检查sasl相关包是否已经安装
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1041246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【KMP算法】C++

KMP算法的原理是通过构建部分匹配表,来利用已经匹配过的信息,避免不必要的回溯。部分匹配表是一个长度与模式字符串相等的数组,用于记录在每个位置上的最长公共前后缀的长度。 这样图片完全表达了KMP算法的核心思想,出处来自添加链…

【postgresql】ERROR: cannot alter type of a column used by a view or rule

修改字段类型 由varchar 改为int8。 具体sql alter table company alter column city_id type int8 using city_id::int8; 返回错误信息 > ERROR: cannot alter type of a column used by a view or rule DETAIL: rule _RETURN on view search_qy depends on column …

什么是LIMS(实验室信息管理系统)?LIMS软件有哪些功能?

LIMS 是实验室信息管理系统(Laboratory Information Management System)的缩写。LIMS 是一种软件,它可以帮助实验室收集、组织和跟踪其数据。这种系统可以提高实验室的效率,同时确保数据的准确性和一致性。 LIMS 可以处理各种实验…

安装Python3.x--Windows

1 下载安装包 确定安装是干什么,要下哪个版本(如果是配置项目环境,最好按项目需求的版本来装) 1.1 官网链接 https://www.python.org 最新版本 指定版本 2 安装说明 点击下载exe,运行自定义安装路径,下…

go字符串拼接方式及性能比拼

在golang中字符串的拼接方式有多种,本文将会介绍比较常用的几种方式,并且对各种方式进行压测,以此来得到在不同场景下更适合使用的方案。 文章目录 1、go字符串的几种拼接方式1.1 fmt.Sprintf1.2 运算符拼接1.3 strings.Join1.4 strings.Bui…

使用redis实现分布式锁

为什么需要分布式锁 在一个分布式系统中,也会涉及多个节点访问同一个公共资源的情况,此时就需要通过锁来做互斥控制,避免出现类似于“线程安全”的问题,而java的synchronized这样的锁只能在当前进程中生效,在分布式的…

【Go】Golang环境配置与语法基础

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Golang环境配置与示例。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路…

【Pycharm/Anaconda配置环境记录】

文章目录 1、Pytorch配置2、mmcv配置 1、Pytorch配置 查看虚拟环境创建虚拟环境 conda env list:查看虚拟环境 conda create --name env_name python3.7:创建虚拟环境 conda activate env_name:激活/进入该虚拟环境 查看自己的CUDA版本以及P…

element-plus-自定义Dialog样式

实现如下 <template><h3>dialog3 test 全局</h3><el-button type"primary" size"default" click"show">全局弹窗</el-button><div class""><!-- 弹窗 --><el-dialog v-model"visi…

使用 Matter-SDK 快速搭建 Matter 环境 (Linux)

Matter 作为一个统一的智能家居互联协议&#xff0c;凭借其高兼容性的特点&#xff0c;正逐渐打破各个智能家居之间的壁垒。乐鑫作为在 Matter 项目发布之初的早期成员&#xff0c;提供了一套开源、完整、易用的 Matter-SDK。 乐鑫的 Matter-SDK 是建立在开源 Matter-SDK 之上…

MySQL - order by排序查询 (查询操作 四)

功能介绍&#xff1a;order by&#xff1a;对查询结果进行排序&#xff0c;执行顺序在查询完结果执行&#xff08;比如where后&#xff09; 排序方式&#xff1a;ASC&#xff1a;升序&#xff08;默认&#xff0c;不用指定&#xff09; DESC&#xff1a;降序 语法&#x…

Android跨进程通信:Binder机制原理

目录 1. Binder到底是什么&#xff1f; 2. 知识储备 2.1 进程空间划分 2.2 进程隔离 & 跨进程通信&#xff08; IPC &#xff09; 2.3 内存映射 2.3.1 作用 2.3.2 实现过程 2.3.3 特点 2.3.4 应用场景 2.3.5 实例讲解 ① 文件读 / 写操作 ② 跨进程通信 3. Bi…

【Java 基础篇】Java 图书管理系统详解

介绍 图书管理系统是一种用于管理图书信息、借阅记录、用户信息等的软件系统。它可以帮助图书馆、书店或个人管理和组织图书资源&#xff0c;提供了方便的借阅和查询功能。在这篇博客中&#xff0c;我们将详细介绍如何使用Java编程语言创建一个简单的图书管理系统。 功能需求…

SpringMVC 学习(一)Servlet

1. Hello Servlet (1) 创建父工程 删除src文件夹 引入一些基本的依赖 <!--依赖--> <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test<…

大模型lora微调-chatglm2

通义千问大模型微调源码&#xff08;chatglm2 微调失败&#xff0c;训练通义千问成功&#xff09;&#xff1a;GitHub - hiyouga/LLaMA-Efficient-Tuning: Easy-to-use LLM fine-tuning framework (LLaMA-2, BLOOM, Falcon, Baichuan, Qwen, ChatGLM2)Easy-to-use LLM fine-tun…

STM32存储左右互搏 I2C总线读写FRAM MB85RC1M

STM32存储左右互搏 I2C总线读写FRAM MB85RC1M 在较低容量存储领域&#xff0c;除了EEPROM的使用&#xff0c;还有铁电存储器FRAM的使用&#xff0c;相对于EEPROM, 同样是非易失性存储单元&#xff0c;FRAM支持更高的访问速度&#xff0c; 其主要优点为没有EEPROM持续写操作跨页…

day06_循环

今日内容 零、 复习昨日 一、循环 二、流程控制关键词 零、 复习昨日 8个基本数据类型 变量的使用步骤 1)声明2)赋值3)使用 声明,数据类型 变量名 不一定非得是基本类型 int a; String s; Scanner scanner;赋值,只要符合类型(能默认转换)就能赋值 int a 1; double d 1; Scann…

uni-app问题记录

一、启动问题记录 1. 报错1 解决办法: 开启微信开发者工具服务端口 2. 报错2:调用getLocation获取位置信息时报错以下内容 {errMsg: “getLocation:fail the api need to be declared in the requiredPrivateInfos field in app.json/ext.json”} 解决办法: manifest.json文…

到广阔的边缘市场去,浪潮信息首次发布全栈边缘计算软硬件新品

出品 | CSDN 云计算 智慧时代&#xff0c;一切皆计算&#xff0c;早已不再是一句口号。据国际研究机构 IDC 数据显示&#xff0c;2023 年超过 50%的企业新增 IT 基础设施会部署在边缘&#xff0c;而 Gartner 研究显示&#xff0c;到 2025 年&#xff0c;超过 75%的数据生成和数…

【ROS入门】使用 ROS 服务(Service)机制实现同步请求与答复

文章结构 任务要求话题模型实现步骤自定义srv定义srv文件编辑配置文件编译 自定义srv调用vscode配置编写服务端实现编写客户端实现 执行启动roscore编译启动客户端和服务端编译启动roscore启动节点 任务要求 编写代码实现 ROS 中的服务请求与答复: 创建服务端&#xff0c;注册…