试图在没有用户交互的情况下发送邮件:java.lang.NoClassDefFoundError: javax.acti



我正在尝试发送没有用户交互的邮件。我创建了以下类:

import java.util.Calendar;
import java.util.Properties;
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.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
public class MailService {
    // public static final String MAIL_SERVER = "localhost";
    private String toList;
    private String ccList;
    private String bccList;
    private String subject;
    final private static String SMTP_SERVER = "smtp.gmail.com";
    final private static String SMTP_TLSENABLE = "true";
    final private static String SMTP_AUTH = "true";
    final private static String SMTP_PORT = "587";
    final private static String SMTP_USERNAME = "mymail@gmail.com";
    final private static String SMTP_PASSWORD = "Password";

    private String from;
    private String txtBody;
    private String htmlBody;
    private String replyToList;
    private boolean authenticationRequired = false;
    public MailService(String from, String toList, String subject, String txtBody, String htmlBody) {
        this.txtBody = txtBody;
        this.htmlBody = htmlBody;
        this.subject = subject;
        this.from = from;
        this.toList = toList;
        this.ccList = null;
        this.bccList = null;
        this.replyToList = null;
        this.authenticationRequired = true;
    }

    public void sendAuthenticated() throws AddressException, MessagingException {
        authenticationRequired = true;
        send();
    }
    /**
     * Send an e-mail
     * 
     * @throws MessagingException
     * @throws AddressException
     */
    public void send() throws AddressException, MessagingException {
        Properties props = new Properties();
        // set the host smtp address
        props.put("mail.smtp.host", SMTP_SERVER);
        props.put("mail.user", from);
        props.put("mail.smtp.starttls.enable", SMTP_TLSENABLE);  // needed for gmail
        props.put("mail.smtp.auth", SMTP_AUTH); // needed for gmail
        props.put("mail.smtp.port", SMTP_PORT);  // gmail smtp port
        /*Authenticator auth = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("mobile@mydomain.com", "mypassword");
            }
        };*/

        Session session;
        if (authenticationRequired) {
            Authenticator auth = new SMTPAuthenticator();
            props.put("mail.smtp.auth", SMTP_AUTH);
            session = Session.getDefaultInstance(props, auth);
        } else {
            session = Session.getDefaultInstance(props, null);          
        }
        // get the default session
        session.setDebug(true);
        // create message
        Message msg = new javax.mail.internet.MimeMessage(session);
        // set from and to address
        try {
            msg.setFrom(new InternetAddress(from, from));
            msg.setReplyTo(new InternetAddress[]{new InternetAddress(from,from)});
        } catch (Exception e) {
            msg.setFrom(new InternetAddress(from));
            msg.setReplyTo(new InternetAddress[]{new InternetAddress(from)});
        }
        // set send date
        msg.setSentDate(Calendar.getInstance().getTime());
        // parse the recipients TO address
        java.util.StringTokenizer st = new java.util.StringTokenizer(toList, ",");
        int numberOfRecipients = st.countTokens();
        javax.mail.internet.InternetAddress[] addressTo = new javax.mail.internet.InternetAddress[numberOfRecipients];
        int i = 0;
        while (st.hasMoreTokens()) {
            addressTo[i++] = new javax.mail.internet.InternetAddress(st
                    .nextToken());
        }
        msg.setRecipients(javax.mail.Message.RecipientType.TO, addressTo);
        // parse the replyTo addresses
        if (replyToList != null && !"".equals(replyToList)) {
            st = new java.util.StringTokenizer(replyToList, ",");
            int numberOfReplyTos = st.countTokens();
            javax.mail.internet.InternetAddress[] addressReplyTo = new javax.mail.internet.InternetAddress[numberOfReplyTos];
            i = 0;
            while (st.hasMoreTokens()) {
                addressReplyTo[i++] = new javax.mail.internet.InternetAddress(
                        st.nextToken());
            }
            msg.setReplyTo(addressReplyTo);
        }
        // parse the recipients CC address
        if (ccList != null && !"".equals(ccList)) {
            st = new java.util.StringTokenizer(ccList, ",");
            int numberOfCCRecipients = st.countTokens();
            javax.mail.internet.InternetAddress[] addressCC = new javax.mail.internet.InternetAddress[numberOfCCRecipients];
            i = 0;
            while (st.hasMoreTokens()) {
                addressCC[i++] = new javax.mail.internet.InternetAddress(st
                        .nextToken());
            }
            msg.setRecipients(javax.mail.Message.RecipientType.CC, addressCC);
        }
        // parse the recipients BCC address
        if (bccList != null && !"".equals(bccList)) {
            st = new java.util.StringTokenizer(bccList, ",");
            int numberOfBCCRecipients = st.countTokens();
            javax.mail.internet.InternetAddress[] addressBCC = new javax.mail.internet.InternetAddress[numberOfBCCRecipients];
            i = 0;
            while (st.hasMoreTokens()) {
                addressBCC[i++] = new javax.mail.internet.InternetAddress(st
                        .nextToken());
            }
            msg.setRecipients(javax.mail.Message.RecipientType.BCC, addressBCC);
        }
        // set header
        msg.addHeader("X-Mailer", "MyMailer");
        msg.addHeader("Precedence", "bulk");
        // setting the subject and content type
        msg.setSubject(subject);
        Multipart mp = new MimeMultipart("related");
        // set body message
        MimeBodyPart bodyMsg = new MimeBodyPart();
        bodyMsg.setText(txtBody, "iso-8859-1"); *THIS IS THE ERROR LINE*
        bodyMsg.setContent(htmlBody, "text/html");
        mp.addBodyPart(bodyMsg);
        msg.setContent(mp);
        // send it
        try {
            javax.mail.Transport.send(msg);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * SimpleAuthenticator is used to do simple authentication when the SMTP
     * server requires it.
     */
    private static class SMTPAuthenticator extends javax.mail.Authenticator {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            String username = SMTP_USERNAME;
            String password = SMTP_PASSWORD;
            return new PasswordAuthentication(username, password);
        }
    }
    public String getToList() {
        return toList;
    }
    public void setToList(String toList) {
        this.toList = toList;
    }
    public String getCcList() {
        return ccList;
    }
    public void setCcList(String ccList) {
        this.ccList = ccList;
    }
    public String getBccList() {
        return bccList;
    }
    public void setBccList(String bccList) {
        this.bccList = bccList;
    }
    public String getSubject() {
        return subject;
    }
    public void setSubject(String subject) {
        this.subject = subject;
    }
    public void setFrom(String from) {
        this.from = from;
    }
    public void setTxtBody(String body) {
        this.txtBody = body;
    }
    public void setHtmlBody(String body) {
        this.htmlBody = body;
    }
    public String getReplyToList() {
        return replyToList;
    }
    public void setReplyToList(String replyToList) {
        this.replyToList = replyToList;
    }
    public boolean isAuthenticationRequired() {
        return authenticationRequired;
    }
    public void setAuthenticationRequired(boolean authenticationRequired) {
        this.authenticationRequired = authenticationRequired;
    }
}

我下载了JavaMail http://www.oracle.com/technetwork/java/javamail/index-138643.html和Activation.jar: http://www.oracle.com/technetwork/java/jaf11-139815.html#download

将mail.jar和activation.jar添加到lib文件夹。

但是一旦我调用了下面的活动:

MailService mailer = new MailService("somemail@somemail.com","somemail@somemail.com","Subject","TextBody", "<b>HtmlBody</b>");
            try {
                mailer.sendAuthenticated();
            } catch (Exception e) {
                Log.e("MAIL", "Failed sending email.", e);
            }

我得到以下错误:

03-25 09:18:37.999: E/dalvikvm(12922): Could not find class 'javax.activation.DataHandler', referenced from method javax.mail.internet.MimeBodyPart.updateHeaders
03-25 09:18:37.999: W/dalvikvm(12922): VFY: unable to resolve new-instance 1138 (Ljavax/activation/DataHandler;) in Ljavax/mail/internet/MimeBodyPart;
03-25 09:18:37.999: D/AndroidRuntime(12922): Shutting down VM
03-25 09:18:37.999: W/dalvikvm(12922): threadid=1: thread exiting with uncaught exception (group=0x40018578)
03-25 09:18:38.009: E/AndroidRuntime(12922): FATAL EXCEPTION: main
03-25 09:18:38.009: E/AndroidRuntime(12922): java.lang.NoClassDefFoundError: javax.activation.DataHandler

我尝试将jar文件添加到构建路径,但仍然相同。有人有什么建议吗?

澄清一下,activation.jar依赖于核心Java rt.jar库中的类,这些类在Android运行时中不提供,因此失败。

JavaMail -android库由第三方开发人员友好地组合在一起,并提供所需的JavaMail功能,而不依赖于此。它们现在可能有点老了(2009年),但它们对大多数函数都足够有效。

相关内容

最新更新