Java实现邮件发送
程序员文章站
2022-05-18 21:26:29
...
Java邮件发送
在讲邮件发送之前,我们要先了解两个概念
- 邮件服务器
我们想要在Internet上提供电子邮件功能,必须有专门的邮件服务器,但是现在有很多提供邮件服务的厂商,例如:QQ、sina、163、souhu;
邮件服务器类似于我们现实生活中的邮局,负责接收用户投递过来的邮件,并将邮件投递到接收者的邮箱中。
- 电子邮箱
想要使用电子邮箱需要在邮件服务器上申请,通俗地说、用户可以在邮件服务器上申请一个账户,当用户申请了账户之后,服务器就会为这个账户分配一定的空间,
用户可以使用这个空间,进行发送邮件,和保存别人发送给自己的邮件。
然后我们用Java代码来实现邮件发送:
我们需要准备两个jar包:
这两个jar包可以在maven仓库里搜索:maven仓库官方网址
1.简单文本邮件发送
//需要导入的包
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;
Properties properties = new Properties();
properties.setProperty("mail.host"," smtp.qq.com");
properties.setProperty("mail.transport.protocol","smtp");
properties.setProperty("mail.smtp.auth","true");
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable","true");
properties.put("mail.smtp.ssl.socketFactory",sf);
Session session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//发件人邮件用户名,授权码
return new PasswordAuthentication("发送人邮件账号", "该账号的授权码");
}
});
//开启session的debug模式,这样就可以看到程序发送email的运行状态
session.setDebug(true);
//通过session得到Transport对象
Transport ts = session.getTransport();
//使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com","发送人的账号","该账号的授权码");
//创建邮件对象
Message message = new MimeMessage(session);
//指明邮件的发送人
message.setFrom(new InternetAddress("发送人的账号"));
//指明邮件的接收者
message.setRecipient(Message.RecipientType.TO,new InternetAddress("邮件接收者的账号"));
//邮件的标题
message.setSubject("Java邮件发送");
// 邮件的文本内容
message.setContent("测试内容","text/html;charset=UTF-8");
//发送邮件
ts.sendMessage(message,message.getAllRecipients());
//关闭连接
ts.close();
2、发送带附件的邮件
//需要导入的包
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;
//这是被我封装成了方法,增加复用性。
public static boolean sendMail(String receive, String subject, String msg, String filename)
throws GeneralSecurityException {
if (receive==null || receive=="") {
return false;
}
// 发件人电子邮箱
final String from = "发送人的账号";
// 发件人电子邮箱密码
final String pass = "该账号的授权码";
// 指定发送邮件的主机为 smtp.qq.com
String host = "smtp.qq.com"; // 邮件服务器
// 获取系统属性
Properties properties = System.getProperties();
// 设置邮件服务器
properties.setProperty("mail.smtp.host", host);
properties.put("mail.smtp.auth", "true");
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.ssl.socketFactory", sf);
// 获取默认session对象
Session session = Session.getDefaultInstance(properties, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() { // qq邮箱服务器账户、第三方登录授权码
return new PasswordAuthentication(from, pass); // 发件人邮件用户名、密码
}
});
session.setDebug(true);
try {
// 创建默认的 MimeMessage 对象
MimeMessage message = new MimeMessage(session);
// Set From: 头部头字段
message.setFrom(new InternetAddress(from));
// Set To: 头部头字段
message.addRecipient(Message.RecipientType.TO, new InternetAddress(receive));
// Set Subject: 主题文字
message.setSubject(subject);
// 创建消息部分
BodyPart messageBodyPart = new MimeBodyPart();
// 消息
messageBodyPart.setText(msg);
// 创建多重消息
Multipart multipart = new MimeMultipart();
// 设置文本消息部分
multipart.addBodyPart(messageBodyPart);
// 附件部分
messageBodyPart = new MimeBodyPart();
// 设置要发送附件的文件路径
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
// messageBodyPart.setFileName(filename);
// 处理附件名称中文(附带文件路径)乱码问题
messageBodyPart.setFileName(MimeUtility.encodeText(filename));
multipart.addBodyPart(messageBodyPart);
// 发送完整消息
message.setContent(multipart);
// 发送消息
Transport.send(message);
// System.out.println("Sent message successfully....");
return true;
} catch (MessagingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return false;
}
这里需要说的是电子邮件的授权码,这是我们账号在第三方客户端上的一个通行证,怎么获得呢?很简单,比如说QQ
进入网页版qq邮箱,点击如下地址:
希望本文章对您有所帮助!
上一篇: 部署FTP文件传输服务器
下一篇: 如何用python“优雅的”调用有道翻译