用java发送带附件的邮件

这篇博客介绍了如何使用Java发送带有附件的邮件,重点在于使用Multipart类和MimeUtility.encodeWord方法来处理邮件内容和防止文件名乱码。通过示例代码展示了发送单个收件人和群发邮件的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇博文的补充,邮件中添加了附件

步骤和上一篇中相同,只是采用Multipart类的对象来添加邮件的内容和附件,并且设置文件名时要注意:MimeUtility.encodeWord可以避免文件名乱码,只改动了部分代码,但大致流程相同,具体代码如下,已亲测。

package com.controller;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.AuthenticationFailedException;
import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

/** 
 * 发送邮件的主类  
 */
public class SendMail {
    //发送邮件的props文件
private final transient Properties props=System.getProperties();
//邮件服务器登录验证
private transient MailAuthenticator authenticator;
//邮箱session
private transient Session session;
/**
* 初始化发送邮件
* @param smtpHostName邮件服务器地址
* @param username发送邮件的用户名
* @param password密码
*/
public SendMail(final String smtpHostName,final String username,final String password){
init(username,password,smtpHostName);
}
/**
* 初始化发送邮件
* @param username 发送邮件的用户名
* @param password 密码
*/
public SendMail(final String username,final String password){
//通过邮箱地址解析出smtp服务器,对大多数邮箱都管用
final String smtpHostName="smtp."+username.split("@")[1];
init(username,password,smtpHostName);
}
/**

* 初始化
* @param username 发送邮件的用户名
* @param password 密码
* @param smtpHostName SMTP主机地址
*/
private void init(String username, String password, String smtpHostName) {
//初始化props
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", smtpHostName);
//验证
authenticator=new MailAuthenticator(username,password);
//创建session
session=Session.getInstance(props,authenticator);
}
/**
* 发送邮件
* @param recipient收件人邮箱地址
* @param subject邮件主题
* @param content邮件内容
* @param attachment邮件附件
* @throws MessagingException 
* @throws AddressException 
*/
public void send(String recipient,String subject,String content,File attachment) throws AddressException, MessagingException{
try {
//创建mime类型的邮件
final MimeMessage message=new MimeMessage(session);
//设置发信人
message.setFrom(new InternetAddress(authenticator.getUsername()));
//设置收件人
message.setRecipient(RecipientType.TO, new InternetAddress(recipient));
//设置主题
message.setSubject(subject);
//添加邮件的文本内容和附件
Multipart multipart=new MimeMultipart();

//添加邮件正文
BodyPart contentPart=new MimeBodyPart();
contentPart.setContent(content,"text/html;charset=utf-8");
multipart.addBodyPart(contentPart);

//添加附件
if(attachment!=null){
BodyPart attachmentBodyPart=new MimeBodyPart();
DataSource ds=new FileDataSource(attachment);
attachmentBodyPart.setDataHandler(new DataHandler(ds));
//MimeUtility.encodeWord可以避免文件名乱码
attachmentBodyPart.setFileName(MimeUtility.encodeWord(attachment.getName()));
multipart.addBodyPart(attachmentBodyPart);
}
//将multipart对象放到message中
message.setContent(multipart);
//保存邮件
message.saveChanges();
//发送
Transport.send(message,message.getRecipients(RecipientType.TO));

//System.out.println("邮件发送成功!");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
/**
* 群发邮件
* @param recipients 收件人们
* @param subject 主题
* @param content 内容
* @throws AddressException
* @throws MessagingException
*/
public void send(List<String> recipients,String subject,String content,File attachment) throws AddressException, MessagingException{
try {
//创建mime类型的邮件
final MimeMessage message=new MimeMessage(session);
//设置发件人
message.setFrom(new InternetAddress(authenticator.getUsername()));
//设置收件人们
InternetAddress[] addresses=new InternetAddress[recipients.size()];
for(int i=0;i<recipients.size();i++){
addresses[i]=new InternetAddress(recipients.get(i));
}
message.setRecipients(RecipientType.TO,addresses);
//设置主题
message.setSubject(subject);

//添加邮件的文本内容和附件
Multipart multipart=new MimeMultipart();

//添加邮件正文
BodyPart contentPart=new MimeBodyPart();
contentPart.setContent(content,"text/html;charset=utf-8");
multipart.addBodyPart(contentPart);

//添加附件
if(attachment!=null){
BodyPart attachmentBodyPart=new MimeBodyPart();
DataSource ds=new FileDataSource(attachment);
attachmentBodyPart.setDataHandler(new DataHandler(ds));
//MimeUtility.encodeWord可以避免文件名乱码
attachmentBodyPart.setFileName(MimeUtility.encodeWord(attachment.getName()));
multipart.addBodyPart(attachmentBodyPart);
}
//将multipart对象放到message中
message.setContent(multipart);
//保存邮件
message.saveChanges();

//发送
Transport.send(message);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws AddressException, MessagingException,AuthenticationFailedException{
//发件人的地址和密码
SendMail sm=new SendMail("发件人邮箱","发件人密码");
//附件
File file=new File("附件位置");

//多个收件人地址、邮件主题、邮件内容
List<String> list=new ArrayList<String>();
list.add("收件人地址 ");
list.add(" ");
list.add(" ");

sm.send(list, "来自电脑的邮件", "嘿嘿,猜猜我是谁?",file);
}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值