以qq邮箱为例,如果要用qq邮箱向qq邮箱发送邮件,首先要开通SMTP服务并获取授权码,此处不做详细解释。授权码是即时性的,在使用期间要一直开着授权码的网页页面。
第一步是在pom文件中加入maven依赖
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
下面是固定代码用法,邮箱地址、授权码和邮件内容可以按个人修改
import java.security.Security;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class MailClient {
public static void main(String[] args) {
try {
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
//配置邮箱信息
Properties props = System.getProperties();
//邮件服务器
props.setProperty("mail.smtp.host", "smtp.qq.com");
props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.smtp.socketFactory.fallback", "false");
//邮件服务器端口
props.setProperty("mail.smtp.port", "465");
props.setProperty("mail.smtp.socketFactory.port", "465");
//鉴权信息
props.setProperty("mail.smtp.auth", "true");
//建立邮件会话
Session session = Session.getDefaultInstance(props, new Authenticator() {
//身份认证
protected PasswordAuthentication getPasswordAuthentication() {
//1.账户 授权码
return new PasswordAuthentication("xxxxxxx@qq.com", "xxxx");
}
});
//建立邮件对象
MimeMessage message = new MimeMessage(session);
//设置邮件的发件人
message.setFrom(new InternetAddress("xxxxxxx@qq.com"));
//2.设置邮件的收件人
message.setRecipients(Message.RecipientType.TO, "xxxxxxx@qq.com");
//设置邮件的主题
message.setSubject("通过javamail发出!!!");
//设置内容
message.setContent("文本邮件测试", "text/html;charset=UTF-8");
//保存对邮件的所有修改
message.saveChanges();
//发送邮件
Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
这段代码定义了一个名为MailClient的类,其中的main方法用于发送邮件。在main方法中,通过配置Properties对象来设置SMTP服务器和端口、身份认证等信息。
然后,创建一个Session对象,该对象用于建立与SMTP服务器的连接,并通过Authenticator类实现身份认证。在示例代码中,Authenticator的getPasswordAuthentication方法被重写,需填入发件人的邮箱地址和授权码。
接下来,创建一个MimeMessage对象,用于构建邮件内容。设置发件人、收件人、主题和邮件正文等信息。
最后,调用Transport的send方法发送邮件。
下面对个别代码进行着重解释:
//邮件服务器
props.setProperty("mail.smtp.host", "smtp.qq.com");
props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.smtp.socketFactory.fallback", "false");
//邮件服务器端口
props.setProperty("mail.smtp.port", "465");
props.setProperty("mail.smtp.socketFactory.port", "465");
//鉴权信息
props.setProperty("mail.smtp.auth", "true");
这几行代码用于配置JavaMail的SMTP传输相关属性信息:
- 邮件服务器:设置SMTP服务器地址为"smtp.qq.com"。
- SSL加密:设置SMTP传输使用的加密方式为SSL,即通过SSLSocketFactory实现SSL加密传输。
- 端口号:设置SMTP服务器使用的端口为465。
- 鉴权信息:设置SMTP服务器需要进行身份认证。
其中,"mail.smtp.host"属性用于设置SMTP服务器地址,"mail.smtp.port"属性用于设置SMTP服务器使用的端口,"mail.smtp.auth"属性用于告诉JavaMail要进行身份认证,而"mail.smtp.socketFactory.class"和"mail.smtp.socketFactory.port"属性用于设置使用SSL加密连接时的相关信息。
Session session = Session.getDefaultInstance(props, new Authenticator() {
//身份认证
protected PasswordAuthentication getPasswordAuthentication() {
//1.账户 授权码
return new PasswordAuthentication("xxxxxxx@qq.com", "xxxx");
}
});
这段代码创建了一个JavaMail的Session对象,并通过身份验证器(Authenticator)提供了账户和授权码进行SMTP身份认证。
具体解释如下:
- 通过
Session.getDefaultInstance(props, new Authenticator() {...})
创建了一个默认的JavaMail Session实例。这里的props是之前设置的属性集合,用于指定SMTP服务器的配置信息。 - 在Authenticator的匿名内部类中,重写了
getPasswordAuthentication
方法,用于提供身份验证所需的用户名和密码。在这个例子中,"xxxxxxx@qq.com" 是邮箱账户名,"xxxx" 是授权码(或密码)。 - 通过返回一个
PasswordAuthentication
对象,将账户名和密码传递给Authenticator,用于进行SMTP身份认证。
这样,创建的Session对象就拥有了进行SMTP身份验证的能力,可以用于后续的邮件发送操作。
Session
是 JavaMail API 中的一个关键类,它代表了一个邮件会话。在邮件发送过程中,需要创建一个
Session
对象来提供用于发送邮件的各种配置信息,例如 SMTP 服务器的主机名、端口号、身份认证等。
Session
类可以使用Session.getDefaultInstance(Properties properties, Authenticator authenticator)
方法来创建。其中,properties
参数是一个属性集合,用于指定邮件配置的各种参数,而authenticator
参数是一个可选的身份验证器,用于进行 SMTP 身份认证(如果需要)。通过
Session
对象,可以创建Message
对象并设置邮件的相关内容,如收件人、发件人、主题、正文等。然后,可以使用Transport.send(Message message)
方法来发送邮件。需要注意的是,在使用
Session
创建邮件会话时,需要确保为邮件服务提供商提供正确的配置信息,并遵守相关的邮件协议和规范。