java - 使用 JavaMail API 时出现 SSLException

标签 java android smtp jakarta-mail sslhandshakeexception

我正在使用 Java Mail API 开发一个应用程序来发送邮件。如果我使用yahoo 或gmail 托管的邮件服务器,我可以成功发送邮件。但是,当我尝试使用自己的邮件服务器时,发送邮件失败,可能导致失败的原因是什么?当我在我的设备中执行我的应用程序时,它显示“电子邮件未发送”,因此没有发生异常。请问我如何更改我的程序,以便我可以成功地将我的应用程序连接到我的 smtp 服务器,或者我如何获得更多信息来显示,以便我可以理解连接失败的原因。

这是我的程序: 发件人.java

public class Sender extends Activity {

    Button Send;
    TextView text;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sender);

        Send = (Button) findViewById(R.id.mail);
        text = (TextView) findViewById(R.id.textView1);

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
        .permitAll().build();
        StrictMode.setThreadPolicy(policy); 

        Send.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new SendMail().execute();
            }
        });

    }

    private class SendMail extends AsyncTask<String, Void, Integer> 
    { 
        ProgressDialog pd = null;
        String error = null;
        Integer result;

        @Override 
        protected void onPreExecute() { 
            // TODO Auto-generated method stub 
            super.onPreExecute(); 
            pd = new ProgressDialog(Sender.this); 
            pd.setTitle("Sending Mail"); 
            pd.setMessage("Please wait..."); 
            pd.setCancelable(false); 
            pd.show(); 
        } 

        @Override  
        protected Integer doInBackground(String... params) {  
            // TODO Auto-generated method stub  

            MailSender sender = new MailSender("me@mysmtp.com", "password");  

            sender.setTo(new String[]{"you@mysmtp.com", "me@gmail.com"}); 
            sender.setFrom("me@mysmtp.com"); 
            sender.setSubject("Test mail"); 
            sender.setBody("This is the mail body"); 
            try { 
                if(sender.send()) { 
                    System.out.println("Message sent"); 
                    return 1; 
                } else {
                    return 2; 
                } 
            } catch (Exception e) {    
             error = e.getMessage(); 
             Log.e("SendMail", e.getMessage(), e);     
            } 
            return 3;  
        }  

        protected void onPostExecute(Integer result) { 
            pd.dismiss(); 
            if(error!=null) { 
                text.setText(error); 
            } 
            if(result==1) { 
                Toast.makeText(Sender.this, 
                    "Email was sent successfully.", Toast.LENGTH_LONG) 
                    .show(); 
            } else if(result==2) { 
                Toast.makeText(Sender.this, 
                    "Email was not sent.", Toast.LENGTH_LONG).show(); 
            } else if(result==3) { 
                Toast.makeText(Sender.this, 
                    "There was a problem sending the email.", 
                    Toast.LENGTH_LONG).show(); 
            } 
        } 
    }  
}

邮件发送器.java

public class MailSender extends Authenticator { 
    private String user; 
    private String password; 

    private String [] to; 
    private String from; 

    private String port; 
    private String sport; 

    private String host; 

    private String subject; 
    private String body; 

    private boolean auth; 
    private boolean debuggable; 

    private Multipart multi; 

    public MailSender(){ 
        host = "web.mysmtp.com"; 
        port = "25"; 
        sport = "25"; 

        user = ""; 
        password = ""; 
        from = ""; 
        subject = ""; 
        body = ""; 

        debuggable = false; 
        auth = true; 

        multi = new MimeMultipart(); 

        // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added. 
        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();  
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");  
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");  
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");  
        CommandMap.setDefaultCommandMap(mc);  
    } 

    public MailSender(String user, String password){ 
        this();       
        this.user = user; 
        this.password = password;    
    } 

    public boolean send() throws Exception { 
        Properties props = setProperties(); 

        try{ 
            Session session = Session.getInstance(props, this); 
            session.setDebug(true); 

            MimeMessage msg = new MimeMessage(session); 

            msg.setFrom(new InternetAddress(from)); 

            InternetAddress[] addressTo = new InternetAddress[to.length]; 
            for(int i=0; i<to.length; i++){ 
                addressTo[i] = new InternetAddress(to[i]); 
            } 

            msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 
            msg.setSubject(subject); 
            msg.setSentDate(new Date()); 

            BodyPart messageBodyPart = new MimeBodyPart(); 
            messageBodyPart.setText(body); 
            multi.addBodyPart(messageBodyPart); 

            msg.setContent(multi); 

            Transport transport = session.getTransport("smtps"); 
            transport.connect(host, 25, user, password); 
            transport.sendMessage(msg, msg.getAllRecipients()); 
            transport.close(); 
            return true; 
        } catch (Exception e) { 
            e.printStackTrace(); 
            return false; 
        } 
    } 

    public void addAttachment(String filename) throws Exception { 
        BodyPart messageBodyPart = new MimeBodyPart(); 
        DataSource source = new FileDataSource(filename); 
        messageBodyPart.setDataHandler(new DataHandler(source)); 
        messageBodyPart.setFileName(filename); 

        multi.addBodyPart(messageBodyPart); 
    } 

    @Override  
      public PasswordAuthentication getPasswordAuthentication() {  
        return new PasswordAuthentication(user, password);  
      } 

    private Properties setProperties() { 
        Properties props = new Properties(); 

        props.put("mail.smtp.host", host); 

        if(debuggable) { 
            props.put("mail.debug", "true"); 
        } 

        if(auth) { 
            props.put("mail.smtp.auth", "true"); 
        } 

        props.put("mail.smtp.port", port); 
        props.put("mail.smtp.socketFactory.port", sport); 
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
        props.put("mail.smtp.socketFactory.fallback", "false"); 

        return props; 
    } 

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

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

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

    public void setBody(String body) {  
        this.body = body;  
    } 
}

错误日志中的错误信息:

08-15 11:21:37.284: W/System.err(2553):     javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x5c075548: Failure in SSL library, usually a protocol error
08-15 11:21:37.291: W/System.err(2553): Caused by: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x5c075548: Failure in SSL library, usually a protocol error
08-15 11:21:37.299: W/System.err(2553): Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x5c075548: Failure in SSL library, usually a protocol error

最佳答案

您正在连接到端口 25 并使用 SSL。端口 25 是非 SSL(纯文本)端口。假设您的服务器设置为支持 SSL,请使用不需要您指定端口号的连接方法并让 JavaMail 使用默认端口。

关于java - 使用 JavaMail API 时出现 SSLException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11963587/

相关文章:

Java input = ""与 input = null 不同吗?

android - 如何在 Flutter 中制作水平数字选择器小部件?

android - 通过 Intent 保存 VCard 联系人

java - com.sun.mail.smtp.SMTPSendFailedException : 530 5. 7.0 必须先发出 STARTTLS 命令

java - SMTPClient 设置开放端口的超时

java - 适用于移动应用程序的最佳远程处理技术是什么?

java - 正则表达式可能有一个下划线,然后至少有一个合法字符

java - 如何更改音量/更改AudioClip

java - 有没有办法持续更新Android应用程序中的方法?

smtp - 从 Sendgrid 向 Outlook 或 Hotmail 用户发送电子邮件的问题