热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用javaMail发送邮件

电子邮件协议SMTP是推协议,负责用户代理向邮件服务器或邮件服务器与邮件服务器间发送邮件;POP3、IMAP是拉协议,负责用户代理从邮件服务器读取邮件。如何写一封邮件javaMai

电子邮件协议

SMTP是推协议,负责用户代理向邮件服务器或邮件服务器与邮件服务器间发送邮件;POP3、IMAP是拉协议,负责用户代理从邮件服务器读取邮件。


如何写一封邮件

javaMail用Message对象表示一封邮件。Message类是一个抽象类,我们通常使用它的子类MimeMessage表示一封邮件。

MimeMessage构造器接受一个Session对象,Session对象表示一个会话,该对象由Session.getInstance(property)方法生成,property参数是一个Properties对象,我们借用它设置邮件传输的相关信息。


文本邮件

package com.weixia.SMTP;
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.InternetAddress;
import java.io.FileOutputStream;
public class Message_text {
public static void main(String[] args) throws Exception {
String from = ""; // 发件人
String to = ""; // 收件人
String subject = "This ia a SMTP test mail"; // 主题
String body = "Hello,world!"; // 邮件正文

Properties property = new Properties();
Session session = Session.getInstance(property);
MimeMessage message = new MimeMessage(session);

message.setFrom(new InternetAddress(from));
// Message.RecipientType.TO :收件人;Message.RecipientType.CC :抄送人;Message.RecipientType.BCC :密送人
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
message.setSentDate(new Date());
message.setSubject(subject,"UTF-8");
message.setText(body,"UTF-8");
message.saveChanges();
message.writeTo(new FileOutputStream("F:\\mail.eml"));
}
}

InternetAddress类解析邮件地址,它的构造器接受一个邮箱格式的字符串,放回一个InternetAddress对象;它的parse方法作用相同,但返回InternetAddress[],可以用来群发。


HTML格式邮件

package com.weixia.SMTP;
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.InternetAddress;
import java.io.FileOutputStream;
public class MailWithHtml {
public static void main(String[] args) throws Exception {
String from = "";
String to = "";
String subject = "This ia a SMTP test mail";
String body = "

Hello,world!

";

Properties property = new Properties();
Session session = Session.getInstance(property);
MimeMessage message = new MimeMessage(session);

message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
message.setSentDate(new Date());
message.setSubject(subject,"UTF-8");
message.setContent(body,"text/html;charset=UTF-8");
message.saveChanges();
message.writeTo(new FileOutputStream("F:\\mailWithHtml.eml"));
}
}

HTML格式只需改变设置正文的方法,指明MIME类型。


含有图片、附件或其他媒体类型的邮件

这种复杂邮件,我们把图片、附件或其他媒体类型看作是一个BodyPart对象。因为Message对象setContent方法接受Multipart类型参数,所以必须把BodyPart封装为Multipart对象。

封装的方法如下图:

import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeBodyPart;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
public class MultiMail {
public static void main(String[] args) throws Exception {
String from = "";
String to = "";

Properties property = new Properties();
Session session = Session.getInstance(property);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
message.setSubject("这是我用java发送的一封邮件", "UTF-8");
message.setSentDate(new Date());

// create picture node
MimeBodyPart image = new MimeBodyPart();
FileDataSource file = new FileDataSource("F:\\邮件.jpg");
image.setDataHandler(new DataHandler(file));
// 后边引用该ID时,须使用"cid:idName"的形式,例如""
image.setContentID("image_id");

// create text node
MimeBodyPart text = new MimeBodyPart();
text.setContent("

This is a test picture

","text/html;charset=UTF-8");

MimeMultipart text_image = new MimeMultipart("related");
text_image.addBodyPart(image);
text_image.addBodyPart(text);
// 为了添加附件,将text_image封装为BodyPart对象
MimeBodyPart text_image_node = new MimeBodyPart();
text_image_node.setContent(text_image);

// 创建附件
MimeBodyPart attachment = new MimeBodyPart();
FileDataSource attachmentFile = new FileDataSource("F:\\mail.eml");
DataHandler handler = new DataHandler(attachmentFile);
attachment.setDataHandler(handler);
attachment.setFileName(attachmentFile.getName());

MimeMultipart body = new MimeMultipart("mixed");
body.addBodyPart(text_image_node);
body.addBodyPart(attachment);

message.setContent(body);
message.saveChanges();

return message;
}
}

发送邮件

在发送邮件时,我们要设置传输邮件的相关信息,这里我们使用Properties对象来设置Session会话对象。

通过Session对象获取Transport对象,用connect方法连接邮件服务器,然后用sendMessage方法发送邮件。


SSL连接

现在邮件服务提供商通常使用SSL加密连接,设置SSL如下:

String smtpPort = "465";
Properties property = new Properties();
property.setProperty("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
property.setProperty("mail.smtp.socketFactory.fallback","false");
property.setProperty("mail.smtp.socketFactory.port",smtpPort);

完整代码如下:

package com.weixia.SMTP;
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeBodyPart;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
public class SentMultiMail {
public static void main(String[] args) throws Exception {
String emailAccount = "";
String emailPassword = "";

String recipient = "";

String smtpHost = "smtp.sina.com";
String smtpPort = "465";

Properties property = new Properties();

property.setProperty("mail.transport.protocol","smtp");
property.setProperty("mail.smtp.host",smtpHost);
property.setProperty("mail.smtp,port",smtpPort);
property.setProperty("mail.smtp.auth","true");

property.setProperty("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
property.setProperty("mail.smtp.socketFactory.fallback","false");
property.setProperty("mail.smtp.socketFactory.port",smtpPort);

Session session = Session.getInstance(property);
session.setDebug(true);
MimeMessage message = createMail(session, emailAccount, recipient);

Transport transport = session.getTransport();
transport.connect(emailAccount, emailPassword);
transport.sendMessage(message,message.getAllRecipients());
transport.close();
}

public static MimeMessage createMail(Session session, String from, String to) throws Exception {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
message.setSubject("这是我用java发送的一封邮件", "UTF-8");
message.setSentDate(new Date());

// create picture node
MimeBodyPart image = new MimeBodyPart();
FileDataSource file = new FileDataSource("F:\\邮件.jpg");
image.setDataHandler(new DataHandler(file));
// 后边引用该ID时,须使用"cid:idName"的形式,例如""
image.setContentID("image_id");

// create text node
MimeBodyPart text = new MimeBodyPart();
text.setContent("

This is a test picture

","text/html;charset=UTF-8");

MimeMultipart text_image = new MimeMultipart("related");
text_image.addBodyPart(image);
text_image.addBodyPart(text);
// 为了添加附件,将text_image封装为BodyPart对象
MimeBodyPart text_image_node = new MimeBodyPart();
text_image_node.setContent(text_image);

// 创建附件
MimeBodyPart attachment = new MimeBodyPart();
FileDataSource attachmentFile = new FileDataSource("F:\\mail.eml");
DataHandler handler = new DataHandler(attachmentFile);
attachment.setDataHandler(handler);
attachment.setFileName(attachmentFile.getName());

MimeMultipart body = new MimeMultipart("mixed");
body.addBodyPart(text_image_node);
body.addBodyPart(attachment);

message.setContent(body);
message.saveChanges();

return message;
}
}

参考链接

JavaMail入门第二篇 创建邮件

基于JavaMail的Java邮件发送:简单邮件发送



推荐阅读
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 本文探讨了如何利用Java代码获取当前本地操作系统中正在运行的进程列表及其详细信息。通过引入必要的包和类,开发者可以轻松地实现这一功能,为系统监控和管理提供有力支持。示例代码展示了具体实现方法,适用于需要了解系统进程状态的开发人员。 ... [详细]
  • 本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 贪心策略在算法设计中的应用与优化
    贪心算法在算法设计中具有广泛的应用,特别是在解决优化问题时表现出色。本文通过分析经典问题“买卖股票的最佳时机II”,探讨了贪心策略的基本原理及其在实际问题中的应用。通过实例分析,展示了贪心算法如何通过局部最优选择逐步达到全局最优解,并讨论了其在时间和空间复杂度上的优势。此外,还提出了一些优化方法,以提高算法的效率和适用性。 ... [详细]
author-avatar
changless
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有