Java可视化编程---SendMail工具的开发

时间:2023-02-22 14:01:48

介绍:

SendMail是一款简便的163邮箱发件工具

利用了163的SMTP接口来发送邮件

版本号:SendMail v1.0

在编写发送邮件工具之前,还需要安装 JavaMail API 和Java Activation Framework (JAF) 两个jar包

下载链接:https://files.cnblogs.com/files/wh4am1/mailAPI.zip

整体程序的逻辑构造如下

Java可视化编程---SendMail工具的开发

思路出来后,我们就利用eclipse IDE集成开发工具定制一个程序大概的框架

关于eclipse的可视化编程,可以使用windowbuilder插件:https://blog.csdn.net/jason0539/article/details/21219043

首先做出一个登陆窗口,是由一个账号编辑框、一个密码编辑框和按钮组成

Java可视化编程---SendMail工具的开发

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.util.Properties;
import javax.mail.*;
import com.sun.mail.util.MailSSLSocketFactory;
import java.awt.Button;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.security.GeneralSecurityException;
import javax.swing.JLabel; public class mailSend extends JFrame { /**
*
*/
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JTextField Username;
private JPasswordField Password;
private JLabel lblUsername;
private JLabel lblPassword;
private JLabel lblwham; /**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
mailSend frame = new mailSend();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} class SimpleAuthenticator extends Authenticator {
private String user;
private String pwd;
public SimpleAuthenticator(String user, String pwd) {
this.user = user;
this.pwd = pwd;
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, pwd);
}
} /**
* Create the frame.
* @throws GeneralSecurityException
* @throws NoSuchProviderException
*/
public mailSend() throws Exception {
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.163.com");
prop.setProperty("mail.transport.protocol","smtp");
prop.setProperty("mail.smtp.auth","true"); //开启SSL加密,不然会失败
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf); setTitle("SendMila v1.0");
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 415, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null); Button button = new Button("\u767B\u5F55");
button.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
try {
Session session = Session.getInstance(prop,new SimpleAuthenticator(Username.getText(),new String(Password.getPassword())));//测试邮件登陆
Transport ts = session.getTransport();
ts.connect();
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
SendText frame = new SendText(session,Username.getText());
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}catch(AuthenticationFailedException e1) {
JOptionPane.showMessageDialog(null, "用户名或者密码错误!", "ERROR", JOptionPane.ERROR_MESSAGE);
} catch (NoSuchProviderException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (MessagingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} //frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
});
button.setBounds(169, 156, 87, 25);
contentPane.add(button); Username = new JTextField();
Username.setBounds(131, 41, 212, 25);
contentPane.add(Username);
Username.setColumns(10); Password = new JPasswordField();
Password.setBounds(131, 96, 212, 24);
contentPane.add(Password); lblUsername = new JLabel("Username");
lblUsername.setBounds(34, 44, 72, 18);
contentPane.add(lblUsername); lblPassword = new JLabel("Password");
lblPassword.setBounds(34, 99, 72, 18);
contentPane.add(lblPassword); lblwham = new JLabel("\u4F5C\u8005:wh4am1 QQ:1976604307");
lblwham.setBounds(232, 247, 198, 18);
contentPane.add(lblwham);
}
}

mailSend.java

源代码如上

其中,账号密码通过PasswordAuthentication类型返回

Java可视化编程---SendMail工具的开发

再传入session中去

Java可视化编程---SendMail工具的开发

再new一个Transpor对象来装入session

Java可视化编程---SendMail工具的开发

接下来就是链接SMTP来判断账号密码的正确

Java可视化编程---SendMail工具的开发

利用Transport对象的connect去链接

若验证失败,则会返回一个AuthenticationFailedException异常

这时候我们可以用try-catch来捕获这个异常

看完我们的代码就可以发现,我们在connect后面,还有一个新的对象建立

Java可视化编程---SendMail工具的开发

学过Jframe的人就知道,这是新建了一个窗口

而这个窗口类就是SendText

而新建的窗口,就是我们登陆成功后,编写邮件正文的窗口

Java可视化编程---SendMail工具的开发

代码如下

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextArea;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JPopupMenu;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JScrollPane;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton; public class SendText extends JFrame { /**
*
*/
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JTextField textField;
private Session session;
private Transport ts;
private String Forme;
private JTextField textField_1; /**
* Launch the application.
*/
// public static void main(String[] args) {
// EventQueue.invokeLater(new Runnable() {
// public void run() {
// try {
// SendText frame = new SendText();
// frame.setVisible(true);
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
// });
// } public static MimeMessage creatMail(Session session,String Forme,String toe,String title,String text) throws Exception {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(Forme));
message.setRecipient(Message.RecipientType.TO, new InternetAddress(toe));
message.setSubject(title);
message.setText(text);
//message.setContent("<h1>Hello,World!</h1>","text/html");
return message;
} /**
* Create the frame.
* @throws NoSuchProviderException
*/
public SendText(Session s,String forme) throws Exception {
this.session = s;
this.Forme = forme;
this.ts = session.getTransport(); addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
dispose();
}
}); setTitle("SendText");
setResizable(false);
//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(200, 300, 510, 450);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null); JTextArea textArea = new JTextArea();
textArea.setLineWrap(true); JPopupMenu popupMenu = new JPopupMenu();
addPopup(textArea, popupMenu); JMenuItem mntmCopy = new JMenuItem("\u590D\u5236");
mntmCopy.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textArea.copy();
}
});
popupMenu.add(mntmCopy); JMenuItem menuItem = new JMenuItem("\u7C98\u8D34");
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textArea.paste();
}
});
popupMenu.add(menuItem); JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setBounds(0, 13, 492, 227);
contentPane.add(scrollPane); JLabel lblSendTo = new JLabel("Send to");
lblSendTo.setBounds(83, 301, 72, 18);
contentPane.add(lblSendTo); textField = new JTextField();
textField.setBounds(159, 298, 198, 24);
contentPane.add(textField);
textField.setColumns(10); JPopupMenu popupMenu_1 = new JPopupMenu();
addPopup(textField, popupMenu_1); JMenuItem menuItem_1 = new JMenuItem("\u590D\u5236");
menuItem_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textField.copy();
}
});
popupMenu_1.add(menuItem_1); JMenuItem menuItem_2 = new JMenuItem("\u7C98\u8D34");
menuItem_2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textField.paste();
}
});
popupMenu_1.add(menuItem_2); JButton btnSend = new JButton("Send");
btnSend.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
try {
ts.connect();
JOptionPane.showMessageDialog(null, "邮件已成功发送!", "Message", JOptionPane.INFORMATION_MESSAGE);
Message message = creatMail(session,Forme,textField.getText(),textField_1.getText(),textArea.getText());
ts.sendMessage(message, message.getAllRecipients());
} catch (MessagingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
ts.close();
} catch (MessagingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
btnSend.setBounds(169, 351, 113, 27);
contentPane.add(btnSend); JLabel lblMailTitle = new JLabel(" Mail title ");
lblMailTitle.setBounds(61, 270, 96, 18);
contentPane.add(lblMailTitle); textField_1 = new JTextField();
textField_1.setColumns(10);
textField_1.setBounds(159, 267, 198, 24);
contentPane.add(textField_1); JPopupMenu popupMenu_2 = new JPopupMenu();
addPopup(textField_1, popupMenu_2); JMenuItem menuItem_3 = new JMenuItem("\u590D\u5236");
menuItem_3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textField_1.copy();
}
});
popupMenu_2.add(menuItem_3); JMenuItem menuItem_4 = new JMenuItem("\u7C98\u8D34");
menuItem_4.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textField_1.paste();
}
});
popupMenu_2.add(menuItem_4);
}
private static void addPopup(Component component, final JPopupMenu popup) {
component.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger()) {
showMenu(e);
}
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) {
showMenu(e);
}
}
private void showMenu(MouseEvent e) {
popup.show(e.getComponent(), e.getX(), e.getY());
}
});
}
}

SendText.java

竟然前面的窗口我们能登陆成功,那么我们接下来要做的就是发送邮件

聪明的人就知道,我在创建窗口的时候传入了两个参数

这样做的好处就是不需要在这个窗口又建一遍session,而后面的String,是为了不让发件者再输入一遍自己的邮箱

Java可视化编程---SendMail工具的开发

万事俱备,我们就准备发件

Java可视化编程---SendMail工具的开发

跳过去看看

Java可视化编程---SendMail工具的开发

可以看到这又是一个链接,但这次链接不一样,后面建立了一个Message类,并调用了creatMail方法

Java可视化编程---SendMail工具的开发

转过去看之后发现,这时设置邮件正文和标题的方法

并最后用sendMessage方法发送邮件

下面就将整个工程打包jar

首先打开工程-〉鼠标右键选中Export

Java可视化编程---SendMail工具的开发

然后再选择

Java可视化编程---SendMail工具的开发

Next

Java可视化编程---SendMail工具的开发

至此,程序整体逻辑已完结。

下面附上测试效果。

Java可视化编程---SendMail工具的开发

如果邮件里面没有看到邮件,可以看看是不是SMTP协议没开,获知是在垃圾箱里。

Java可视化编程---SendMail工具的开发

Java可视化编程---SendMail工具的开发的更多相关文章

  1. java可视化编程-eclipse安装windowbuilder插件&lpar;转载&rpar;

    原文地址:http://blog.csdn.net/jason0539/article/details/21219043 一直做在安卓用xml作界面,对于java的控件不熟悉,也不习惯用代码做UI尤其 ...

  2. Java面向对象编程 第一章 面向对象开发方法概述

    一.软件开发经历的生命周期: ①软件分析 ②软件设计 ③软件编码 ④ 软件测试 ⑤ 软件部署 ⑥软件维护 二.为了提高软件开发效率,降低软件开发成本,一个优良的软件系统应该具备以下特点: ① 可重用性 ...

  3. Java并发编程-并发工具类及线程池

    JUC中提供了几个比较常用的并发工具类,比如CountDownLatch.CyclicBarrier.Semaphore. CountDownLatch: countdownlatch是一个同步工具类 ...

  4. Java可视化编程,基于布局管理器的UI设计

    在<事件驱动模型>讲述了如何将用户与功能实现代码联系到一起.怎么样便于用户理解和符合用户的使用习惯? 本篇还是就此问题作分析,站在用户角度上分析UI各组件倒底该如何设计呈现. 优秀的UI会 ...

  5. java并发编程 - Exexctors 工具类

    Executors 类提供了一系列静态工厂方法用于创建各种线程池. newFixedThreadPool 创建固定大小的线程池.每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小.线程池的大 ...

  6. java并发编程工具类JUC第四篇&colon;LinkedBlockingQueue链表队列

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue. LinkedBlockingQueue 队列是Blo ...

  7. java并发编程工具类JUC第七篇&colon;BlockingDeque双端阻塞队列

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...

  8. java并发编程工具类JUC第八篇&colon;ConcurrentHashMap

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...

  9. Java并发编程-总纲

    Java 原生支持并发,基本的底层同步包括:synchronized,用来标示一个方法(普通,静态)或者一个块需要同步执行(某一时刻,只允许一个线程在执行代码块).volatile,用来标识一个变量是 ...

随机推荐

  1. CSharpGL&lpar;2&rpar;设计和使用场景元素及常用接口

    CSharpGL(2)设计和使用场景元素及常用接口 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入 ...

  2. Ajax表单异步上传(包括文件域)

    起因 做前台页面时,需要调用WebAPI的Post请求,发送一些字段和文件(相当于把表单通过ajax异步发送出去,得到返回结果),然后得到返回值判断是否成功. 尝试 先是尝试了一下 "jQu ...

  3. tslib1&period;4与Qt4&period;8&period;6的交叉编译与移植

    最近开始正式接触QT开发,网上看了些移植教程都写的有点乱,博客园的emouse思·睿有一篇写的很好的文章,下面是文章的链接 http://www.cnblogs.com/emouse/archive/ ...

  4. HTML5列表、块和布局

    一.列表 <ul> <ol> <li> unorder order list ol: type="1 A a I i" start=" ...

  5. Python状况:为什么PyPy是Python的未来?

    Python 现在已经不仅仅是胶水脚本语言了. 不信?看看下面使用Python的成功案例: YouTube - 主要由 Python编写 NASA Industrial Light & Mag ...

  6. CSS自学笔记(12)&colon;CSS3文字特效

    在CSS3中新增了多个文本属性,同样有了这些属性我们在进行问题特效处理时,就尽可能少的用到其他软件去制作特效文字了. 在以前使用CSS进行web开发的时候,必须使用计算机上安装好的字体,如果有些用户的 ...

  7. C语言&lowbar;结构体的4种定义初始化方式及案例

    结构体是一种构造数据类型 (构造数据类型:数组类型.结构体类型(struct).共用体类型(union)).用途:把不同类型的数据组合成一个整体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一 ...

  8. Jedis(java操作redis数据库技术)

    Redis有什么命令,Jedis就有什么方法. 客户端无法连接时,需要考虑防火墙配置,比如6379端口是否开放,也可以直接关闭防火墙. Jedis连接池: import org.junit.Test; ...

  9. java调用微信扫一扫

    步骤: 1,获取Accesstoken(参考我之前的文章) 2,获取jsapiticket(参考我之前的文章) 3,获取签名 4JSSDK使用步骤 步骤一:绑定域名(JS接口安全域名),.否则会报in ...

  10. C&sol;S结构 B&sol;S结构

    [1]C/S 结构,即大家熟知的客户机和服务器结构.它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销.目前大多数应 ...