`
芝加哥09
  • 浏览: 60542 次
社区版块
存档分类
最新评论

动手写批量邮件发送器

    博客分类:
  • Java
阅读更多

在推广当中一定会用到的武器,那就是发送大量的营销性质的邮件。对于个人站长来说,也会用到,用于推广的自己的站点。同时由于搭建smtp服务器需要一定的技术及成本,为此我们可以利用一些免费的smtp服务器。比如说,新浪邮箱、网易邮箱、雅虎邮箱等等都会提供smtp服务,但是免费的smtp服务器会有发送邮件数目的限制,为此需要申请很多这样的邮箱,然后随机挑选一个邮箱来发送邮件。

 



 
基上以上的这些需求,我编写了一个利用线程池,随机挑选发信箱的批量邮件发送器。在此分享给各位学友。。。

 

EmailConfig.java

这是发信邮件的配置类:

 

package com.tongtongxue.mail;

public class EmailConfig {
    private String username;
    private String password;
    private String smtpHost;
    private String serverPort;
    private boolean isSSL;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSmtpHost() {
        return smtpHost;
    }

    public void setSmtpHost(String smtpHost) {
        this.smtpHost = smtpHost;
    }

    public String getServerPort() {
        return serverPort;
    }

    public void setServerPort(String serverPort) {
        this.serverPort = serverPort;
    }

    public boolean isSSL() {
        return isSSL;
    }

    public void setSSL(boolean isSSL) {
        this.isSSL = isSSL;
    }
}

 

EmailContent.java

这是邮件内容的封装类:

package com.tongtongxue.mail;

public class EmailContent {
    private String subject;
    private String content;

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

 

EmailAuthenticator.java

这是用于发信邮件的用户名密码校验类:

package com.tongtongxue.mail;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class EmailAuthenticator extends Authenticator {
    private String username;
    private String password;

    public EmailAuthenticator() {
    }

    public EmailAuthenticator(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password);
    }
}

 

RandomUtil.java

这是产生随机数的工具类:

package com.tongtongxue.mail;

import java.util.Random;

public class RandomUtil {

    public static int getRandomInt(int size) {
        Random random = new Random();
        return random.nextInt(size);
    }
}

 

EmailHelper.java

这是邮件发送器的核心类:

package com.tongtongxue.mail;

import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

public class EmailHelper {
    private ExecutorService executorService;

    public EmailHelper() {
        // 默认启动线程个数为10的线程池
        executorService = Executors.newFixedThreadPool(10);
    }

    public EmailHelper(int num) {
        // 指定初始化线程个数为num的线程池
        executorService = Executors.newFixedThreadPool(num);
    }

    public void sendMail(List receiveAdds, List emailConfigs, EmailContent emailContent) {
        // 用于发送邮件的邮箱配置个数
        int size = emailConfigs.size();

        // 循环待发送的邮箱地址
        for (String receiveAdd : receiveAdds) {
            // 随机获取一个用于发送邮件的邮箱配置
            EmailConfig emailConfig = emailConfigs.get(RandomUtil.getRandomInt(size));
            executorService.execute(new EmailItem(emailConfig, emailContent, receiveAdd));
        }
    }

    public void shutdown() {
        executorService.shutdown();
    }

    /**
     * 这个内部类,是真正用于发送邮件
     */
    class EmailItem implements Runnable {
        private EmailConfig emailConfig;
        private EmailContent emailContent;
        private String receiveAdd;

        public EmailItem(EmailConfig emailConfig, EmailContent emailContent, String receiveAdd) {
            this.emailConfig = emailConfig;
            this.emailContent = emailContent;
            this.receiveAdd = receiveAdd;
        }

        @Override
        public void run() {
            Properties prop = new Properties();
            prop.put("mail.smtp.host", emailConfig.getSmtpHost());
            prop.put("mail.smtp.port", emailConfig.getServerPort());
            prop.put("mail.smtp.auth", "true");
            String username = emailConfig.getUsername();
            EmailAuthenticator authenticator = new EmailAuthenticator(username, emailConfig.getPassword());
            // 如果需要ssl来发送邮件,则
            if (emailConfig.isSSL()) {
                prop.put("mail.smtp.socketFactory.port", emailConfig.getServerPort());
                prop.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            }

            // 根据邮件会话属性和密码验证器构造一个发送邮件的session
            Session sendMailSession = Session.getDefaultInstance(prop, authenticator);
            sendMailSession.setDebug(false);

            try {
                // 根据session创建一个邮件消息
                Message mailMessage = new MimeMessage(sendMailSession);
                // 设置自定义发件人昵称
                String nick = MimeUtility.encodeText("通通学");
                // 创建邮件发送者地址
                Address from = new InternetAddress(nick + " ");
                // 设置邮件消息的发送者
                mailMessage.setFrom(from);
                // 创建邮件的接收者地址,并设置到邮件消息中
                Address to = new InternetAddress(receiveAdd);
                // Message.RecipientType.TO属性表示接收者的类型为TO
                mailMessage.setRecipient(Message.RecipientType.TO, to);
                // 设置邮件消息的主题
                mailMessage.setSubject(emailContent.getSubject());
                // 设置邮件消息发送的时间
                mailMessage.setSentDate(new Date());
                // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
                Multipart mainPart = new MimeMultipart();
                // 创建一个包含HTML内容的MimeBodyPart
                BodyPart html = new MimeBodyPart();
                // 设置HTML内容
                html.setContent(emailContent.getContent(), "text/html; charset=utf-8");
                mainPart.addBodyPart(html);
                // 将MiniMultipart对象设置为邮件内容
                mailMessage.setContent(mainPart);
                // 发送邮件
                Transport.send(mailMessage);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

 

Main.java

这是用于测试的类:

package com.tongtongxue.mail;

import java.util.ArrayList;
import java.util.List;

/**
 * 用于测试发送邮件的类
 */
public class Main {

    public static void main(String[] args) {
        // 初始化用于发送邮件的邮箱配置
        List emailConfigs = initEmailConfigs();
        // 初始化接收邮件的email地址
        List receiveAdds = initReceiveAdds();
        // 初始化邮件发送的内容
        EmailContent emailContent = initEmailContent();

        // 初始化<a href="http://www.tongtongxue.com/tags/%e9%82%ae%e4%bb%b6%e5%8f%91%e9%80%81%e5%99%a8" title="查看更多关于邮件发送器的文章" target="_blank">邮件发送器</a>
        EmailHelper emailHelper = new EmailHelper();
        emailHelper.sendMail(receiveAdds, emailConfigs, emailContent);

        emailHelper.shutdown();

    }

    private static List initEmailConfigs() {
        List emailConfigs = new ArrayList();
        EmailConfig emailConfig01 = new EmailConfig();
        emailConfig01.setUsername("xxxxx@163.com");
        emailConfig01.setPassword("xxxxx");
        emailConfig01.setServerPort("25");
        emailConfig01.setSmtpHost("smtp.163.com");
        emailConfig01.setSSL(false);
        emailConfigs.add(emailConfig01);

        EmailConfig emailConfig02 = new EmailConfig();
        emailConfig02.setUsername("xxxxx@yahoo.com");
        emailConfig02.setPassword("xxxxx");
        emailConfig02.setServerPort("465");
        emailConfig02.setSmtpHost("smtp.163.com");
        emailConfig02.setSSL(true);
        emailConfigs.add(emailConfig02);

        return emailConfigs;
    }

    private static List initReceiveAdds() {
        List receiveAdds = new ArrayList();
        receiveAdds.add("xxxxx@qq.com");
        receiveAdds.add("xxxxx@qq.com");
        receiveAdds.add("xxxxx@qq.com");
        return receiveAdds;
    }

    private static EmailContent initEmailContent() {
        EmailContent emailContent = new EmailContent();
        emailContent.setSubject("测试邮件邮件");
        emailContent.setContent("<title>Test</title><h1>这是一封测试邮件。。。欢迎来到通通学,http://www.tongtongxue.com</h1>");
        return emailContent;
    }
}

 

本文转载:通通学 - 知识学习与分享平台

转载链接:http://www.tongtongxue.com/archives/282.html

  • 大小: 10.4 KB
5
3
分享到:
评论
2 楼 芝加哥09 2015-11-30  
netkiller.github.com 写道
这活不如交给运维干,使用shell, php, python, perl 10行就搞定。


嗯。。。有道理,但是作为java程序员,我还是更喜欢用java语言来实现。。。
1 楼 netkiller.github.com 2015-11-30  
这活不如交给运维干,使用shell, php, python, perl 10行就搞定。

相关推荐

    批量邮件发送附件.zip

    在IT领域,批量邮件发送是一项常见的任务,尤其在企业中用于通知、营销或者报告分发。这个名为"批量邮件发送附件.zip"的压缩包显然包含了工具和资源来帮助用户实现这一目的。主要涉及两个文件:java_email.jar和批量...

    Spring 高效批量邮件发送

    在本话题中,我们将探讨“Spring高效批量邮件发送”这一技术点,这通常涉及到Spring框架中的邮件服务模块以及如何优化邮件发送的效率。 首先,Spring框架的MailSender接口是处理邮件发送的核心组件。它提供了send()...

    boolcms批量邮件发送(c# winform 源码)

    boolcms.com批量邮件发送 将excel每行记录发送给单独的收件人, 准备工作,excel2003格式,第一例为邮件接收地址。 调用本地Outlook发送邮件 试用人群:hr工资表的邮件发送通知。 PS:表头将作为邮件内容的表头。...

    批量发送邮件 VB源码

    在批量发送时,应合理设置发送间隔,避免一次性发送过多邮件导致邮件服务器拒绝服务,或者被邮件服务商标记为垃圾邮件源。 在压缩包中的"免帐号 批量发送邮件"可能是指一种无需预先验证或登录邮箱账号即可发送邮件...

    邮件附件批量发送系统

    这是一个用java写的邮件附件批量发送系统,JDK为1.6,它可以把一个文件夹中所有文件及子目录的所有文件批量的发送,发送是一个文件一封邮件的形式发送 使用手册在下面的地址哦! ...

    匿名发送邮件软件(可批量发送)

    为了高效地完成这项任务,通常需要借助专门的批量邮件软件或服务,这些工具能自动化处理大量邮件的发送,节省人力并提高效率。但同时,批量发送邮件也需要遵守反垃圾邮件政策,否则可能会被邮件服务商标记为垃圾邮件...

    邮件批量发送器(含源码).rar

    【标题】"邮件批量发送器(含源码).rar" 提供的是一个基于.NET平台的邮件批量发送工具的源代码,这通常是一个用于自动化发送大量电子邮件的程序。开发者或者学习者可以通过阅读和分析源码来了解如何利用.NET框架实现...

    批量发送邮件 C# 附源码

    在C#编程环境中,批量发送邮件是一项常见的任务,特别是在企业级应用中,如通知、营销邮件等场景。本文将深入探讨如何使用C#实现这一功能,同时结合提供的源码进行解析,帮助你理解和掌握批量发送邮件的核心技术。 ...

    邮件(附件)发送器

    6. 批量发送和自动化:"邮件(附件)发送器"可能具备批量发送邮件的能力,这对于营销邮件、通知邮件或报告分发非常有用。它可以接受预设的收件人列表,自动填充邮件内容,然后逐一发送。此外,可能还支持定时发送,...

    邮件发送器 邮件自动发送器 邮件接收器V1.2 下载

    邮件发送器和邮件接收器是IT领域中用于通信和数据传输的重要工具,尤其在商业环境中,它们被广泛用于日常的工作沟通、营销活动以及自动化任务处理。邮件自动发送器是这样的工具的一个实例,它允许用户预设邮件内容和...

    js 特效 html 特效 批量邮件发送

    js 特效 html 特效 批量邮件发送 js 特效 html 特效 批量邮件发送

    邮件批量发送器(含源码)

    【邮件批量发送器(含源码)】是一个基于C#编程语言开发的工具,用于高效地向多个收件人发送电子邮件。这个工具的核心功能是批量处理邮件地址,减少了手动发送邮件的时间和工作量,尤其适用于企业或个人需要进行大规模...

    邮件发送器V10

    1. **批量发送**:支持一次性向大量收件人发送邮件,适用于群发通知、营销推广等场景,极大地提高了工作效率。 2. **个性化定制**:可以针对每个收件人设置不同的邮件内容,实现个性化发送,提升邮件的阅读率和回应...

    C#批量发送邮件-发送excel中的数据

    C#批量发送邮件-发送excel中的数据 C#批量发送邮件-发送excel中的数据 C#批量发送邮件-发送excel中的数据 C#批量发送邮件-发送excel中的数据 C#批量发送邮件-发送excel中的数据 C#批量发送邮件-发送excel中的数据 ...

    Excel自动批量发送邮件

    Excel自动批量发送邮件的功能就是一个很好的例子,它可以帮助用户节省大量时间,特别是在需要向多个收件人发送相同或相似内容的邮件时。这个功能结合了Excel的数据管理和VBA(Visual Basic for Applications)编程,...

    php批量发送邮件

    另外,考虑到性能优化,可以使用队列处理批量邮件,先将邮件信息放入数据库或文件系统,然后由后台服务定时读取并发送,避免一次性处理大量邮件导致服务器响应变慢。 以上就是关于PHP批量发送邮件的基本知识和实践...

    王新宇数码广场邮件发送器

    【王新宇数码广场邮件发送器】是一款专为简化邮件发送流程而设计的软件工具,它免去了用户频繁登录QQ邮箱的步骤,提高了发送邮件的效率。这款软件的核心功能是帮助用户快速、方便地发送电子邮件,尤其适用于需要批量...

    邮件自动批量发送精灵\邮件自动批量发送精灵.rar

    总之,《邮件自动批量发送精灵》通过便捷的操作和强大的功能,使得批量邮件发送变得简单易行,是企业或个人进行邮件营销、通知等任务的理想选择。同时,了解其背后的技术原理和使用技巧,有助于更好地利用这款工具。

    批量发送邮件的脚本,适合较小的机构进行邮件批量发送

    在IT行业中,批量发送邮件是一项常见的任务,尤其对于小型机构来说,手动发送大量邮件既耗时又效率低下。为了提高工作效率,我们可以利用编程语言编写脚本来实现自动化批量发送。在这个场景下,"批量发送邮件的脚本...

    Excel 批量发送邮件

    在Excel中实现批量发送邮件的功能,对于处理大量员工工资单这样的任务非常实用。这个功能主要依赖于Excel的宏(VBA,Visual Basic for Applications)来自动化邮件的创建和发送过程,节省了手动逐一发送的时间。以下...

Global site tag (gtag.js) - Google Analytics