利用Java代码群发邮件

简介: 利用Java代码群发邮件

利用java代码发送邮件,结合网上搜来的资料,我适当进行了改造,改为利用java代码群发邮件.现将代码复制整理如下:


注意事项:


纯java开发的话,JDK1.6以外,需要导入这里自己打包的mail.jar.另外前三个类必须放同一包中。当然如果是javaEE,你完全不用担心了,直接建类复制,或者下载用都行)。


第一个类 : 邮件发送类

package com.crt.settlement.service.test;
import java.util.Properties;
/**
 * 邮件发送类
 *
 */
public class MailSenderInfo {
     // 发送邮件的服务器的IP(或主机地址)
     private String mailServerHost;
     // 发送邮件的服务器的端口
     private String mailServerPort;
     // 发件人邮箱地址
     private String fromAddress;
     // 收件人邮箱地址
     private String toAddress;
     // 登陆邮件发送服务器的用户名
     private String userName;
     // 登陆邮件发送服务器的密码
     private String password;
     // 是否需要身份验证
     private boolean validate = false;
     // 邮件主题
     private String subject;
     // 邮件的文本内容
     private String content;
     // 邮件附件的文件名
     private String[] attachFileNames;
     public Properties getProperties() {
      Properties p = new Properties();
      p.put("mail.smtp.host", this.mailServerHost);
      p.put("mail.smtp.port", this.mailServerPort);
      //设置是否安全验证,默认为false,一般情况都设置为true
      p.put("mail.smtp.auth", validate ? "true" : "false");  
      return p;
     }
     public String getMailServerHost() {
      return mailServerHost;
     }
     public void setMailServerHost(String mailServerHost) {
      this.mailServerHost = mailServerHost;
     }
     public String getMailServerPort() {
      return mailServerPort;
     }
     public void setMailServerPort(String mailServerPort) {
      this.mailServerPort = mailServerPort;
     }
     public boolean isValidate() {
      return validate;
     }
     public void setValidate(boolean validate) {
      this.validate = validate;
     }
     public String[] getAttachFileNames() {
      return attachFileNames;
     }
     public void setAttachFileNames(String[] fileNames) {
      this.attachFileNames = fileNames;
     }
     public String getFromAddress() {
      return fromAddress;
     }
     public void setFromAddress(String fromAddress) {
      this.fromAddress = fromAddress;
     }
     public String getPassword() {
      return password;
     }
     public void setPassword(String password) {
      this.password = password;
     }
     public String getToAddress() {
      return toAddress;
     }
     public void setToAddress(String toAddress) {
      this.toAddress = toAddress;
     }
     public String getUserName() {
      return userName;
     }
     public void setUserName(String userName) {
      this.userName = userName;
     }
     public String getSubject() {
      return subject;
     }
     public void setSubject(String subject) {
      this.subject = subject;
     }
     public String getContent() {
      return content;
     }
     public void setContent(String textContent) {
      this.content = textContent;
     }
}


第二个类 : 发送邮件类

package com.crt.settlement.service.test;
import java.util.Date;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
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;
/**
 * 发送邮件的类
 * 
 *
 */
public class SimpleMailSender {
    public boolean sendTextMail(MailSenderInfo mailInfo) {
        // 判断是否需要身份认证
        MyAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
        if (mailInfo.isValidate()) {
            // 如果需要身份认证,则创建一个密码验证器
            authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
        }
        // 根据邮件会话属性和密码验证器构造一个发送邮件的session
        Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
        try {
            // 根据session创建一个邮件消息
            Message mailMessage = new MimeMessage(sendMailSession);
            // 创建邮件发送者地址
            Address from = new InternetAddress(mailInfo.getFromAddress());
            // 设置邮件消息的发送者
            mailMessage.setFrom(from);
            // 创建邮件的接收者地址,并设置到邮件消息中
            // 发送给多人
            String toList = getMailList(mailInfo.getToAddress().split(","));
            InternetAddress[] iaToList = new InternetAddress().parse(toList);
            // Message.RecipientType.TO属性表示接收者的类型为TO
            mailMessage.setRecipients(Message.RecipientType.TO, iaToList);
            // 设置邮件消息的主题
            mailMessage.setSubject(mailInfo.getSubject());
            // 设置邮件消息发送的时间
            mailMessage.setSentDate(new Date());
            // 设置邮件消息的主要内容
            String mailContent = mailInfo.getContent();
            mailMessage.setText(mailContent);
            mailMessage.saveChanges();
            // 发送邮件
            Transport.send(mailMessage);
            return true;
        } catch (MessagingException ex) {
            ex.printStackTrace();
        }
        return false;
    }
    public static boolean sendHtmlMail(MailSenderInfo mailInfo) {
        // 判断是否需要身份认证
        MyAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
        // 如果需要身份认证,则创建一个密码验证器
        if (mailInfo.isValidate()) {
            authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
        }
        // 根据邮件会话属性和密码验证器构造一个发送邮件的session
        Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
        try {
            // 根据session创建一个邮件消息
            Message mailMessage = new MimeMessage(sendMailSession);
            // 创建邮件发送者地址
            Address from = new InternetAddress(mailInfo.getFromAddress());
            // 设置邮件消息的发送者
            mailMessage.setFrom(from);
            // 创建邮件的接收者地址,并设置到邮件消息中
            // 发送给多人
            String toList = getMailList(mailInfo.getToAddress().split(","));
            InternetAddress[] iaToList = new InternetAddress().parse(toList);
            // Message.RecipientType.TO属性表示接收者的类型为TO
            mailMessage.setRecipients(Message.RecipientType.TO, iaToList);
            // 设置邮件消息的主题
            mailMessage.setSubject(mailInfo.getSubject());
            // 设置邮件消息发送的时间
            mailMessage.setSentDate(new Date());
            // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
            Multipart mainPart = new MimeMultipart();
            // 创建一个包含HTML内容的MimeBodyPart
            BodyPart html = new MimeBodyPart();
            // 设置HTML内容
            html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
            mainPart.addBodyPart(html);
            // 将MiniMultipart对象设置为邮件内容
            mailMessage.setContent(mainPart);
            mailMessage.saveChanges();
            // 发送邮件
            Transport.send(mailMessage);
            return true;
        } catch (MessagingException ex) {
            ex.printStackTrace();
        }
        return false;
    }
    private static String getMailList(String[] mailArray) {
        StringBuffer toList = new StringBuffer();
        int length = mailArray.length;
        if (mailArray != null && length < 2) {
            toList.append(mailArray[0]);
        } else {
            for (int i = 0; i < length; i++) {
                toList.append(mailArray[i]);
                if (i != (length - 1)) {
                    toList.append(",");
                }
            }
        }
        return toList.toString();
    }
}


第三个类 : 邮件认证器

package com.crt.settlement.service.test;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
/**
 * 邮件用户名和密码认证器
 *
 */
public class MyAuthenticator extends Authenticator{
     String userName = null;
     String password = null;
     public MyAuthenticator() {
     }
     public MyAuthenticator(String username, String password) {
      this.userName = username;
      this.password = password;
     }
     protected PasswordAuthentication getPasswordAuthentication() {
      return new PasswordAuthentication(userName, password);
     }
}


第四个类 : 测试类:


需要注意,当中需要自己修改的地方都已经做了配置,值的一提的事:


  1. 服务器的ip和port是在网上可以轻松查到的,您需要用什么邮箱发,就设置成对应邮箱的服务器。


  1. 发邮件别用刚申请的邮箱,一般刚申请的邮箱是不会给你这个权限的,要不就是需要绑定,要不就是有一定期限。建议测试时用自己已经用过很久的qq邮箱或者163等其他邮箱。


  1. 对于使用qq邮箱发送,需要在QQ邮箱中进行如下设置上的更改:在登录QQ邮箱后台在"设置"=》账号中开启POP3/SMTP服务 ,如下图所示:


网络异常,图片无法展示
|

QQ 邮箱通过生成授权码来设置密码:
网络异常,图片无法展示
|

package com.crt.settlement.service.test;
/**
 * 设置数据,开始发送
 *
 */
public class SendMailDemo {
     public static void main(String[] args) {
          // 设置邮件服务器信息
          MailSenderInfo mailInfo = new MailSenderInfo();
          mailInfo.setMailServerHost("smtp.qq.com");// 发送邮件的服务器的IP(或主机地址)
          mailInfo.setMailServerPort("587");
         // mailInfo.setMailServerHost("smtp.163.com");// 发送邮件的163服务器的IP(或主机地址)
         // mailInfo.setMailServerPort("25");
          mailInfo.setValidate(true);
          // 邮箱用户名(根据自己情况设置)
          mailInfo.setUserName("91***01183@qq.com");
          // 邮箱密码(根据自己情况设置)(注意此处密码为授权码)
          mailInfo.setPassword("rueqjpdgcvrgbbje");
          // 发件人邮箱(根据自己情况设置,如果你没对邮箱进行特别设置,应该和邮箱用户名一致)
          mailInfo.setFromAddress("91***01183@qq.com");
          // 收件人邮箱(根据自己情况设置)
          //设置为发送给多人
          mailInfo.setToAddress("xidahuanghui@163.com,7633434534@qq.com");
          // 邮件标题
          mailInfo.setSubject("测试Java发送邮件");
          // 邮件内容
          StringBuffer buffer = new StringBuffer();
          buffer.append("地址:");
          buffer.append("测试测试测试");
          mailInfo.setContent(buffer.toString());
          // 发送邮件
          SimpleMailSender sms = new SimpleMailSender();
          // 发送文体格式
          sms.sendTextMail(mailInfo);
          // 发送html格式
          SimpleMailSender.sendHtmlMail(mailInfo);
          System.out.println("邮件发送完毕");
         }
}


参考文档:
  1. java发送邮件   http://www.cnblogs.com/AK-BB/p/java_sender_email.html


  1. javamail向多人发送邮件例子代码  http://itspace.iteye.com/blog/558992


  1. java发送邮件  http://www.runoob.com/java/java-sending-email.html
相关文章
|
9天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
19 5
Java反射机制:解锁代码的无限可能
|
5天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
28 3
|
11天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
40 10
|
6天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
5天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
13天前
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
25 6
|
13天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
14天前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
36 3
|
14天前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
24 1
|
16天前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。