java sendmail 附件_SendMail带附件版本的Java实现

之前自己这边是有一个sendmail的组件,但是只能实现text的发送,今天逛博客,无意间发现了一个能够实现发送附件的senfmail功能的

之前自己这边是有一个sendmail的组件,但是只能实现text的发送,今天逛博客,,无意间发现了一个能够实现发送附件的senfmail功能的java实现,于是就进行了测试和实现,经过测试能够成功实现附件功能,希望通过发博的方式进行收藏,也把中间出现的问题和大家进行分享:

1.首先在Mail工程下新建lib文件夹,导入javax.mail.jar包;

2.在Mail项目下新建conf文件夹,新建file:mail-info.properties,进行配置;

mail.host=smtp.linuxidc.com

mail.port=25

mail.username=[email protected]

mail.password=******

mail.from=[email protected]

mail.to=[email protected]

3.新建一个util的package,里面放读取配置文件的AppContext.java和保存临时配置文件的SystemContains.java;

package util;

import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;

/**

* 读取配置文件

* 2014年12月31日

*/

public enum AppContext {

INSTANCE;

public Properties configuration = new Properties();

public void init() {

InputStream is = this.getClass().getResourceAsStream("/mail-info.properties");

if (is != null) {

try {

this.configuration.clear();

this.configuration.load(is);

} catch (IOException e) {

} finally {

try {

is.close();

} catch (Throwable t) {}

}

}

}

public String getConfigValue(String key) {

return this.configuration.getProperty(key);

}

}

package util;

/**

* 临时保存配置文件信息

*/

public class SystemConstants {

//info

public static final String MAILHOST = AppContext.INSTANCE.getConfigValue("mail.host");

public static final String MAILPORT = AppContext.INSTANCE.getConfigValue("mail.port");

public static final String MAILUSERNAME = AppContext.INSTANCE.getConfigValue("mail.username");

public static final String MAILPASSWORD = AppContext.INSTANCE.getConfigValue("mail.password");

public static final String MAILFROM = AppContext.INSTANCE.getConfigValue("mail.from");

public static final String MAILTO = AppContext.INSTANCE.getConfigValue("mail.to");

}

4.在mail包下新建发送文件类JavaMail.java和压缩解压缩类ZIP.java;

package mail;

import java.io.File;

import javax.activation.DataHandler;

import javax.activation.DataSource;

import javax.activation.FileDataSource;

import javax.mail.Address;

import javax.mail.BodyPart;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.Multipart;

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 util.AppContext;

import util.SystemConstants;

/**

* send email

* 2014年12月31日

*/

public class JavaMail {

/**

* Message对象将存储我们实际发送的电子邮件信息,

* Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session。

*/

private MimeMessage message;

/**

* Session类代表JavaMail中的一个邮件会话。

* 每一个基于JavaMail的应用程序至少有一个Session(可以有任意多的Session)。

*

* JavaMail需要Properties来创建一个session对象。

* 寻找"mail.smtp.host"属性值就是发送邮件的主机

* 寻找"mail.smtp.auth"身份验证,目前免费邮件服务器都需要这一项

*/

private Session session;

/***

* 邮件是既可以被发送也可以被受到。JavaMail使用了两个不同的类来完成这两个功能:Transport 和 Store。

* Transport 是用来发送信息的,而Store用来收信。对于这的教程我们只需要用到Transport对象。

*/

private Transport transport;

/*

* 初始化方法

*/

public JavaMail(boolean debug) {

session = Session.getInstance(AppContext.INSTANCE.configuration);

session.setDebug(debug);//开启后有调试信息

message = new MimeMessage(session);

}

/**

* 发送邮件

* @param subject 邮件主题

* @param sendHtml 邮件内容

*/

public void sendEmail(String subject, String sendHtml) {

try {

// 发件人

//InternetAddress from = new InternetAddress(sender_username);

// 下面这个是设置发送人的Nick name

InternetAddress from = new InternetAddress(MimeUtility.encodeWord("zhanglincc")+"");

message.setFrom(from);

// 收件人

InternetAddress to = new InternetAddress(SystemConstants.MAILTO);

message.setRecipient(Message.RecipientType.TO, to);//还可以有CC、BCC

// 邮件主题

message.setSubject(subject);

String content = sendHtml.toString();

// 邮件内容,也可以使纯文本"text/plain"

message.setContent(content,"text/html;charset=UTF-8");

// 保存邮件

message.saveChanges();

// smtp验证,就是你用来发邮件的邮箱用户名密码

transport = session.getTransport("smtp");

transport.connect(SystemConstants.MAILHOST, SystemConstants.MAILUSERNAME, SystemConstants.MAILPASSWORD);

// 发送

transport.sendMessage(message, message.getAllRecipients());

System.out.println("send success!");

} catch (Exception e) {

e.printStackTrace();

}finally {

if(transport!=null){

try {

transport.close();

} catch (MessagingException e) {

e.printStackTrace();

}

}

}

}

/**

* 发送邮件

* @param subject 邮件主题

* @param sendHtml 邮件内容

* @param attachment 附件

*/

public void sendEmail(String subject, String sendHtml, String filePath) {

File file = new File(filePath);

if(file.exists()){

try {

// 发件人

InternetAddress from = new InternetAddress(SystemConstants.MAILUSERNAME);

message.setFrom(from);

String [] strings = SystemConstants.MAILTO.split(";");

Address [] receiverAddress = new Address[strings.length];

for(int i = 0;i

receiverAddress[i]=new InternetAddress(strings[i]);

}

message.setRecipients(Message.RecipientType.TO, receiverAddress);

// 邮件主题

message.setSubject(subject);

// 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件

Multipart multipart = new MimeMultipart();

// 添加邮件正文

BodyPart contentPart = new MimeBodyPart();

contentPart.setContent(sendHtml,"text/html;charset=UTF-8");

multipart.addBodyPart(contentPart);

//如果所给的路径是目录就压缩

if(file.isDirectory()){

File fileTemp = new File(file.getParentFile().getAbsoluteFile()+"\"+file.getName()+".zip");

System.out.println(fileTemp.getAbsolutePath());

ZIP.zipFiles(file.listFiles(),fileTemp);

file = fileTemp;

System.out.println(file.isFile());

}

// 添加附件的内容

if (file.isFile()) {

BodyPart attachmentBodyPart = new MimeBodyPart();

DataSource source = new FileDataSource(file);

attachmentBodyPart.setDataHandler(new DataHandler(source));

// 网上流传的解决文件名乱码的方法,其实用MimeUtility.encodeWord就可以很方便的搞定

// 这里很重要,通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码

//sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();

//messageBodyPart.setFileName("=?GBK?B?"+ enc.encode(attachment.getName().getBytes()) +"?=");

//MimeUtility.encodeWord可以避免文件名乱码

attachmentBodyPart.setFileName(MimeUtility.encodeWord(file.getName()));

multipart.addBodyPart(attachmentBodyPart);

}

// 将multipart对象放到message中

message.setContent(multipart);

// 保存邮件

message.saveChanges();

transport = session.getTransport("smtp");

// smtp验证,就是你用来发邮件的邮箱用户名密码

transport.connect(SystemConstants.MAILHOST, SystemConstants.MAILUSERNAME, SystemConstants.MAILPASSWORD);

// 发送

transport.sendMessage(message, message.getAllRecipients());

System.out.println("send success!");

} catch (Exception e) {

e.printStackTrace();

} finally {

if (transport != null) {

try {

transport.close();

} catch (MessagingException e) {

e.printStackTrace();

}

}

}

}else{

System.out.println("附件地址有误");

System.exit(-1);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以通过JavaMail API实现邮件的收发。下面是一个简单的JavaMail邮件收发的例子: 1. 导入JavaMail API的jar包。 2. 编写邮件收取代码: ```java import javax.mail.*; import javax.mail.internet.*; import java.util.*; public class ReceiveMail { public static void main(String[] args) { // 邮箱的帐号和密码(替换为自己的邮箱和密码) String user = "xxxxx@xxx.com"; String password = "xxxxx"; // 邮箱的服务地址 Properties props = new Properties(); props.setProperty("mail.store.protocol", "imap"); props.setProperty("mail.imap.host", "imap.xxx.com"); props.setProperty("mail.imap.port", "993"); try { // 连接邮箱 Session session = Session.getDefaultInstance(props); Store store = session.getStore(); store.connect(user, password); // 获取收件箱 Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); // 获取邮件数量 int messageCount = folder.getMessageCount(); System.out.println("共有邮件:" + messageCount + "封"); // 获取前20封邮件 Message[] messages = folder.getMessages(1, 20); // 遍历邮件并打印 for (Message message : messages) { System.out.println("主题:" + message.getSubject()); System.out.println("发件人:" + message.getFrom()[0]); System.out.println("收件人:" + message.getAllRecipients()[0]); System.out.println("时间:" + message.getSentDate()); System.out.println("内容:" + message.getContent()); System.out.println("-------------------------------------------------------"); } // 关闭收件箱和连接 folder.close(false); store.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 3. 编写邮件发送代码: ```java import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class SendMail { public static void main(String[] args) { // 发件人邮箱地址和密码(替换为自己的邮箱和密码) String from = "xxxxx@xxx.com"; String password = "xxxxx"; // 收件人邮箱地址(替换为自己的邮箱) String to = "xxxxx@xxx.com"; // 邮件服务器地址 String host = "smtp.xxx.com"; // 创建会话 Properties props = new Properties(); props.put("mail.smtp.host", host); props.put("mail.smtp.auth", "true"); Session session = Session.getDefaultInstance(props); try { // 创建邮件 MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); message.setSubject("JavaMail邮件发送测试"); message.setText("这是一封JavaMail自动发送的测试邮件。"); // 发送邮件 Transport transport = session.getTransport("smtp"); transport.connect(host, from, password); transport.sendMessage(message, message.getAllRecipients()); transport.close(); System.out.println("邮件发送成功!"); } catch (MessagingException e) { e.printStackTrace(); } } } ``` 以上就是一个简单的JavaMail邮件收发的例子,可以进行参考和学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值