邮件发送客户端

一、Java Mail API简介

JavaMail API是读取、撰写、发送电子信息的可选包。我们可用它来建立如Eudora、Foxmail、MS Outlook Express一般的邮件用户代理程序(Mail User Agent,简称MUA)。而不是像sendmail或者其它的邮件传输代理(Mail Transfer Agent,简称MTA)程序那样可以传送、递送、转发邮件。从另外一个角度来看,我们这些电子邮件用户日常用MUA程序来读写邮件,而MUA依赖着MTA处理邮件的递送。
JavaMail核心类:Session、Message、Address、Authenticator、Transport、Store、Folder。
Session类:
定义了基本的邮件会话。就像Http会话那样,我们进行收发邮件的工作都是基于这个会话的。Session对象利用了Java.util.Properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息。
Message类: SUN提供了Message类型来帮助开发者完成这项工作。由于Message是一个抽象类,大多数情况下,我们使用javax.mail.internet.MimeMessage这个子类,该类是使用MIME类型、MIME信息头的邮箱信息。信息头只能使用US-ASCII字符,而非ASCII字符将通过编码转换为ASCII的方式使用
Address类:到这里,我们已经建立了Session和Message,下面将介绍如何使用邮件地址类:Address。像Message一样,Address类也是一个抽象类,所以我们将使用javax.mail.internet.InternetAddress这个子类。
Authenticator类:像java.NET类那样,JavaMail API通过使用授权者类(Authenticator)以用户名、密码的方式访问那些受到保护的资源,在这里“资源”就是指邮件服务器。在javax.mail包中可以找到这个JavaMail的授权者类(Authenticator)。
Transport类:在发送信息时,Transport类将被用到。这个类实现了发送信息的协议(通称为SMTP),此类是一个抽象类,我们可以使用这个类的静态方法send()来发送消息:Transport.send(message);
Store和Folder类:接收邮件和发送邮件很类似都要用到Session。但是在获得Session后,我们需要从Session中获取特定类型的Store,然后连接到Store,这里的Store代表了存储邮件的邮件服务器。在连接Store的过程中,极有可能需要用到用户名、密码

ps:项目要用到jar包:activation.jar和mail.jar.

二、代码实现

项目源码下载地址:点我

package com.hnust.frame;import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Date;
import java.util.Properties;import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Part;
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 javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class SendAttachmentMailFrame extends JFrame {/*** */private static final long serialVersionUID = 1L;private JTextArea ta_attachment;private JTextArea ta_text;private JTextField tf_title;private JTextField tf_send;private JTextField tf_receive;private JPasswordField tf_password;/*** Session类是定义了一个基本会话,是Java Mail API最高层入口类。所有其他类都是经由这个Session才得以生效。* Session对象从java.util.Properties对象中获取信息,* 如邮件发送服务器、接收邮件协议、发送邮件协议、用户名、密码及整个应用程序中共享的其他信息* */private Session session;private String sendHost = "localhost";private String sendProtocol="smtp";private String filePathAndName = null;public static void main(String args[]) {EventQueue.invokeLater(new Runnable() {public void run() {try {SendAttachmentMailFrame frame = new SendAttachmentMailFrame();frame.init();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}public SendAttachmentMailFrame() {super();setTitle("发送带附件的邮件");getContentPane().setLayout(null); //设置布局为空布局setBounds(200, 200, 480, 400);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JLabel label = new JLabel();label.setForeground(new Color(0, 0, 255));label.setFont(new Font("", Font.BOLD, 22));label.setText("@发送带附件的邮件@");label.setBounds(123, 10, 230, 24);getContentPane().add(label);final JLabel label_1 = new JLabel();label_1.setText("收件人地址:");label_1.setBounds(22, 42, 85, 18);getContentPane().add(label_1);tf_receive = new JTextField();tf_receive.setBounds(113, 40, 287, 22);getContentPane().add(tf_receive);final JLabel label_2 = new JLabel();label_2.setText("发件人邮箱:");label_2.setBounds(22, 68, 78, 18);getContentPane().add(label_2);tf_send = new JTextField();tf_send.setBounds(113, 66, 287, 22);getContentPane().add(tf_send);final JLabel label_2_1 = new JLabel();label_2_1.setText("邮箱密码:");label_2_1.setBounds(30, 95, 78, 18);getContentPane().add(label_2_1);tf_password = new JPasswordField();tf_password.setBounds(113, 95, 278, 18);getContentPane().add(tf_password);final JLabel label_3 = new JLabel();label_3.setText("主    题:");label_3.setBounds(32, 125, 66, 18);getContentPane().add(label_3);tf_title = new JTextField();tf_title.setBounds(113, 125, 287, 22);getContentPane().add(tf_title);final JLabel label_4 = new JLabel();label_4.setText("正    文:");label_4.setBounds(34, 150, 66, 18);getContentPane().add(label_4);//创建一个空的(无视口的视图)JScrollPane,需要时水平和垂直滚动条都可显示final JScrollPane scrollPane = new JScrollPane();scrollPane.setBounds(113, 150, 287, 76);getContentPane().add(scrollPane);ta_text = new JTextArea();//创建一个视口(如果有必要)并设置其视图scrollPane.setViewportView(ta_text);final JButton btn_send = new JButton();btn_send.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {String fromAddr = tf_send.getText().trim();String toAddr = tf_receive.getText().trim();// 真实存在的目标邮件地址String title = tf_title.getText().trim();String text = ta_text.getText().trim();try {sendMessage(fromAddr, toAddr, title, text);   //发送消息} catch (Exception e1) {e1.printStackTrace();}}});btn_send.setText("发    送");btn_send.setBounds(225, 300, 85, 28);getContentPane().add(btn_send);//添加发送按钮到容器final JButton btn_exit = new JButton();btn_exit.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {System.exit(0);}});btn_exit.setText("退    出");btn_exit.setBounds(316, 300, 84, 28);getContentPane().add(btn_exit);final JButton button = new JButton();   //添加附件按钮button.addActionListener(new ActionListener() { //点击事件public void actionPerformed(final ActionEvent e) {JFileChooser fileChooser = new JFileChooser(); // 创建文件对话框int returnValue = fileChooser.showOpenDialog(null);// 打开文件选择对话框if (returnValue == JFileChooser.APPROVE_OPTION) { // 判断是否选择了文件File file = fileChooser.getSelectedFile(); // 获得文件对象if (file.length() / 1024.0 / 1024 > 50.0) {JOptionPane.showMessageDialog(null, "请选择小于等于50MB的文件。");return;}filePathAndName = file.getAbsolutePath();// 获得文件的完整路径和文件名ta_attachment.append(file.getName());// 显示附件文件的名称}}});button.setText("添加附件");button.setBounds(113, 300, 106, 28);getContentPane().add(button);final JLabel label_5 = new JLabel();label_5.setText("附    件:");label_5.setBounds(32, 230, 66, 18);getContentPane().add(label_5);//创建一个空的(无视口的视图)JScrollPane,需要时水平和垂直滚动条都可显示final JScrollPane scrollPane_1 = new JScrollPane();scrollPane_1.setBounds(112, 230, 287, 63);getContentPane().add(scrollPane_1);ta_attachment = new JTextArea();//创建一个视口(如果有必要)并设置其视图scrollPane_1.setViewportView(ta_attachment);}public void init() throws Exception {/*** Session对象利用Properties对象获得了邮件发送服务器、接收邮件协议、发送邮件协议、用户名、密码等整个应用程序都要使用到的共享信息* */Properties props = new Properties();/***  put()方法将指定 key 映射到此哈希表中的指定 value。键和值都不可以为 null。 通过使用与原来的键相同的键调用 get 方法,可以获取相应的值* */props.put("mail.transport.protocol", sendProtocol);//发送协议props.put("mail.smtp.class", "com.sun.mail.smtp.SMTPTransport");props.put("mail.smtp.host", "127.0.0.1");//本机地址和域名绑定。否则会出错 详见:http://www.cnblogs.com/zhongzheng123/p/5869554.htmlsession = Session.getDefaultInstance(props);}/*** @param fromAddr 发送方地址* @param toAddr 接收方地址* @param title 主题* @param text 文本内容* @throws Exception 异常*/public void sendMessage(String fromAddr,String toAddr,String title,String text) throws Exception {//Message类封装的邮件信息,提供了访问和设置邮件内容的方法Message msg = new MimeMessage(session);// 创建Message对象/*** 建立了Session和Message对象之后,使用邮件地址Address抽象类的子类:javax.mail.internetAddress * */InternetAddress[] toAddrs = InternetAddress.parse(toAddr,false);// 接收方地址msg.setRecipients(Message.RecipientType.TO, toAddrs);// 指定接收方msg.setSentDate(new Date());// 设置发送日期msg.setSubject(title);// 设置主题msg.setFrom(new InternetAddress(fromAddr));// 设置发送地址Multipart multipart = new MimeMultipart();// 可以添加复杂内容的Multipart对象(Multipart抽象类是保存电子邮件内容的容器)MimeBodyPart mimeBodyPartText = new MimeBodyPart();// 添加正文的MimeBodyPart对象mimeBodyPartText.setText(text);// 指定正文multipart.addBodyPart(mimeBodyPartText);// 添加到Multipart对象上if (filePathAndName!=null && !filePathAndName.equals("")){MimeBodyPart mimeBodyPartAdjunct = new MimeBodyPart();// 添加附件的MimeBodyPart对象FileDataSource fileDataSource = new FileDataSource(filePathAndName);// 创建附件的FileDataSource对象mimeBodyPartAdjunct.setDataHandler(new DataHandler(fileDataSource));// 指定数据mimeBodyPartAdjunct.setDisposition(Part.ATTACHMENT);// 指定添加的内容是附件String name = fileDataSource.getName();mimeBodyPartAdjunct.setFileName(MimeUtility.encodeText(name, "GBK", null));// 指定附件文件的名称multipart.addBodyPart(mimeBodyPartAdjunct);// 添加到Multipart对象上}msg.setContent(multipart);// 设置邮件内容String server = "smtp.163.com";  //设置SMTP服务器(220.181.12.15)String username = tf_send.getText();  //获取发送方的邮箱用户名String password = new String(tf_password.getPassword());    //获取发送方的邮箱密码/*** Transport类根据指定的邮件发送协议(通常是SMTP),通过指定的邮件发送服务器来发送邮件。* Transport类是抽象类,他提供了一个静态方法send(Message)来发送邮件* */       Transport transport = session.getTransport();  transport.connect(server, username, password);  //连接服务器transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO)); //发送邮件filePathAndName = null;JOptionPane.showMessageDialog(null, "邮件发送成功。");}
}

运行效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/55542.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 微信小程序表单input输入框,点击下面的输入框时输入法弹出会把输入框内容顶上去

项目场景: 原因分析: 当前页面设置了高度,以及滚动轴,输入法弹出时并没有把页面内容往上定,只顶了输入框内容 解决方案: 不要设置死高度,内容自适应,输入法弹出时让他自己往上顶整…

chatgpt赋能python:Python小数点进位教程:学会进阶计算

Python小数点进位教程:学会进阶计算 什么是小数点进位? 小数点进位是指计算机在处理小数时发生的一种情况,即当小数位数过多时,计算机会自动四舍五入或向上进位,以保证计算的准确性。 Python中的小数点进位 在Pyth…

鸿蒙OS应用开发工具下载安装教程

前言 提示:面向全场景多设备,提供一站式的分布式应用开发平台,支持分布式多端开发、分布式多端调测、多端模拟仿真,全方位的质量与安全保障。 提示:以下是本篇文章正文内容,下面案例仅供参考,皆…

ubuntu20.04安装微信客户端,亲测有效!

腾讯微信官网没有出Ubuntu版本的客户端,但是可以根据我提供的微信客户端软件,在Ubuntu20.04版本上进行安装,亲测有效!文章末尾提供下载链接。 Ubuntu版微信客户端,支持托盘菜单;支持搜索联系人;…

Ubuntu22.10 安装微信方法

Ubuntu22.10 安装微信方法 Ubuntu操作系统中,我尝试过用wine方式安装数次都没有能够启动成功。。。 方法如下 在Ubuntu上安装微信需要使用Wine,Wine是一款可以在Linux系统上运行Windows应用程序的兼容层。以下是安装微信的步骤:安装Wine 打…

Ubuntu系统下安装微信客户端

此项目为开源项目,电脑需要安装git和node.js github地址: https://github.com/geeeeeeeeek/electronic-wechat # 下载项目 git clone https://github.com/geeeeeeeeek/electronic-wechat.git # 进入项目目录 cd electronic-wechat # 安装依赖包,成功后…

如何更换安装鸿蒙系统,华为鸿蒙系统2.0如何进行安装?鸿蒙系统2.0安装方法详细介绍...

华为鸿蒙系统2.0如何进行安装?现在已经可以安装鸿蒙系统2.0,但是你不清楚安装,下面就让浏览器小编为大家带来,鸿蒙系统2.0安装方法详细介绍。 部分更新了华为鸿蒙OS用户表示,安卓和鸿蒙的应用软件都可以玩,UI暂时没变、用户体验感…

Ubuntu系统下安装微信

安装微信实现截图发送图片功能 1.打开终端输入命令,更新软件源 sudo apt-get update 2.输入以下命令(一定注意 -O- 中间是大写字母O,不是0也不是小写o!!!) wget -O- https://deepin-wine.…

华为鸿蒙os下载安装,华为鸿蒙系统安装包

华为鸿蒙系统安装包下载是华为打造的最新安卓手机系统,华为鸿蒙系统可以让手机、穿戴设备、PC等终端之间连接更稳定,下载之后手机使用更流畅,可以说是2020年最好的安卓系统,功能强大很稳定,感兴趣的用户快来下载安装吧…

鸿蒙系统如何下载使用谷歌商店

下载 实际上,鸿蒙系统本身是有谷歌相关的文件,只是不能用而已 你打开设置,最下面就是google相关组件 网上有大量的繁杂的教程,不外乎是引流到qq,用电脑软件连接手机完成一堆复杂的操作 所以在我的极简理念之下&…

华为鸿蒙系统开发环境安装与初识

今天了解了一下华为鸿蒙系统开发,作为国产系统还是要去了解一下的,毕竟这个系统很多设备都会用到、例如PC、手机、电视等穿戴设备都会用到。 既然要开发那么肯定要成为开发者了,那么就都下面的网站注册成为开发者,https://develop…

Ubuntu20.04系统WineHQ7.0安装微信

提供3种Ubuntu系统安装微信的方法,在Ubuntu20.04上验证都ok。 1.WineHQ7.0安装微信:ubuntu20.04安装最新版微信 --可以支持微信最新版,但是适配的不是特别好;比如WeChartOCR.exe 报错。 2. 原生微信安装:linux系统下的…

手机提供GMS支持(适用安卓和鸿蒙系统)

手机提供GMS支持 - 适用安卓和鸿蒙系统 前言方式1:安装GMS套件(不推荐)方式2:安装OurPlay(推荐)方式3:安装Gspace(推荐) 前言 本文提供多种为手机(安卓和鸿蒙…

python zmail 收发谷歌邮箱邮件遇到的问题

错误信息&#xff1a; 一、Please log in via your web browser and then try again.\n5.7.14 Learn more 二、poplib.error_proto: b’-ERR [AUTH] Web login required: https://support.google 三、534, b’5.7.14 <https://accounts.google.com/signin/continue?sarp1&a…

谷歌账号Gmail邮箱修改密码提示需要手机设备验证码如何处理

谷歌邮箱账号&#xff0c;GMail邮箱在修改密码的时候老是提示需要某台手机设备的验证码&#xff0c;这种问题怎么处理呢&#xff1f; 出现这个情况&#xff0c;主要是因为你的VPN代理IP不太干净导致的&#xff0c;干净的IP一般都不提示设备验证码的&#xff0c;特别是用第三方客…

国内随时接收发送谷歌邮箱

1. 写在前面 鉴于邮箱在我们生活开发学习中很重要&#xff0c;所以我们需要选择一种邮箱&#xff0c;国内这些邮箱中比如163或者qq太容易暴露个人信息了&#xff0c;当然可以对163邮箱自定义&#xff0c;但是国内这163太泛滥了&#xff0c;很难找到。所以谷歌邮箱是一个不错的选…

java使用谷歌邮箱发送邮件

分两步&#xff1a; 1.打开开关&#xff1a;允许不够安全的应用 链接&#xff1a;https://myaccount.google.com/lesssecureapps 2.访问这个链接&#xff1a;https://accounts.google.com/DisplayUnlockCaptcha允许任何设备登陆 最后&#xff0c;请尝试在您的新设备上或在新应…

如何利用谷歌邮箱别名功能获取无限 Gmail 邮箱

公众号关注 「奇妙的 Linux 世界」 设为「星标」&#xff0c;每天带你玩转 Linux &#xff01; 我们注册有些国外的服务时&#xff0c;是不能用国内邮箱注册的&#xff0c;这时一个 Gmail 邮箱就显得很有必要。而有时候我们会需要注册多个账号&#xff0c;当然你可以用多个 Gma…

Python可以做哪些兼职?

可以干的兼职有好多&#xff0c;主要围绕Python的应用方向来。 ​自媒体 现在很多搞技术的都开始进入自媒体领域&#xff0c;比如微信公众号、知乎、B站、抖音、小红书等。这些平台上只要你有流量&#xff0c;你就可以通过广告、播放量、带货等方式赚钱。当然了&#xff0c;自…

轻松又自由,在家就能做的4个副业兼职

由于我们社群里有很多学生还有宝妈群体&#xff0c;会来咨询有没有在家就能做的副业兼职。 之前我有引荐过&#xff0c;首选一定是自媒体。 当然还有很多其他方式&#xff0c;今天给大家分享4个在家就能做的项目。 1、作家/特约撰稿人 做特约撰稿人或作家&#xff0c;这个一台笔…