Java发送邮件email

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java发送邮件email相关的知识,希望对你有一定的参考价值。

/**

  * 发送Mail

  * @param revicer 接收人mail

  * @param content 发送内容

  * @throws AddressException

  * @throws MessagingException

  */

 public void sendMail(String revicer,String content,String subject) throws AddressException, MessagingException{

  String host = SysUtils.getText("email.host");// "mail.sinoss.net";

        String from = SysUtils.getText("email.from");;// "[email protected]";

        String username = SysUtils.getText("email.username");;// "[email protected]";

        String password = SysUtils.getText("email.password");;// "sinoss4340";

 

        // Get system properties

        Properties props = new Properties();

 

        // Setup mail server

        props.put("mail.smtp.host", host);

        props.put("mail.smtp.auth", "true"); //这样才能通过验证

 

        // Get session

        javax.mail.Session session = javax.mail.Session.getDefaultInstance(props);

 

        // watch the mail commands go by to the mail server

        session.setDebug(false);

 

        // Define message

        MimeMessage message = new MimeMessage(session);

        message.setFrom(new InternetAddress(from));

        message.addRecipient(Message.RecipientType.TO,new InternetAddress(revicer));  

        message.setSubject(subject);

        message.setContent(content, "text/html;charset=GBK");

        message.saveChanges();

        Transport transport = session.getTransport("smtp");

        transport.connect(host, username, password);

        transport.sendMessage(message, message.getAllRecipients());

        transport.close();

 }

JavaMail是Sun发布的用来处理E-mail的API,它可以方便地执行一些常用的邮件传输。虽然JavaMail是Sun的API之一,但它没有被加在标准的Java开发工具包(JDK)中,这就意味着使用之前必须另外下载JavaMail文件(http://www.sun.com),除此之外,要使用JavaMail,还需要有Sun的JavaBeans Activation Framework(JAF)支持,因此需要下载一个叫activation.jar的文件,将他们同时放在应用的lib目录下或其他Classpath包含的目录。

      发送邮件过程中主要使用到的几个类:

1.   Javax.mail.Session类

Session定义了一个基本的邮件会话,任何工作都是基于这个Session的。Session对象需要一个java.util.Properties对象得到类似邮件服务器、用户名、密码这样的信息。Session的构造函数是私有的,可以通过getDefaultInstance()方法取得一个单一的可以被共享的默认Session,如:

Properties props = new Properties();

……

Session  session = Session.getDefaultInstance(props, null) ;

或者,可以通过getInstance()方法来创建一个惟一的Session,如:

Properties props = new Properties();

……

Session session = Session.getInstance(props, null) ;

2.   Javax.mail.Message类

创建了Session对象后,就要创建Message来发送Session。Message是一个抽象类,在大部分应用中可以使用它的子类Javax.mail.internet.MimeMessage。

创建Message的方法如下:

MimeMessage  message = new MimeMessage(session) ;

设置内容(content)的基本机制是使用setContent()方法:message.setContent(“Email Content.” , “text/plain”)。

如果能够明确地使用MimeMessage来创建Message,并且只是使用普通的文本(plain text),那么也可以使用setText(“Email Content.”)。

如果要创建其他类型的Message,如HTML类型的Message,那么还是使用前者message.setContent(“Email Content.” , “text/html”)。

设置主题(subject),使用setSubject()方法:message.setSubject(“Subject”)。

3.   Javax.mail.Address类

Address是一个抽象类,可以使用它的子类javax.mail.internet.InternetAddress。

创建一个Address语句如下:

Address address = new InternetAddress(“[email protected]”);

如果希望在出现邮件地址的地方显示一个名称,那么只需要再多传递一个参数。

Address address = new InternetAddress(“[email protected]”, “Kylen”);

除此,需要为Message的from以及to字段创建address对象。为了识别发送者,使用setFrom()和setReplyTo()方法。

message.setFrdom(address) ;

如果需要显示多个from地址,可以使用addFrom()方法:

Address address[] = {……};

message.addFrom(address) ;

为了辨识Message的收件人,需要使用setRecipient()方法。

message.addRecipient(type, address) ;

Message.RecipientType 有几个预先定义好的类型:

Message.RecipientType.To     收件人  

Message.RecipientType.CC    抄送

Message.RecipientType.BCC   暗送

同时发给多个人:

Address  toAddress = new InternetAddress(“[email protected]”);

Address[] ccAddress = {new  InternetAddress(“[email protected]”),

new  InternetAddress(“[email protected]”)} ;

message.addRecipient(Message.RecipientType.To , toAddress) ;

message.addRecipient(Message.RecipientType.CC , ccAddress) ;

4.   Javax.mail.Transport类

最后,需要使用一个Transport类来完成邮件发送,可以通过两种方法发送邮件。Transport是一个抽象类,可以调用它的静态的send()方法来发送:

Transport.send(message) ;

或者,可以从Session中为所使用的协议取得一个指定的实例:

Transport  transport = session.getTransport(“smtp”) ;

transport.sendMessage(message , message.getAllRecipients()) ;

transport.close() ;

 

      经过以上的介绍,要用JavaMail发送一封普通的邮件就变得相当容易了。本实例编写了一个专门用于邮件处理的类MailUtil.java,其源代码如下:

package ch2.util.mail;

 

import java.util.Date;

import java.util.Properties;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.NoSuchProviderException;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

 

public class MailUtil {

 

      static int port = 25;   //smtp端口

      static String server = "smtp.163.com";   //smtp服务器地址

      static String from = "Webmaster<[email protected]>";   //发送者

      static String user = "[email protected]";    //发送者地址

      static String password = "1141940938";   //密码

 

      public static void sendEmail(String email, String subject, String body) {

            try {

                  Properties props = new Properties();

                  props.put("mail.smtp.host", server);

                  props.put("mail.smtp.port", String.valueOf(port));

                  props.put("mail.smtp.auth", "true");

                  Transport transport = null;

                  Session session = Session.getDefaultInstance(props, null);

                  transport = session.getTransport("smtp");

                  transport.connect(server, user, password);

                  MimeMessage msg = new MimeMessage(session);

                  msg.setSentDate(new Date());

                  InternetAddress fromAddress = new InternetAddress(from);

                  msg.setFrom(fromAddress);

                  InternetAddress[] toAddress = new InternetAddress[1];

                  toAddress[0] = new InternetAddress(email);

                  msg.setRecipients(Message.RecipientType.TO, toAddress);

                  msg.setSubject(subject, "UTF-8");   

                  msg.setText(body, "UTF-8");

                  msg.saveChanges();

                  transport.sendMessage(msg, msg.getAllRecipients());

            } catch (NoSuchProviderException e) {

                  e.printStackTrace();

            } catch (MessagingException e) {

                  e.printStackTrace();

            }

      }

}

 

package com.eplugger.message.utils;
import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
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;
import org.apache.commons.lang.StringUtils;
public class EmailUtils {
 
 
 /**
  * 发送邮件的方法
  *
  * @param serverAddress
  * 服务器地址
  * @param user
  * 服务器用户名
  * @param pwd
  * 服务器密码
  * @param from
  * 发送人
  * @param subject
  * 标题
  * @param emailReceiver
  * 接收人
  * @param htmlContents
  * 发送内容
  * @param ucode
  * 编码格式
  * @throws Exception
  * @throws java.lang.Exception
  */
 public static boolean send(String serverAddress, String user, String pwd,
   String from, String subject, List emailReceiver,
   String htmlContents, String ucode,List fileName, String fileNames) throws Exception {
  boolean flag = false;
  try {
   // 创建Properties对象
   Properties props = System.getProperties();
   props.put("mail.smtp.host", serverAddress);
   // 创建信件服务器
   props.put("mail.smtp.auth", "true");
   // 得到默认的对话对象
   Session session = Session.getDefaultInstance(props,null);
   // 创建一个消息,并初始化该消息的各项元素
   Message msg = new MimeMessage(session);
   msg.setFrom(new InternetAddress(from));
   // 编码方式
   if (ucode.indexOf("GBK") != -1) {
    String tempFrom = new String(from.getBytes("GBK"), "UTF-8");
    msg.setFrom(new InternetAddress(tempFrom));
   }
   // 准备收件人地址
   InternetAddress[] address = new InternetAddress[emailReceiver
     .size()];
   for (int i = 0; i < address.length; i++) {
    address[i] = new InternetAddress((String) emailReceiver.get(i));
   }
   msg.setRecipients(Message.RecipientType.TO, address);
   // 邮件主题
   msg.setSubject(subject);
   // 后面的BodyPart将加入到此处创建的Multipart中
   Multipart mp = new MimeMultipart();
   // 设置内容
   BodyPart bp = new MimeBodyPart();
   bp.setContent(htmlContents, ucode);
   mp.addBodyPart(bp);
            //保存附件
   addFileAffix(mp,fileName, fileNames);
   // Multipart加入到信件
   msg.setContent(mp);
   // 设置信件头的发送日期
   msg.setSentDate(new Date());
   msg.saveChanges();
   // 发送信件
   Transport trans = session.getTransport("smtp");
   trans.connect(serverAddress, user, pwd);
   trans.sendMessage(msg, msg.getAllRecipients());
   trans.close();
   flag = true;
  } catch (Exception e) {
   e.printStackTrace();
  }
  return flag;
 }
 
 
 /**
  * 发送附件
  * @param mp 邮件信息
  * @param fileName 附件全路径(包括文件名称)
  * @return
  */
 public static boolean addFileAffix(Multipart mp, List<String> list,String fileNames) {
  try{
   String[] arr = fileNames.split(";");
   for (String fileName : list) {
    String newName = "";
    newName = fileName.substring(fileName.lastIndexOf(File.separator)+1, fileName.length());
    if(StringUtils.isEmpty(fileName)) return false;
    BodyPart bp = new MimeBodyPart();
    FileDataSource fileds = new FileDataSource(fileName);
    bp.setDataHandler(new DataHandler(fileds));
    for (int i = 0; i < arr.length; i++) {
     if(newName.equals(arr[i].split(":")[0])){
      newName = arr[i].split(":")[1];
     }
    }
 
    //newName = new String(newName.getBytes("ISO-8859-1"),"UTF-8");
    bp.setFileName(MimeUtility.encodeText(newName));//附件名字乱码
    mp.addBodyPart(bp);
   }
   return true;
  }catch(Exception e){
   return false;
  }
 }
 
 /**
  * 删除文件
  * @param fileName
  */
 public static void deleteFile(List<String> list){
  for (String fileName : list) {
   if(StringUtils.isEmpty(fileName)) return ;
      File file=new File(fileName);
   if(file.isFile())
   {
    file.delete();
   }
  }
   
 }
 
 /**
  * 替换邮件内容
  * @return
  */
 public static String processContent(String content){
  return "不知道模板需要替换什么内容,暂且未替换";
 }
}
 
package com.svse;
import java.io.File; /* *建立 附件类,只有文件,即附件才文件名 */publicclass AttachBean { private String cid; private File file; private String fileName; public String getCid() { return cid; } publicvoid setCid(String cid) { this.cid = cid; } public File getFile() { return file; } publicvoid setFile(File file) { this.file = file; } public String getFileName() { return fileName; } publicvoid setFileName(String fileName) { this.fileName = fileName; } public AttachBean() { } public AttachBean(File file, String fileName) { super(); this.file = file; this.fileName = fileName; } }

package com.svse;

import java.util.ArrayList;
import java.util.List;
/**
 * 表示邮件类,你需要设置:账户名和密码、收件人、抄送(可选)、暗送(可选)、主题、内容,以及附件(可选)
 * 
 * 在创建了Mail对象之后
 * 可以调用它的setSubject()、setContent(),设置主题和正文
 * 也可以调用setFrom()和 addToAddress(),设置发件人,和添加收件人。
 * 也可以调用addAttch()添加附件
 * 创建AttachBean:new AttachBean(new File("..."), "fileName");
 */publicclass Mail {
    private String from;//发件人private StringBuilder toAddress = new StringBuilder();//收件人private StringBuilder ccAddress = new StringBuilder();//抄送private StringBuilder bccAddress = new StringBuilder();//暗送private String subject;//主题private String content;//正文
    
    // 附件列表private List<AttachBean> attachList = new ArrayList<AttachBean>();
    
    public Mail() {}
    
    public Mail(String from, String to) {
        this(from, to, null, null);
    }
    
    public Mail(String from, String to, String subject, String content) {
        this.from = from;
        this.toAddress.append(to);
        this.subject = subject;
        this.content = content;
    }
    
    /**
     * 返回发件人
     * @return*/publicvoid setFrom(String from) {
        this.from = from;
    }
    
    /**
     * 返回发件人
     * @return*/public String getFrom() {
        return from;
    }
    
    /**
     * 返回主题
     */public String getSubject() {
        return subject;
    }

    /**
     * 设置主题
     */publicvoid setSubject(String subject) {
        this.subject = subject;
    }

    /**
     * 获取主题内容
     */public String getContent() {
        return content;
    }

    /**
     * 设置主题内容
     * @param content
     */publicvoid setContent(String content) {
        this.content = content;
    }

    /**
     * 获取收件人
     * @return*/public String getToAddress() {
        return toAddress.toString();
    }

    /**
     * 获取抄送
     * @return*/public String getCcAddress() {
        return ccAddress.toString();
    }

    /**
     * 获取暗送
     * @return*/public String getBccAddress() {
        return bccAddress.toString();
    }

    /**
     * 添加收件人,可以是多个收件人
     * @param to
     */publicvoid addToAddress(String to) {
        if(this.toAddress.length() > 0) {
            this.toAddress.append(",");
        }
        this.toAddress.append(to);
    }

    /**
     * 添加抄送人,可以是多个抄送人
     * @param cc
     */publicvoid addCcAddress(String cc) {
        if(this.ccAddress.length() > 0) {
            this.ccAddress.append(",");
        }
        this.ccAddress.append(cc);
    }

    /**
     * 添加暗送人,可以是多个暗送人
     * @param bcc
     */publicvoid addBccAddress(String bcc) {
        if(this.bccAddress.length() > 0) {
            this.bccAddress.append(",");
        }
        this.bccAddress.append(bcc);
    }
    
    /**
     * 添加附件,可以添加多个附件
     * @param attachBean
     */publicvoid addAttach(AttachBean attachBean) {
        this.attachList.add(attachBean);
    }
    
    /**
     * 获取所有附件
     * @return*/public List<AttachBean> getAttachs() {
        returnthis.attachList;
    }
}
package com.svse;

import java.io.IOException;
import java.util.List;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
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;
import javax.mail.internet.MimeMessage.RecipientType;

/**
 * 建立邮件工具类  发送邮件
 * @author 00
 *
 */publicclass MailUtils {
    publicstatic Session createSession(String host, final String username, final String password) {
        Properties prop = new Properties();
        prop.setProperty("mail.host", host);// 指定主机
        prop.setProperty("mail.smtp.auth", "true");// 指定验证为true

        // 创建验证器
        Authenticator auth = new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                returnnew PasswordAuthentication(username, password);
            }
        };
        
        // 获取session对象return Session.getInstance(prop, auth);
    }
    
    /**
     * 发送指定的邮件
     * 
     * @param mail
     */publicstaticvoid send(Session session, final Mail mail) throws MessagingException,
            IOException {

        MimeMessage msg = new MimeMessage(session);// 创建邮件对象
        msg.setFrom(new InternetAddress(mail.getFrom()));// 设置发件人
        msg.addRecipients(RecipientType.TO, mail.getToAddress());// 设置收件人

        // 设置抄送
        String cc = mail.getCcAddress();
        if (!cc.isEmpty()) {
            msg.addRecipients(RecipientType.CC, cc);
        }

        // 设置暗送
        String bcc = mail.getBccAddress();
        if (!bcc.isEmpty()) {
            msg.addRecipients(RecipientType.BCC, bcc);
        }

        msg.setSubject(mail.getSubject());// 设置主题
        MimeMultipart parts = new MimeMultipart();// 创建部件集对象
        MimeBodyPart part = new MimeBodyPart();// 创建一个部件
        part.setContent(mail.getContent(), "text/html;charset=utf-8");// 设置邮件文本内容
        parts.addBodyPart(part);// 把部件添加到部件集中///////////////////////////////////////////

        // 添加附件
        List<AttachBean> attachBeanList = mail.getAttachs();// 获取所有附件if (attachBeanList != null) {
            for (AttachBean attach : attachBeanList) {
                MimeBodyPart attachPart = new MimeBodyPart();// 创建一个部件
                attachPart.attachFile(attach.getFile());// 设置附件文件                attachPart.setFileName(MimeUtility.encodeText(attach
                        .getFileName()));// 设置附件文件名
                String cid = attach.getCid();
                if(cid != null) {
                    attachPart.setContentID(cid);
                }
                parts.addBodyPart(attachPart);
            }
        }

        msg.setContent(parts);// 给邮件设置内容
        Transport.send(msg);// 发邮件    }
}    
 
 
package com.wenjie;

import java.io.IOException;
import javax.mail.MessagingException;
import javax.mail.Session;
import cn.itcast.mail.Mail;
import cn.itcast.mail.MailUtils;

publicclass MailTest {
    publicstaticvoid main(String args[]){
        String host = "smtp.163.com";//网易163邮件传输协议     腾讯 qq的是smtp.qq.com/**
         * 这里需要注意一下  如果你想用qq邮箱作为发件人邮箱的话  记得把邮箱传输协议host值改为smtp.qq.com
         * 另外 username登陆名还是 一样  直接写QQ号,不用加后缀
         */
        String username = "用户名>不加后缀";//发件人邮箱的用户名 这里不要加后缀@163.com/**  注意事项
         * 如果是用的QQ邮箱的话  这里的password不能写QQ邮箱的登陆密码  你要去登录到QQ邮箱  点  设置>账户   下面会有一个"POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务"
         * 选项,把"POP3/SMTP服务"  开启来 这时候 如果你之前没开启过 那么会提示你 设置独立密码  设置完成后  password的值就写你刚才设置的独立密码即可 ,否则会验证失败
         * 如果你用的是163或者126的话 就直接写登陆密码即可
         */
        String password = "密码";  //发件人邮箱的登陆密码/**
         * 这里发件人 要写全名
         */
        String from = "邮箱全名";//发件人的邮箱 全名 加后缀/**
         * 收件人 同样要写全名
         */
        String to = "收件人的邮箱";//收件人的邮箱/**
         * 主题自定义
         */
        String subject = "邮件测试";//邮件主题/**
         * 自定义
         */
        String content = "http://http://www.cnblogs.com/wenjie123";//邮件的内容/**
         * 调用写好的邮件帮助类 MailUtils  直接调用createSession 根据以上(host, username, password三个参数)创建出session
         */
        Session session = MailUtils.createSession(host, username, password);
        /**
         * 创建邮件对象from, to,subject,content 这三个参数
         */
        Mail mail = new Mail(from, to,subject,content);
        try {
            /**
             * 最后一步  调用MailUtils的send方法 将session和创建好的邮件对象传进去  发送就ok了
             */
            MailUtils.send(session, mail);
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

以上是关于Java发送邮件email的主要内容,如果未能解决你的问题,请参考以下文章

Java后台发送邮件

java email 在阿里云服务器发送邮件失败的解决方法

Java发送邮件email

Java代码实现发送邮件

SSH网上商城项目实战25使用java email给用户发送邮件

java 实现 email 邮件发送最简单优雅的方式(网易 163 为例)