Java mail 邮件

来源:互联网 发布:淘宝跟踪物流查询系统 编辑:程序博客网 时间:2024/05/22 13:24

项目中有一个功能涉及到需要给筛选出来的人员发邮件,并且需要采用固定的格式和内容,在我们一般采用的java项目中如何采用Java技术同时向多个人发送邮件以及包含的附件,使用过程中采用过不同的代码,遇到过不同的问题,简单记录如下。


(一)采用的第一个方法,现在找不到之前采用的代码了,常见报错如下:

java mail使用过程中报错

报错

1   java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream

解决方法

http://blog.163.com/yangzhanghui_job/blog/static/1795750622013214104659111/

2 553 You are not authorized to send mail, authentication is required e988b0d7-a399-4d54-9e7c-fd31cd3c

原因 ,服务器地址写的mail.163.com,修改成smtp.163.com

3  javax.mail.MessagingException: Could not connect to SMTP host: smtp.163.com, port: 25;

将收发邮件都改为了qq邮箱

4  503 Error: need EHLO and AUTH first !


(二)由于采用的第一个方法解决不了,又看第二个博客,实验方法成功。

转自:http://blog.csdn.net/linyiteng1220/article/details/2440586

1、SendMail类( 包含测试方法main)

import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;


import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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;


public class SendMail {


    public String toChinese(String text) {
        try {
            text = MimeUtility.encodeText(new String(text.getBytes(), "GB2312"), "GB2312", "B");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return text;
    }




    public boolean sendMail(Mail mb) {
        String host = mb.getHost();
        final String username = mb.getUsername();
        final String password = mb.getPassword();
        String from = mb.getFrom();
        String to = mb.getTo();
        String subject = mb.getSubject();
        String content = mb.getContent();
        String fileName = mb.getFilename();
        Vector<String> file = mb.getFile();
        
        
        Properties props = System.getProperties();
        props.put("mail.smtp.host", host);                // 设置SMTP的主机
        props.put("mail.smtp.auth", "true");            // 需要经过验证
        
        Session session = Session.getInstance(props, new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });


        try {
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(from));
            InternetAddress[] address = {new InternetAddress(to)};
            msg.setRecipients(Message.RecipientType.TO, address);
            msg.setSubject(toChinese(subject));


            Multipart mp = new MimeMultipart();
            MimeBodyPart mbpContent = new MimeBodyPart();
            mbpContent.setText(content);
            mp.addBodyPart(mbpContent);


            /*    往邮件中添加附件    */
            Enumeration<String> efile = file.elements();
            while (efile.hasMoreElements()) {
                MimeBodyPart mbpFile = new MimeBodyPart();
                fileName = efile.nextElement().toString();
                FileDataSource fds = new FileDataSource(fileName);
                mbpFile.setDataHandler(new DataHandler(fds));
                mbpFile.setFileName(toChinese(fds.getName()));
                mp.addBodyPart(mbpFile);
            }


            msg.setContent(mp);
            msg.setSentDate(new Date());
            Transport.send(msg);
            
        } catch (MessagingException me) {
            me.printStackTrace();
            return false;
        }
        return true;
    }
    
    public static void main(String[] args) {
    Mail mb = new Mail();
         mb.setHost("smtp.163.com");                        // 设置SMTP主机(163),若用126,则设为:smtp.126.com
         mb.setUsername("XXXXX");                // 设置发件人邮箱的用户名
         mb.setPassword("XXXXX");                        // 设置发件人邮箱的密码,需将*号改成正确的密码
         mb.setFrom("XXXXX@163.com");            // 设置发件人的邮箱
         mb.setTo("XXXXX@qq.com");                // 设置收件人的邮箱
         mb.setSubject("测试_JavaMail");                    // 设置邮件的主题
         mb.setContent("本邮件中包含三个附件,请检查!");        // 设置邮件的正文


         mb.attachFile("C:/Users/shuytu/Desktop/Z1303C.xls");            // 往邮件中添加附件
//         mb.attachFile("E:/test.txt");
//         mb.attachFile("E:/test.xls");
         
         SendMail sm = new SendMail();
         System.out.println("正在发送邮件...");
         
         if(sm.sendMail(mb))                                // 发送邮件
             System.out.println("发送成功!");
         else
             System.out.println("发送失败!");
     }
}

2、Mail类

package action;


import java.util.Vector;




public class Mail {
private String to;                                // 收件人
    private String from;                            // 发件人
    private String host;                            // SMTP主机
    private String username;                        // 发件人的用户名
    private String password;                        // 发件人的密码
    private String subject;                            // 邮件主题
    private String content;                            // 邮件正文
    Vector<String> file;                            // 多个附件
    private String filename;                        // 附件的文件名
    
    public String getTo() {
        return to;
    }


    public void setTo(String to) {
        this.to = to;
    }


    public String getFrom() {
        return from;
    }


    public void setFrom(String from) {
        this.from = from;
    }


    public String getHost() {
        return host;
    }


    public void setHost(String host) {
        this.host = host;
    }


    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 getSubject() {
        return subject;
    }


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


    public String getContent() {
        return content;
    }


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


    public String getFilename() {
        return filename;
    }


    public void setFilename(String filename) {
        this.filename = filename;
    }


    public Vector<String> getFile(){
        return file;
    }
    
    public void attachFile(String fileName) {
        if(file == null)
            file = new Vector<String>();
        file.addElement(fileName);
    }
}

3、添加jar包(最好是把这一步放在第一步进行)

示例中需要用到两个包:mail.jar和activation.jar,其下载地址为:
http://java.sun.com/products/javamail/downloads/index.html
http://java.sun.com/javase/technologies/desktop/javabeans/jaf/downloads/index.html

下载后解压,将mail.jar和activation.jar放到project里的lib文件夹中,为其配置环境变量,或在myEclipse里的"Java Build Path"中将其添加到"Libraries"。


4、可能会报错,如(一)中第一个问题解决

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream

解决方法:

进到

E:\yangzh\myeclipse\Common\plugins\com.genuitec.eclipse.j2eedt.core_8.5.0.me201003231033\data\libraryset\EE_5

这个路径里,可以看到javaee.jar,用rar把这个文件打开,然后进到javax文件夹里,删除mail.jar和activation.jar(我的javaee.jar里,这两个东西是文件夹,总之删掉就OK,不过要注意备份一下)

删掉之后运行下面的代码,经行简单的修改以后就可以实现接收邮件的功能了!我已经测试过完全可行。


5、测试运行




附件也发送成功了,但是我们看到上面出现了中文乱码。


6、同时发送多个收件人,发送多个附件,实验成功。

将SendMail类修改为如下:

package action;


import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
import java.util.Vector;


import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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;


public class SendMail {


    public String toChinese(String text) {
        try {
            text = MimeUtility.encodeText(new String(text.getBytes(), "GB2312"), "GB2312", "B");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return text;
    }




    public boolean sendMail(Mail mb) {
        String host = mb.getHost();
        final String username = mb.getUsername();
        final String password = mb.getPassword();
        String from = mb.getFrom();
        List<String> to = mb.getTo();
        String subject = mb.getSubject();
        String content = mb.getContent();
        String fileName = mb.getFilename();
        Vector<String> file = mb.getFile();
        
        
        Properties props = System.getProperties();
        props.put("mail.smtp.host", host);                // 设置SMTP的主机
        props.put("mail.smtp.auth", "true");            // 需要经过验证
        
        Session session = Session.getInstance(props, new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });


        try {
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(from));
            for(int i=0;i<to.size();i++){
              InternetAddress[] address = {new InternetAddress(to.get(i))};
                   msg.setRecipients(Message.RecipientType.TO, address);
                   msg.setSubject(toChinese(subject));


                   Multipart mp = new MimeMultipart();
                   MimeBodyPart mbpContent = new MimeBodyPart();
                   mbpContent.setText(content);
                   mbpContent.setContent(content, "text/html;charset=GB2312");
                   mp.addBodyPart(mbpContent);
                   
                   MimeMultipart mmp=new MimeMultipart();
                   mmp.setSubType( "GB2312");
         
                   /*    往邮件中添加附件    */
                   Enumeration<String> efile = file.elements();
                   while (efile.hasMoreElements()) {
                       MimeBodyPart mbpFile = new MimeBodyPart();
                       fileName = efile.nextElement().toString();
                       FileDataSource fds = new FileDataSource(fileName);
                       mbpFile.setDataHandler(new DataHandler(fds));
                       mbpFile.setFileName(toChinese(fds.getName()));
                       mp.addBodyPart(mbpFile);
                   }
                   msg.setContent(mp);
                   msg.setSentDate(new Date());
                   Transport.send(msg);
            }
         
        } catch (MessagingException me) {
            me.printStackTrace();
            return false;
        }
        return true;
    }
    
    public static void main(String[] args) {
    Mail mb = new Mail();
         mb.setHost("smtp.163.com");                        // 设置SMTP主机(163),若用126,则设为:smtp.126.com
         mb.setUsername("XXXXX");                // 设置发件人邮箱的用户名
         mb.setPassword("XXXXX");                        // 设置发件人邮箱的密码,需将*号改成正确的密码
         mb.setFrom("XXXXX@163.com");            // 设置发件人的邮箱
         List<String> to=new ArrayList<String>();
         to.add("XXXXX@qq.com");
         to.add("XXXXX@qq.com");
         mb.setTo(to);              // 设置收件人的邮箱
         mb.setSubject("测试_JavaMail");                    // 设置邮件的主题
         mb.setContent("本邮件中包含三个附件,请检查!");        // 设置邮件的正文


         mb.attachFile("C:/Users/shuytu/Desktop/是我的.xls");            // 往邮件中添加附件
         mb.attachFile("C:/Users/shuytu/Desktop/一绪论文件.docx");
//         mb.attachFile("E:/test.xls");
         
         SendMail sm = new SendMail();
         System.out.println("正在发送邮件...");
         
         if(sm.sendMail(mb))                                // 发送邮件
             System.out.println("发送成功!");
         else
             System.out.println("发送失败!");
     }
}

Mail类改为:

package action;


import java.util.List;
import java.util.Vector;




public class Mail {
private List<String> to;                                // 收件人
    private String from;                            // 发件人
    private String host;                            // SMTP主机
    private String username;                        // 发件人的用户名
    private String password;                        // 发件人的密码
    private String subject;                            // 邮件主题
    private String content;                            // 邮件正文
    Vector<String> file;                            // 多个附件
    private String filename;                        // 附件的文件名
    
    public List<String> getTo() {
return to;
}


public void setTo(List<String> to) {
this.to = to;
}


public void setFile(Vector<String> file) {
this.file = file;
}


public String getFrom() {
        return from;
    }


    public void setFrom(String from) {
        this.from = from;
    }


    public String getHost() {
        return host;
    }


    public void setHost(String host) {
        this.host = host;
    }


    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 getSubject() {
        return subject;
    }


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


    public String getContent() {
        return content;
    }


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


    public String getFilename() {
        return filename;
    }


    public void setFilename(String filename) {
        this.filename = filename;
    }


    public Vector<String> getFile(){
        return file;
    }
    
    public void attachFile(String fileName) {
        if(file == null)
            file = new Vector<String>();
        file.addElement(fileName);
    }
}

但是出现收件邮件标题和附件标题中文乱码


7、解决中文乱码问题

。。。。。。找了好久还是没找到解决方案,待到以后解决再行发布。








1 0
原创粉丝点击