先上代码:
JavaUtil是我写的一个工具类,getSession()方法用于得到一个配置好了的session;getMessage()方法用于得到一个已经生成好了的MimeMessage类。  public static void main(String[] args) throws Exception {
Session session = JavaUtil.getSession();
MimeMessage msg = JavaUtil.getMessage(session); Transport tra = session.getTransport();
tra.connect(server,25,user,pas);
tra.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
tra.close();
}这段简单的代码总是抛出异常Exception in thread "main" javax.mail.NoSuchProviderException: No provider for smtp;我已经把网上的方法都试过了。网上有很多解决方案说是因为配置环境中有多个地方存在mail.jar包导致这个问题,但是我已经把电脑中所有的mail.jar包都删掉了,只留下桌面上有,然后再导入到Eclipse中,结果还是这样。

解决方案 »

  1.   

    是不是还缺少其他的什么包呀? 搜索下javamail都需要什么jar包
      

  2.   

    No provider for smtp;stmp没配置好,并不是jar包的问题,如果你的jar包有问题他会报ClassNotFoundException这样的错误
      

  3.   

    My Eclipse 的mail javaee.jar 有问题,其它的jar包一般不会有问题package org.andrew.javamail;import java.util.Enumeration;
    import java.util.Properties;
    import java.util.Vector;
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    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;import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;public class Mail { private static final String to = "[email protected]";
    private static final String from = "[email protected]";
    private static final String host = "smtp.163.com";
    private static String filename = "";
    private static final String subject = "JavaMail测试2";
    private static final String username = "";
    private static final String password = "";
    // 用于保存发送附件的文件名的集合
    private static Vector<String> file = new Vector<String>();

    private static final Log log = LogFactory.getLog(Mail.class); public static void main(String[] args) {
    // 创建Properties对象
    Properties props = System.getProperties();
    // 创建信件服务器
    props.put("mail.smtp.host", host);
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.user", username);
    props.put("mail.smtp.password", password); // 添加附件
    file.addElement("C:\\Documents and Settings\\Administrator\\桌面\\phone.txt");
    file.addElement("C:\\Documents and Settings\\Administrator\\桌面\\everyday.txt"); // 得到默认的对话对象
    Session session = Session.getDefaultInstance(props, null);
    try {
    // 创建一个消息,并初始化该消息的各项元素
    MimeMessage msg = new MimeMessage(session);
    msg.setFrom(new InternetAddress(from));
    InternetAddress[] address = { new InternetAddress(to) };
    msg.setRecipients(Message.RecipientType.TO, address); msg.setSubject(subject);
    String content = "<font color='red'>这是一份 Java Mail 测试邮件</font>";
    msg.setText(content, "utf-8", "html");
    // 后面的BodyPart将加入到此处创建的Multipart中
    Multipart mp = new MimeMultipart();
    // 利用枚举器方便的遍历集合
    Enumeration<String> efile = file.elements();
    // 检查序列中是否还有更多的对象
    while (efile.hasMoreElements()) {
    MimeBodyPart mbp = new MimeBodyPart();
    // 选择出每一个附件名
    filename = efile.nextElement().toString();
    // 得到数据源
    FileDataSource fds = new FileDataSource(filename);
    // 得到附件本身并至入BodyPart
    mbp.setDataHandler(new DataHandler(fds));
    // 得到文件名同样至入BodyPart
    mbp.setFileName(fds.getName());
    mp.addBodyPart(mbp);
    }
    // 移走集合中的所有元素
    file.removeAllElements();
    // Multipart加入到信件
    msg.setContent(mp); // 发送信件
    Transport transport = session.getTransport("smtp");
    transport.connect(host, username, password);
    transport.sendMessage(msg, msg
    .getRecipients(Message.RecipientType.TO));
    transport.close();
    System.out.println("发送成功");
    } catch (MessagingException mex) {
    mex.printStackTrace();
    Exception ex = null;
    if ((ex = mex.getNextException()) != null) {
    ex.printStackTrace();
    }
    System.out.println("发送失败");
    }
    }
    }
      

  4.   

    google 搜索: javax.mail.NoSuchProviderException: No provider for smtp
    第一条就是了。要学会先搜,再问
      

  5.   


    感谢你的回答,不过Google我还真是找了很久,那篇文章谈到的问题和我的问题并不是一样的。。所以参考价值并不是非常大,问题到现在也没有解决。
      

  6.   


    我感觉不是jar包的问题,但是不知道smtp是应该如何配置呢?求详解
      

  7.   


    你好!我在网上是找到了一些有关于两个jar包互相冲突的情况,但是我用的是eclipse,所以不知道这个问题具体应该怎么解决呢?
      

  8.   

         javax.mail.NoSuchProviderException: No provider for smtp
         不是包的问题吗,而是你的smtp服务器没设好。
         去检查一下smtp的设置。如果你要用163邮箱给别人发邮件的话,你必须设置smtp为:smtp.163.com。同理的,用gmail的邮箱发送的话就要用gmial的smtp服务器了。 
      

  9.   

    看错误好像是SMTP地址没设好。
      

  10.   


    你好!我的服务器地址是写在配置文件里的,mail.host = smtp.sina.com.cn,这样应该是没有错的吧?
      

  11.   


    还是抛一样的异常,下面是配置文件的内容:
    mail.transport.protocol = smtp;
    mail.smtp.auth = true;
    mail.host = smtp.sina.com;
      

  12.   

    给你部分代码参考,加了点注释:Properties p = new Properties();
            p.put("mail.smtp.auth", "true");
            p.put("mail.transport.protocol", "smtp");
            p.put("mail.smtp.host", "smtp.126.com");//设置smtp,自己Google一下,一大堆
            p.put("mail.smtp.port", "25");        Session mailsession = Session.getInstance(p);        MimeMessage msg = new MimeMessage(mailsession);        try {
                msg.setFrom(new InternetAddress(mailFrom));
                msg.setRecipients(Message.RecipientType.TO,
                                  InternetAddress.parse(mailTo));
                msg.setSentDate(new Date());
                msg.setSubject(mailSubject);            //设置邮件内容,作为Multipart对象的一部分
                MimeBodyPart mbp = new MimeBodyPart();
                mbp.setText(mailMessage);
                Multipart mulp = new MimeMultipart();
                mulp.addBodyPart(mbp);
                //设置附件,作为Multipart对象的一部分
                mbp = new MimeBodyPart();
                DataSource source = new FileDataSource(file);
                mbp.setDataHandler(new DataHandler(source));
                //解决附件乱码
                mbp.setFileName(MimeUtility.encodeWord(fileName,"UTF-8",null));
                mulp.addBodyPart(mbp);
                //设置信息内容,将Multipart 对象加入信息中
                msg.setContent(mulp);            Transport tran = mailsession.getTransport("smtp");
                tran.connect("smtp.126.com", "你自己的发送方用户名", "密码");
                tran.sendMessage(msg, msg.getAllRecipients());            msg.writeTo(System.out);
                out.println("邮件已经发送到<br>" + mailTo);        } catch (Exception e) {
                e.printStackTrace();
            }
      

  13.   

    记得以前也遇到过类似的问题,用了很多邮箱都不行,后来才发现是邮箱没有设置!POP3/IMAP/SMTP服务:设置成开启状态
      

  14.   

    现在免费版的126或163邮箱都不开通POP3/IMAP/SMTP服务协议了,要开通好像需要交钱,新浪、搜狐的邮箱目前好像还可以免费开通smtp、pop3协议吧!
      

  15.   

    非常感谢,问题已经解决了,是Transport对象中的smtp设置的问题,现在已经解决了。