`
aiou
  • 浏览: 194774 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

javamail 连接服务器一次发送可任意多封邮件,不是每次发送都要重新连接

    博客分类:
  • java
阅读更多
改编自网络

其中附件部分没有测试

import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class SendMail {
    private Session session;        //会话
    private Transport transport;    //发送邮件
    private final String MAIL_SMTP_HOST = "mail.smtp.host";
    private final String MAIL_SMTP_AUTH = "mail.smtp.auth";
    private static Properties props = new Properties();
    
    static{
        if (props == null) {
            props = System.getProperties();
        }
    }
    
    public SendMail(String userName,String password,String host,boolean needAuth) {
       init(userName,password,host,needAuth);
    }
    /**
     * 初始化<code> Session, Transport </code>
     */
    private void init(String userName,String password, String host, boolean needAuth ) {
        SmtpAuth sa = null;
        if(needAuth){
            sa = new SmtpAuth(userName, password);
            // 需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有这一条)
            props.put(MAIL_SMTP_AUTH, "true");
        }else{
            props.put(MAIL_SMTP_AUTH, "false");
        }
       // 设置发送邮件的邮件服务器的属性(这里使用网易的smtp服务器)
       props.put(MAIL_SMTP_HOST, host);
       // 用刚刚设置好的props对象构建一个session
       session = Session.getDefaultInstance(props, sa);
       try {
           transport = session.getTransport("smtp");
           // 连接服务器的邮箱
           transport.connect(host, userName, password);
       } catch (NoSuchProviderException e) {
           e.printStackTrace();
       } catch (MessagingException e) {
           e.printStackTrace();
       }
       System.out.println("与 " + host + " 成功建立会话");
    }
    
    /**
     * <b>登录验证</b>
     */
    class SmtpAuth extends Authenticator {
        private String user, password;

        public SmtpAuth(String getuser, String getpassword) {
            user = getuser;
            password = getpassword;
        }
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(user, password);
        }
    }
    
    
    /**
     * 构造邮件的内容
     *
     * @return
     * @throws AddressException
     * @throws MessagingException
     */
    public Message createMessage(String from,String to, String title, String content, String cc,boolean isContentFlag,boolean isAffixFlag,boolean isMimeContent,String affix,String affixName) throws AddressException, MessagingException {
       // 用session为参数定义消息对象
       MimeMessage message = new MimeMessage(session);
       // 加载发件人地址
       message.setFrom(new InternetAddress(from));
       message.setSentDate(new Date());
       // 加载收件人地址
       message.addRecipients(Message.RecipientType.TO, getAddress(to));
       if (cc != null)
           message.addRecipients(Message.RecipientType.CC, getAddress(cc));
       // 加载标题
       message.setSubject(title);
       
       if (isContentFlag || isAffixFlag) {
           // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
           Multipart multipart = new MimeMultipart();
           if (isContentFlag) {
              // 设置邮件的文本内容
              MimeBodyPart contentPart = new MimeBodyPart();
              if (isMimeContent)
                  contentPart.setContent(content,"text/html;charset=GBK");
              else
                  contentPart.setText(content);
              multipart.addBodyPart(contentPart);
           }
           if (isAffixFlag) {
              // 添加附件
              BodyPart affixBody = new MimeBodyPart();
              DataSource source = new FileDataSource(affix);
              // 添加附件的内容
              affixBody.setDataHandler(new DataHandler(source));
              // 添加附件的标题这里很重要,通过下面的Base64编码的转换可以保证你的
              // 中文附件标题名在发送时不会变成乱码
              sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
              String fileName = "=?GBK?B?"+enc.encode(affixName.getBytes()) + "?=";
              affixBody.setFileName(fileName);
              multipart.addBodyPart(affixBody);
           }
           // 将multipart对象放到message中
           message.setContent(multipart);
       }
       // 保存邮件
       message.saveChanges();
       return message;
    }
    /**
     * 发送邮件,包含:邮件正文、(1个附件)
     *
     * @param debug
     *            调试设置
     */
    public void send(Message message) {
       // 有了这句便可以在发送邮件的过程中在console处显示过程信息,供调试使
       // 用(你可以在控制台(console)上看到发送邮件的过程)
       session.setDebug(true);
       try {
           transport.sendMessage(message, message.getAllRecipients());
       } catch (AddressException e) {
           e.printStackTrace();
       } catch (MessagingException e) {
           e.printStackTrace();
       }

    }

    /**
     * 关闭资源
     *
     * @throws MessagingException
     */
    public void close() throws MessagingException {
       if (null != transport)
           try{
               transport.close();
               System.out.println("成功关闭会话");
           }catch (Exception e) {
               transport = null;
        }
    }
    
    public Address[] getAddress(String address) throws AddressException{
        Address[] addr = InternetAddress.parse(address);
        return addr;
    }
    
    public Address[] getAddress(String[] address) throws AddressException {
       Address[] addrs = new InternetAddress[address.length];
       for (int i = 0; i < address.length; i++)
           addrs[i] = new InternetAddress(address[i]);
       return addrs;
    }  
}


调用:
//建立连接
SendMail sendMail = new SendMail(Config.getSmtpName(), Config.getSmtpPassword(), Config.getSmtpHost(), true);

//发送邮件,可以发送任意多次
Message message = sendMail.createMessage(Config.getSmtpFrom(), email, title, body, null, true, false, true,"","");
                                    sendMail.send(message);

//最后关闭连接
sendMail.close();
0
0
分享到:
评论
2 楼 aiou 2010-11-26  
lzg406 写道
这个貌似只能够处理:不同的用户发送相同的内容的邮件

你说反了,现在是相同用户发送不同内容

下面你可以创建任意多个邮件
//发送邮件,可以发送任意多次  
Message message = sendMail.createMessage(Config.getSmtpFrom(), email, title, body, null, true, false, true,"","");  
sendMail.send(message); 
1 楼 lzg406 2010-11-25  
这个貌似只能够处理:不同的用户发送相同的内容的邮件

相关推荐

    关于用javamail发送邮件时,由于邮件服务器要SSL,解决办法

    1. `Properties props`:这是一个属性对象,用来存储连接邮件服务器的配置信息。其中,`props.put("mail.smtp.starttls.enable", "true")`将启动TLS支持,如果是SSL,则应使用`"mail.smtp.socketFactory.class"`和`...

    javaMail发送邮件 发送成功 收不到邮件 或收到邮件无主题无收件人乱码

    ### JavaMail发送邮件时遇到的问题及解决方法 在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未收到邮件、邮件收到后无主题或无收件人信息以及邮件内容出现乱码等情况。本文将...

    使用JAVAMail代发邮件

    Session 对象是 JavaMail 库中的一个核心对象,用于配置邮件服务器的连接信息。我们可以使用 Session 对象的 setProperty 方法来设置邮件服务器的主机名和端口号。 在本文中,我们讨论了如何使用 JavaMail 库来代发...

    javamail实现邮箱与邮箱发送邮件

    message.setText("这是一封由JavaMail发送的测试邮件。"); // 发送邮件 Transport.send(message); System.out.println("邮件已成功发送!"); } } ``` 在这个例子中,我们创建了一个`Properties`对象来配置SMTP...

    JavaMail发送邮件的例子

    JavaMail是一种在Java环境中发送和接收电子邮件的标准API,它提供了丰富的功能来处理复杂的邮件操作。在Struts2框架中集成JavaMail服务,可以方便地在Web应用中实现邮件的发送功能。下面我们将深入探讨JavaMail的...

    james和javamail实现邮件收发(带发送附件)

    James的核心特性之一是其可扩展性,可以通过插件连接到各种数据库,以便存储和管理邮件数据。 JavaMail API是Java平台上的一个标准API,用于处理邮件服务。它提供了丰富的类和接口,可以用来创建、发送、接收和管理...

    常规JavaMail 邮件发送实用类

    在Java编程领域,JavaMail API是一个非常重要的工具,它允许开发者通过编程方式发送电子邮件。"常规JavaMail 邮件发送实用类"标题所指的,通常是一个自定义的Java类,封装了JavaMail API的基本操作,使得邮件发送变...

    javamail发送邮件.zip

    JavaMail 是一个强大的开源库,用于在Java应用程序中发送和接收电子邮件。这个“javamail发送邮件.zip”压缩包显然包含了一个示例项目,演示如何使用JavaMail API发送包含正文文本、图片以及附件的邮件。以下是对这...

    javamail 回执邮件资料

    JavaMail 是一个开源的 Java 库,用于处理电子邮件的发送和接收。它提供了与 SMTP、POP3 和 IMAP 协议交互的接口,是开发基于 Java 的电子邮件应用的基础。回执邮件是邮件服务中的一项功能,它允许发件人在发送邮件...

    JavaMail(3)——发送带附件的邮件.docx

    JavaMail 是一个强大的开源库,用于在Java应用程序中发送和接收电子邮件。在JavaMail中,发送带有附件的邮件涉及到对MIME(Multipurpose Internet Mail Extensions)标准的理解和使用。MIME扩展了邮件协议,允许在...

    javaMail实现发送邮件的demo

    JavaMail 是一个开源的 Java 库,用于处理电子邮件的发送和接收。它提供了一组 API,使得开发者可以方便地在 Java 应用程序中集成邮件功能。本示例将介绍如何使用 JavaMail 实现发送邮件的功能。 首先,我们需要...

    JavaMail(JAVA邮件服务器)API详解 chm.rar

    `Transport`用于发送邮件,而`Store`则用于连接邮件服务器并接收邮件。 使用JavaMail API的内容会涵盖实际的代码示例,比如如何创建和发送简单的文本邮件、带有附件的邮件,以及如何接收和读取邮件。这部分还会涉及...

    用javaMail发送邮件

    JavaMail 是一个强大的开源库,用于在Java应用程序中发送和接收电子邮件。这个功能通常涉及到SMTP(简单邮件传输协议)和其他相关的互联网邮件协议。在JavaMail中,`mail.jar` 和 `activation.jar` 是两个关键的库...

    JavaMail实现邮件发送功能,可发送、抄送、密送多人,支持多附件的发送

    JavaMail 是一个开源的 Java 库,用于处理电子邮件的发送和接收。它提供了一组 API,使得开发者可以方便地在 Java 应用程序中集成邮件功能。本篇将详细介绍如何利用 JavaMail 实现邮件发送,包括发送、抄送、密送...

    JavaMail发送邮件(文本、html、附件)

    JavaMail是一种广泛使用的Java库,用于在应用程序中发送电子邮件。这个标题"JavaMail发送邮件(文本、html、附件)"涵盖了使用JavaMail API发送不同格式邮件的核心功能。下面将详细介绍如何利用JavaMail发送文本、...

    如何用javamail定时发送邮件

    JavaMail 是一个强大的开源库,用于在 Java 应用程序中发送和接收电子邮件。要实现定时发送邮件,我们可以结合 JavaMail 和 Java 计时器框架(如文中提到的 Java Timer)。以下是一个详细的步骤来实现这个功能: 1....

    使用javaMail发送邮件

    JavaMail 是一个开源库,用于在Java应用程序中发送和接收电子邮件。这个库提供了一组API,使得开发者可以方便地处理SMTP、POP3、IMAP等邮件协议。在本篇文章中,我们将深入探讨如何使用JavaMail API来实现邮件的发送...

    JavaMail发送和接受邮件的一个小例子

    `Store`类用于连接邮件服务器并获取邮件,而`Folder`类代表邮箱中的文件夹,如“收件箱”、“已发送”等。 以下是接收邮件的一般流程: 1. 创建`Properties`对象,设置IMAP或POP3服务器信息。 2. 创建`Session`...

    JavaMail邮件发送源码 非常简单

    JavaMail是一种在Java应用程序中发送和接收电子邮件的标准API,它为开发者提供了强大的功能,使得处理邮件变得简单而高效。在JavaMail中,我们主要利用 javax.mail 和 javax.mail.internet 这两个包中的类来实现邮件...

    javamail发送、接收邮件

    在IT领域,JavaMail API是Java开发者用于处理电子邮件发送与接收的强大工具。通过解析给定文件的标题、描述、标签及部分内容,我们可以深入探讨javamail发送与接收邮件的详细教程,以及如何利用JavaMail API实现邮件...

Global site tag (gtag.js) - Google Analytics