/*
 * Created on 2004-4-26
 */import javax.mail.*;
import java.util.*;
import javax.mail.internet.*;/**
 * @author Bromon
 */
public class SenderWithSMTPVer1 {
String host = ""; String user = ""; String password = ""; public void setHost(String host) {
this.host = host;
} public void setAccount(String user, String password) {
this.user = user;
this.password = password;
} public void send(String from, String to, String subject, String content) {
Properties props = new Properties();
props.put("mail.smtp.host", host);// 指定SMTP服务器
props.put("mail.smtp.auth", "true");// 指定是否需要SMTP验证
try {
Session mailSession = Session.getDefaultInstance(props); mailSession.setDebug(true);// 是否在控制台显示debug信息 Message message = new MimeMessage(mailSession);
message.setFrom(new InternetAddress(from));// 发件人
message.addRecipient(Message.RecipientType.TO, new InternetAddress(
to));// 收件人 message.setSubject(subject);// 邮件主题
message.setText(content);// 邮件内容
message.saveChanges(); Transport transport = mailSession.getTransport("smtp");
transport.connect(host, user, password);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
} catch (Exception e) {
System.out.println(e);
} } public static void main(String args[]) {

SenderWithSMTPVer1 sm = new SenderWithSMTPVer1(); sm.setHost("smtp.126.com");// 指定要使用的邮件服务器
sm.setAccount("wendaoke", "12345647");// 指定帐号和密码 /*
 * @param String 发件人的地址 @param String 收件人地址 @param String 邮件标题 @param
 * String 邮件正文
 */
sm.send("[email protected]", "[email protected]", "标题", "内容");
}}
这是网上的一个例子,我在我机子上运行了,报错如下:
DEBUG: setDebug: JavaMail version 1.3.1
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.126.com", port 25220 126.com Anti-spam GT for Coremail System (126com[030901])
DEBUG SMTP: connected to host "smtp.126.com", port: 25EHLO deepin-d13f1cca
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate
AUTH LOGIN
334 dXNlcm5hbWU6
d2VuZGFva2U=
334 UGFzc3dvcmQ6
MTM5NTE4ODIyNjQ=
235 Authentication successful
DEBUG SMTP: use8bit false
MAIL FROM:<[email protected]>
250 Mail OK
RCPT TO:<[email protected]>
250 Mail OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   [email protected]
DATA
354 Send from Rising mail proxy
java.lang.SecurityException: SHA1 digest error for com/sun/mail/util/LineOutputStream.class
at sun.security.util.ManifestEntryVerifier.verify(ManifestEntryVerifier.java:195)
at java.util.jar.JarVerifier.processEntry(JarVerifier.java:207)
at java.util.jar.JarVerifier.update(JarVerifier.java:194)
at java.util.jar.JarVerifier$VerifierStream.read(JarVerifier.java:382)
at sun.misc.Resource.getBytes(Resource.java:64)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:248)
at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1130)
at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1607)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:390)
at sendMail.main(sendMail.java:42)
Exception in thread "main"
主要的问题就是java.lang.SecurityException: SHA1 digest error for com/sun/mail/util/LineOutputStream.class
这个出错在哪里?搞了一天,也没有弄明白,大家帮帮忙,怎么解决?

解决方案 »

  1.   

    增加一个 Authenticator验证 试试看 
     SMTP需要这个密码验证
      

  2.   

    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;
    import com.sun.mail.util.LineOutputStream;/**
     * <p>
     * Title: 使用javamail发送邮件
     * </p>
     * <p>
     * Description: 演示如何使用javamail包发送电子邮件。这个实例可发送多附件
     * </p>
     * <p>
     
     * </p>
     * <p>
     * Filename: Mail.java
     * </p>
     *  */
    public class Mail { String to = ""; // 收件人 String from = ""; // 发件人 String host = ""; // smtp主机 String username = ""; String password = ""; String filename = ""; // 附件文件名 String subject = ""; // 邮件主题 String content = ""; // 邮件正文 Vector file = new Vector(); // 附件文件集合 /**
     * <br>
     * 方法说明:默认构造器 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public Mail() {
    } /**
     * <br>
     * 方法说明:构造器,提供直接的参数传入 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public Mail(String to, String from, String smtpServer, String username,
    String password, String subject, String content) {
    this.to = to;
    this.from = from;
    this.host = smtpServer;
    this.username = username;
    this.password = password;
    this.subject = subject;
    this.content = content;
    } /**
     * <br>
     * 方法说明:设置邮件服务器地址 <br>
     * 输入参数:String host 邮件服务器地址名称 <br>
     * 返回类型:
     */
    public void setHost(String host) {
    this.host = host;
    } /**
     * <br>
     * 方法说明:设置登录服务器校验密码 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public void setPassWord(String pwd) {
    this.password = pwd;
    } /**
     * <br>
     * 方法说明:设置登录服务器校验用户 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public void setUserName(String usn) {
    this.username = usn;
    } /**
     * <br>
     * 方法说明:设置邮件发送目的邮箱 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public void setTo(String to) {
    this.to = to;
    } /**
     * <br>
     * 方法说明:设置邮件发送源邮箱 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public void setFrom(String from) {
    this.from = from;
    } /**
     * <br>
     * 方法说明:设置邮件主题 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public void setSubject(String subject) {
    this.subject = subject;
    } /**
     * <br>
     * 方法说明:设置邮件内容 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public void setContent(String content) {
    this.content = content;
    } /**
     * <br>
     * 方法说明:把主题转换为中文 <br>
     * 输入参数:String strText <br>
     * 返回类型:
     */
    public String transferChinese(String strText) {
    try {
    strText = MimeUtility.encodeText(new String(strText.getBytes(),
    "GB2312"), "GB2312", "B");
    } catch (Exception e) {
    e.printStackTrace();
    }
    return strText;
    } /**
     * <br>
     * 方法说明:往附件组合中添加附件 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public void attachfile(String fname) {
    file.addElement(fname);
    } /**
     * <br>
     * 方法说明:发送邮件 <br>
     * 输入参数: <br>
     * 返回类型:boolean 成功为true,反之为false
     */
    public boolean sendMail() { // 构造mail session
    Properties props = System.getProperties();
    props.put("mail.smtp.host", host);
    props.put("mail.smtp.auth", "true");

    Session session = Session.getDefaultInstance(props,
    new Authenticator() {
    public PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(username, password);
    }
    }); try {
    // 构造MimeMessage 并设定基本的值
    MimeMessage msg = new MimeMessage(session);
    msg.setFrom(new InternetAddress(from));
    System.out.println(from);

    InternetAddress[] address = { new InternetAddress(to) };
    msg.setRecipients(Message.RecipientType.TO, address);
    subject = transferChinese(subject);
    msg.setSubject(subject); // 构造Multipart
    Multipart mp = new MimeMultipart(); // 向Multipart添加正文
    MimeBodyPart mbpContent = new MimeBodyPart();
    mbpContent.setText(content);
    // 向MimeMessage添加(Multipart代表正文)
    mp.addBodyPart(mbpContent); // 向Multipart添加附件
    /*
     * Enumeration 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(fds.getName());
     * //向MimeMessage添加(Multipart代表附件) mp.addBodyPart(mbpFile); }
     * 
     * file.removeAllElements();
     */
    // 向Multipart添加MimeMessage
    msg.setContent(mp);
    msg.setSentDate(new Date());
    // 发送邮件
    Transport.send(msg); } catch (MessagingException mex) {
    mex.printStackTrace();
    Exception ex = null;
    if ((ex = mex.getNextException()) != null) {
    ex.printStackTrace();
    }
    return false;
    }
    return true;
    } /**
     * <br>
     * 方法说明:主方法,用于测试 <br>
     * 输入参数: <br>
     * 返回类型:
     */
    public static void main(String[] args) {
    Mail sendmail = new Mail();
    sendmail.setHost("smtp.126.com");
    sendmail.setUserName("wendaoke");
    sendmail.setPassWord("123456");
    sendmail.setTo("[email protected]");
    sendmail.setFrom("[email protected]");
    sendmail.setSubject("werwr");
    sendmail.setContent("sdfdf");
    sendmail.sendMail(); }
    } // end
    xiciliu()你说的Authenticator验证,是不是下面这一段:
    Session session = Session.getDefaultInstance(props,
    new Authenticator() {
    public PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(username, password);
    }
    });
    我又重新在网上下了一个,可是同样的错,
    SHA1 digest error for com/sun/mail/util/LineOutputStream.class
    我在网上下的两个例子都这个错,
    Name: com/sun/mail/util/LineOutputStream.class
    SHA1-Digest: 9iehnKKwfZLXws9+dOwvIf2T58Q=
    Name: com/sun/mail/util/LineOutputStream.class
    SHA1-Digest: I+Sy0bztH5WIvkPZU68AGsJcwwo=
    我在MANIFEST-MF和SUN_MICT.SF中都看到,有这两个SHA1-Digest要崩溃了!搞了两天了 ,
      

  3.   

    谢谢各位了,我在原来JDK里发现有mail.jar,aviation.jar,把他们删了,就可以执行了