📄 javamailframe.java
字号:
public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(account.userName, account.passWord); } }private void btnSendActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSendActionPerformed// TODO add your handling code here: if (waitDlg == null) { waitDlg = new WaitingWindow(this); } Thread sendThread = new Thread(new Runnable() { @Override public void run() { JavaMailFrame.this.setEnabled(false); boolean success; Properties props = new Properties();// fill props with any information Session session; try { if (account.host.contains("smtp")) { // Setup mail server props.put("mail.smtp.host", account.host); props.put("mail.smtp.auth", "true"); //SMTP服务用户认证。虽然foxmail配置中没有显示需要身份验证,实际上都加了authentication Authenticator auth = new MyAuthenticator(); session = Session.getInstance(props, auth); } else { props.put("mail.smtp.host", getMxServer()); props.put("mail.smtp.port", "25"); props.put("mail.smtp.auth", "f"); session = Session.getInstance(props, null); } success = sendMessage(session); JavaMailFrame.this.setEnabled(true); waitDlg.setVisible(false); if (success) { JOptionPane.showMessageDialog(JavaMailFrame.this, "发送成功!"); } else { JOptionPane.showMessageDialog(JavaMailFrame.this, "发送失败!", "错误", JOptionPane.ERROR_MESSAGE); } } catch (Exception ex) { JavaMailFrame.this.setEnabled(true); waitDlg.setVisible(false); JOptionPane.showMessageDialog(JavaMailFrame.this, "发送失败!" + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);// Logger.getLogger(JavaMailFrame.class.getName()).log(Level.SEVERE, null, ex); } } }); sendThread.start(); waitDlg.setVisible(true);}//GEN-LAST:event_btnSendActionPerformed private String getMxServer() throws Exception { // DNS服务器,如果需要的话手工设置一下。 String dns = "dns://"; //得到接受方的服务器域名 String strTo = txtTo.getText(); if (strTo.isEmpty()) { throw new Exception("收件人不能为空"); } else if (strTo.contains(";")) { throw new Exception("只能发给一个收件人"); } String domain = strTo.substring(strTo.indexOf('@') + 1); Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory"); env.put(Context.PROVIDER_URL, dns); DirContext ctx = new InitialDirContext(env); Attributes attrs = ctx.getAttributes(domain, new String[]{"MX"}); if (attrs == null || attrs.size() <= 0) { throw new java.lang.IllegalStateException("错误:你的DNS服务器没有相应的MX记录!"); } NamingEnumeration servers = attrs.getAll(); // 列出所有邮件服务器: String smtpHost = null; if (servers.hasMore()) { smtpHost = (String) ((Attribute) servers.next()).get(0); smtpHost = smtpHost.substring(smtpHost.lastIndexOf(' ') + 1); } return smtpHost; } private boolean sendMessage(Session session) throws MessagingException, UnsupportedEncodingException { int i, nCount; boolean success = false; // Define message MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(account.from)); //发送人 String[] recipients = txtTo.getText().split(";"); nCount = recipients.length; InternetAddress[] recAddrs = new InternetAddress[nCount]; for (i = 0; i < nCount; i++) { recAddrs[i] = new InternetAddress(recipients[i]); } message.addRecipients(Message.RecipientType.TO, recAddrs);//收件人 if (!txtCC.getText().isEmpty()) { recipients = txtCC.getText().split(";"); nCount = recipients.length; recAddrs = new InternetAddress[nCount]; for (i = 0; i < nCount; i++) { recAddrs[i] = new InternetAddress(recipients[i]); } message.addRecipients(Message.RecipientType.CC, recAddrs);//抄送人 } message.setSubject(txtSubject.getText()); //标题,自动对非US-ASCII编码 message.setHeader("X-Mailer", "JavaMail"); //不加此句的话某些smtp服务器(如tom.com)认为是垃圾邮件,拒发。“553 this mail is blocked by kbas” message.setSentDate(new Date()); //发送日期 if (listModel.size() > 0) { //has attachment Multipart multiPart = new MimeMultipart(); BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText(txtContent.getText()); multiPart.addBodyPart(messageBodyPart); Enumeration<Attachment> attaches = (Enumeration<Attachment>) listModel.elements(); while (attaches.hasMoreElements()) { Attachment attach = attaches.nextElement(); messageBodyPart = new MimeBodyPart(); messageBodyPart.setDataHandler(new DataHandler(attach.dataSrc)); messageBodyPart.setFileName(MimeUtility.encodeText(attach.fileName)); multiPart.addBodyPart(messageBodyPart); } message.setContent(multiPart); } else { message.setText(txtContent.getText()); //若统一看作multipart的话,当没有附件时也可能会出现“回形针” // Send message } session.setDebug(true); nCount = 3; while (nCount > 0 && !success) { try { Transport.send(message); success = true; } catch (Exception ex) { } nCount--; } return success; }private void btnAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAddActionPerformed// TODO add your handling code here: JFileChooser chooser = new JFileChooser(); chooser.setCurrentDirectory(new File(currentPath)); chooser.setMultiSelectionEnabled(true); int ret = chooser.showOpenDialog(this); if (ret == JFileChooser.APPROVE_OPTION) { currentPath = chooser.getSelectedFile().getPath(); File[] files = chooser.getSelectedFiles(); for (File file : files) { String fileName = file.getName(); FileDataSource dataSrc = new FileDataSource(file.getPath()); Attachment attach = new Attachment(fileName, dataSrc); listModel.addElement(attach); } }}//GEN-LAST:event_btnAddActionPerformedprivate void btnDelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDelActionPerformed// TODO add your handling code here: int[] sels = lstAttach.getSelectedIndices(); int i, nCount = sels.length; if (nCount >= 0) { for (i = nCount - 1; i >= 0; i--) { listModel.remove(sels[i]); } }}//GEN-LAST:event_btnDelActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnAdd; private javax.swing.JButton btnDel; private javax.swing.JButton btnSend; private javax.swing.JButton jButton1; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JList lstAttach; private javax.swing.JTextField txtCC; private javax.swing.JTextArea txtContent; private javax.swing.JTextField txtSubject; private javax.swing.JTextField txtTo; // End of variables declaration//GEN-END:variables}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -