Java经验杂谈(1.记PostFix邮件发送性能与有效发送问题)

业务需求:

需要定期给注册会员发送广告,问卷等邮件,每天需要完成百万级的邮件发送。

服务器:
若干台postfix服务器

遇到问题:
对于每天百万级的邮件发送任务,postfix服务器很容易完成,Java客户端包含发送时的业务逻辑处理时间,多起几个线程也很容易做到。
但是,如果发送速度过快,会被邮件服务商列入黑名单而拒收邮件,而每个邮件服务商对接收邮件的速度要求又不一样。

解决方法:
这样,需要针对每个邮件批量发送任务,按照每个邮件服务商能接收的速度来发送邮件。
比如,163每秒3封,sina每秒4封等。

于是我们设计了如下结构的邮件发送系统:

用Redis存储每个域名最后的发送时间,

重复a,b
    a) 获得并锁住可发送的域名。
    b) 针对每一个可发送域名,
      1. 如果相应的域名队列中存在待发送邮件,则发送并更新改域名的最后发送时间。
      2. 解锁该域名发送记录。

这样,对邮件队列采用非阻塞队列,提高了系统的并发性。

看似解决了问题,但还是被部分服务商列入了黑名单。

于是对系统进行分析,如下:
这是一个典型的生产者与消费者问题,Java客户端生产的邮件定时推送到Postfix队列,然后Postfix消费队列上的邮件,发送到目标邮件服务器。
生产一封,发送一封的话,不会有任何问题,但如果队列中存在多封,那么向目标邮件服务器投送的速度就无法控制了。

于是检查postfix队列:
postqueue -p

发现确实堆积了一些邮件。
原因:系统运行中,某一封邮件发送的延迟会导致后面的邮件发送都被延迟。

处置方法:
在Java端进行发送速度的控制显然是治标不治本的,于是用Java端同样的逻辑修改PostFix中邮件发送的代码,
用同样的配置文件,最终从根本上解决了控制邮件发送速度的问题。

原文地址:https://www.cnblogs.com/java123vip/p/9005215.html

时间: 2024-07-29 12:09:01

Java经验杂谈(1.记PostFix邮件发送性能与有效发送问题)的相关文章

跟阿根一起学Java Web开发四:邮件发送与短信发送的实现

邮件发送与短信发送常见于用户注册认证以及系统消息提示功能模块,但实现代码过于繁琐:使用JSPGen后,深感其对邮件发送.短信发送的封装让复杂活变得简单很多. 一.基础配置 1.jspgen-config.xml 在框架基础配置文件中,找到mail节点及sms节点,按如下配置: <!-- 邮件服务 --> <mail status="true"> <smtp> <!-- 发送类型(SMTP MX) --> <type>SMTP&

实战postfix邮件发送

实验环境:               服务器端server: willis.com   172.25.254.1               客户端desktop:  desktop.com   172.25.254.2实验内容: 1.邮件远程发送                 2.邮件别名                 3.邮件群发                 4.空壳邮件服务搭建                 5.不同服务器之间邮件传送(DNS邮件解析)            

Postfix邮件发送和接收实验

Postfix邮件发送和接收实验首先打开三台虚拟机分别是linux.windows7(两台).把三台虚拟机的网卡设置成仅主机模式,linux虚拟机做dns服务器,给两台windows7配置IP和dns地址,IP地址的网段要和dns的地址在同一网段.两台Windows7虚拟机能够ping通dns服务器的地址1.安装dns包bind-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm2.进行主配置文件的配置3.区域配置文件的配置4.指定邮件交换记录5.开启named服务和关闭防火墙及

java windows自动化-mail自动发邮件

本文旨在让测试人员了解如何发邮件 发邮件的话,最简单的事是直接手动发邮件,但是在自动化测试中,应做到让机器或者代码来自动发送邮件,笔者大概了解以下几种方法,总有一款口味适合你:1java代码来做下面即为我的java代码package util;import javax.activation.DataHandler;import javax.activation.FileDataSource;import javax.mail.*;import javax.mail.internet.*;impo

运维学习之postfix邮件系统服务

postfix 一.postfix邮件服务 postfix提供smtp协议用来投递邮件 默认端口25 /var/log/maillog##服务日志 mail [email protected] Subject: hello hello world .#用"."来结束录入内容并发送 mailq##查看邮件队列 postqueue -f##重新处理邮件队列 默认情况下邮件端口只在127.0.0.1上开启 二.测试环境配置 安装dns服务 配置1912文件内容如下 把named.localh

Linux6.5部署Postfix邮件服务器

2-12-部署Postfix邮件服务器实现邮件的收发功能 试验环境: 服务端:xuegod63.cn       IP:192.168.1.63 部署Postfix+Dovecot Postfix:提供邮件发送功能,使用的协议:SMTP,端口:25 Dovecot:提供邮件接收功能,使用的协议:POP3.IMAP,端口:110,143 邮件通信协议 1.SMTP(SimpleMail Transfer Protocol,简单邮件传输协议):主要用于发送和传输邮件.SMTP协议使用的TCP端口为2

Postfix邮件系统安装与配置:Postfix,Cyrus-IMAP,Cyrus-sasl,Dovecot和SPF

最近发现邮件发送服务还是挺重要的.可能对于每天只有一百来封的邮件发送需求的个人博主来说,一个免费的邮箱提供的免费SMTP邮件发送服务就可以满足了,但是对于一些大型的网站.论坛和平台,每天的邮件发送量可以达到上万封以上,免费的邮件发送服务是不能满足需要了. 市场上已经有了不少的付费邮件发送服务,但是终归是第三方的邮件发送服务,在邮件发送方式.邮件内容等方面肯定要受到不少的限制.与其花大量的时间寻找更好的付费邮件服务,还不如自己动手利用VPS或者服务器搭建一个属于自己的邮件发送平台,搭建起来并不复杂

postfix 邮件服务器搭建详解

常见的邮件服务器: Sendmail .Qmail .postfix .Zmaile Exchange  . Notes/Domino Coremail  .U-mail zmailer: 新出的邮件服务器.整合前面的邮件 COREMAIL:最早网易使用的工具 Nores/Domino IBM 必须试用 IBM的硬件设备 U-mail : 收费的软件 postfix: 6版以后是默认安装 红帽中免费开源的邮件服务器 邮件系统角色: MUA(邮件用户代理) MTA (邮件传输代理) MDA (邮件

Linux的postfix邮件服务

一.postfix邮件服务 postfix提供smtp协议用来投递邮件默认端口25/var/log/maillog    服务日志mail [email protected]Subject: hellohello world .                           用"."来结束录入内容并发送mailq                  查看邮件队列postqueue -f      重新处理邮件队列 默认情况下邮件端口只在127.0.0.1上开启 二.环境配置 1.设