网上类似的代码很多,但是在实际使用中大多并不能运行,这次刚好项目要用到这个功能,就把代码贴出来,供大家参考。

代码直接就能够运行,并且我在上面有了详细的注释,不过还有几个注意点需要告知,特别是第一次使用的朋友,一定要注意以下几点:

1.一定要开启邮箱的SMTP服务,这个具体的我不多说了,网上这个很多,基本上都有图,直接了当

2.开启SMTP后,代码里面的密码并非是邮箱的登录密码,而是邮箱生成的授权码,这个在完成第一步后邮箱会显示你的授权码。

3.目前我看到的主要关于自动发邮件的错误一般是530,关于这个错误只需要加上

props.setProperty("mail.smtp.starttls.enable", "true"); 

这条代码就够了。


package com.jjrt.eid.utils;

import javax.mail.*;  
import javax.mail.internet.*;  
import java.util.*;  
import javax.activation.*;  

/**
 * 自动发送邮件(带附件)
 * @作者:JackHisen(GWD)
 * @项目名:eid-server-20170416
 * @时间:2017-4-27 上午10:58:39
 * @version 1.0
 */
public class EmailSend {

    private MimeMessage mimeMsg;      //MIME邮件对象
    private Session session;          //邮件会话对象
    private Properties props;         //系统属性
    private boolean needAuth=false;   //smtp是否需要认证
    private String username="";       //smtp认证用户名和密码
    private String password="";    
    private Multipart mp;             //Multipart对象,邮件内容、标题、附件等内容
    
    public EmailSend(){
        //setSmtpHost(getConfig.mailHost); //如果没有指定有加你服务
        createMimeMessage();
    }
    
    public EmailSend(String smtp){
        setSmtpHost(smtp);
        createMimeMessage(); 
    }
    
    public void setSmtpHost(String hostName){
        System.out.println("设置系统属性:mail.stmp.host="+hostName);
        if(props==null) props=System.getProperties();                 //获取系统属性
        props.put("mail.smtp.host",hostName);                         //设置SMTP主机
        props.setProperty("mail.smtp.starttls.enable", "true"); //在邮箱中设置了SMTP服务开启后依然报530错误,一般是由于缺少这句代码引起的
    }
    
    public boolean createMimeMessage(){
        try{
            System.out.println("准备获取邮件会话对象!");
            session=Session.getDefaultInstance(props,null);
        }catch(Exception e){
            System.err.println("获取邮件会话对象时发生错误!"+e);
            return false;
        }
        System.out.println("准备创建MIME邮件对象");
        try{
            mimeMsg =new MimeMessage(session);//创建MIME邮件对象
            mp=new MimeMultipart();
            
            return true;
        }catch(Exception e){
            System.err.println("创建MIME邮件对象失败"+e);
            return false;
        }
    }
    
    public void setNeedAnth(boolean need){
        System.out.println("设置smtp身份认证:mail.smtp.auth="+need);
        if(props==null) props=System.getProperties();
        
        if(need){
            props.put("mail.smtp.auth", "true");
        }else{
            props.put("mail.smtp.auth", false);
        }
    }
    
    public void setNamePass(String name,String pass){
        username=name;
        password=pass;
    }
    
    public boolean setSubject(String mailSubject){
        System.out.print("设置邮件主题");
        try{
            mimeMsg.setSubject(mailSubject);
            return true;
        }catch(Exception e){
            System.err.println("设置邮件主题发生错误");
            return false;
        }
    }
    
    /**
     * 
     * @param companyName 公司名称
     * @param appName 应用名称
     * @param ContactName 联系人姓名
     * @param num 联系人手机号
     * @param email 联系人邮箱
     * @param logoUrl logo图片的地址
     * @return
     */
    public boolean setBody(String companyName,String appName,String ContactName,String num,String email,String logoUrl){
        try{
            BodyPart bp=new MimeBodyPart();
            //bp.setContent("<meta http-equiv=Content-Type content=text/html; charset=UTF-8/>"+mailBody+ "<img src=\"G://gwd.jpg\">","text/html;charset=gb2312");
            bp.setContent(
                          "<meta http-equiv=Content-Type content=text/html; charset=UTF-8/>"+
                          "尊敬的"+companyName+":"+"<br/>"+
                          "恭喜您的“"+appName+"应用”已经成功注册成为“公安部公民网络身份识别系统”的XXX应用!" +"<br/>"+
                          "您的注册信息见本邮件的附件。"+"<br/>"+"请注意妥善保存好您的注册信息!"+
                          "<h2>"+ContactName+"</h2>"+
                          "<h2>客户经理</h2>"+"<br/>"+ 
                          "<img src='"+logoUrl+"' width=\"120px\">"+"<br/>"+ //logoUrl为服务器上照片地址
                          "上海XXXXXX科技有限公司"+"<br/>"+
                          "手机:+86-"+num+"<br/>"+
                          "Email:"+"<a>"+email+"</a>"+"<br/>"+
                          "地址:上海市闵行区紫竹科技园区紫星路XXXX", 
                             "text/html;charset=gb2312");
            
            mp.addBodyPart(bp);
            
            return true;
        }catch(Exception e){
            System.err.println("设置邮件正文时发生错误!"+e);
            return false;
        }
    }
    
    /**
     * 添加附件
     * @param filename
     * @return
     */
    public boolean addFileAffix(String filename){
        System.out.println("增加邮件附件:"+filename);
        try{
            BodyPart bp=new MimeBodyPart();
            FileDataSource fileds=new FileDataSource(filename);
            bp.setDataHandler(new DataHandler(fileds));
            bp.setFileName(fileds.getName());
            mp.addBodyPart(bp);
            return true;
        }catch(Exception e){
            System.err.println("增加邮件附件"+filename+"发生错误:"+e);
            return false;
        }
    }
    
    public boolean setForm(String from){
        System.out.println("设置发信人");
        try{
            mimeMsg.setFrom(new InternetAddress(from));
            return true;
        }catch(Exception e){
            return false;
        }
    }
    
    public boolean setTo(String to){
        if(to==null) return false;
        try{
            mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
            return true;
        }catch(Exception e){
            return false;
        }
    }
    
    public boolean setCopyTp(String copyto){
        if(copyto==null) return false;
        try{
            mimeMsg.setRecipients(Message.RecipientType.CC, (Address[])InternetAddress.parse(copyto));
            return true;
        }catch(Exception e){
            return false;
        }
    }
    
    public boolean sendout(){
        try{
            mimeMsg.setContent(mp);
            //mimeMsg.saveChanges();
            
            System.out.println("正在发送邮件....");
            
            Session mailSession=Session.getInstance(props,null);
            Transport transport=mailSession.getTransport("smtp");
            transport.connect((String)props.get("mail.smtp.host"),username,password);
            transport.sendMessage(mimeMsg, mimeMsg.getRecipients(Message.RecipientType.TO));
            
            System.out.println("发送邮件成功!");
            transport.close();
            
            return true;
        }catch(Exception e){
            System.out.println("邮件发送失败!"+e);
            return false;
        }
    }
    
    /**
     * 发送邮件
     * @param companyName 公司名称
     * @param appName 应用名称
     * @param contactName 联系人姓名
     * @param num 联系人手机号
     * @param contactEmail 联系人邮箱
     * @param logoUrl logo图片地址
     * @param title 邮件主题
     * @param email 发件人
     * @param passwd 邮件授权码
     * @param toEmail 收件人
     * @param enclosureName 附件路径
     */
    public  Boolean sendToSomebody(String companyName,String appName,String contactName,String num,String contactEmail,String logoUrl,String title,String email,String passwd,String toEmail,String enclosureName ){
        boolean bool=false;
        //指明让那个smtp转发
        EmailSend themail=new EmailSend("smtp.qq.com");
        
        //校验身份
        themail.setNeedAnth(true);
        
        //邮件标题
        if(themail.setSubject(title)==false) return bool;
        //将要发送的内容放入邮件体
        if(themail.setBody(companyName,appName,contactName,num,contactEmail,logoUrl)==false) return bool;
        
        //发往哪里
        if(themail.setTo(toEmail)==false) return bool;
        //谁发送的
        if(themail.setForm("XXXXXXX@qq.com")==false) return bool;
        
        //发送附件
        enclosureName=transferPath(enclosureName);
        if(themail.addFileAffix(enclosureName)==false) return bool;
        //将在163网站上的邮件用户名和密码放入邮件体
        themail.setNamePass(email,passwd);//密码为授权码,不是邮件登录密码
        //发送
        if(themail.sendout()==false) return bool;
        bool=true;
        return bool;
    }
    
    /**
     * 将附件地址进行字符转义
     * @param filepath 附件路径(包括附件名)
     * @return
     */
    public  String transferPath(String filepath){
        filepath.replace("/", "//");
        return filepath;
    }
    
    
}