1. 使用原生javaMail API发送邮件
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
public class test {
public static void main(String[] args) {
Properties props = new Properties();
// 开启debug调试
props.setProperty("mail.debug", "true");
// 发送服务器需要身份验证
props.setProperty("mail.smtp.auth", "true");
// 设置邮件服务器主机名
props.setProperty("mail.host", "mail.smtp_server.com");
// 发送邮件协议名称
props.setProperty("mail.transport.protocol", "smtp");
// 设置环境信息
Session session = Session.getInstance(props);
// 创建邮件对象
Message msg = new MimeMessage(session);
try {
msg.setSubject("这是邮件标题");
msg.setText("这是邮箱内容!");
msg.setFrom(new InternetAddress("email_from@163.com","***系统(发件昵称)"));
Transport transport = session.getTransport();
// 连接邮件服务器
transport.connect("email_from@163.com", "email_password");
// 发送邮件
transport.sendMessage(msg, new Address[] {new InternetAddress("email_to@163.com")});
// 关闭连接
transport.close();
} catch (MessagingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
第二种方式
public static void main(String[] args) throws Exception {
// 1. 创建一封邮件
Properties props = new Properties();
// 开启debug调试
props.setProperty("mail.debug", "true");
// 发送服务器需要身份验证
props.setProperty("mail.smtp.auth", "true");
// 设置邮件服务器主机名
props.setProperty("mail.host", "mail.你的SMTP服务器地址.com");
// 发送邮件协议名称
props.setProperty("mail.transport.protocol", "smtp");
//这个很重要***************************************** START
//第二个参数为验证信息返回器
//即Authenticator对象会返回验证信息(用户名,密码等信息)
//这里的Authenticator是一个匿名内部类
Session session = Session.getInstance(props,
new Authenticator(){
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//返回发件人账号与密码信息
return new PasswordAuthentication("登录邮箱@163.com","登录密码");
}
}
);
MimeMessage message = new MimeMessage(session); // 创建邮件对象
//这个很重要***************************************** END
// 2. From: 发件人
// 其中 InternetAddress 的三个参数分别为: 邮箱, 显示的昵称(只用于显示, 没有特别的要求), 昵称的字符集编码
// 真正要发送时, 邮箱必须是真实有效的邮箱。
message.setFrom(new InternetAddress("发件人Email@163.com", "发件人昵称", "UTF-8"));
// 3. To: 收件人
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("收件人@163.com", "昵称", "UTF-8"));
// To: 增加收件人(可选)
message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress("增加收件人@qq.com", "昵称", "UTF-8"));
// Cc: 抄送(可选)
message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress("添加抄送人@163.com", "昵称", "UTF-8"));
// Bcc: 密送(可选)
message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress("秘密抄送人@163.com", "昵称", "UTF-8"));
// 4. Subject: 邮件主题
message.setSubject("TEST邮件主题", "UTF-8");
// 5. Content: 邮件正文(可以使用html标签)
message.setContent("TEST这是邮件正文。。。", "text/html;charset=UTF-8");
// 6. 设置显示的发件时间
message.setSentDate(new Date());
// 7. 保存前面的设置
message.saveChanges();
//发送*********************************************
Transport transport = session.getTransport();
transport.send(message);
// 8. 将该邮件保存到本地
OutputStream out = new FileOutputStream("/Users/**/Documents/dev/MyEmail.eml");
message.writeTo(out);
out.flush();
out.close();
}
2. 携带附件
MimeMultipart msgMultipart = new MimeMultipart("mixed");//混合的组合关系
MimeBodyPart attch1 = new MimeBodyPart();
File fileI = new File("/Users/**/Documents/dev/fileTest/a.txt");
DataSource ds1 = new FileDataSource(fileI);
DataHandler dh1 = new DataHandler(ds1);
attch1.setDataHandler(dh1);
//设置第一个附件的文件名
attch1.setFileName("file.txt");
msgMultipart.addBodyPart(attch1);
message.setContent(msgMultipart);
3. 用文件流(InputStream)作为邮件附件附件
String str = "String与InputStream相互转换";
InputStream in = new ByteArrayInputStream(str.getBytes());
DataSource dataSource1=new ByteArrayDataSource(in, "application/text");
DataHandler dh1 = new DataHandler(dataSource1);
attch1.setDataHandler(dh1);
//设置附件的文件名
attch1.setFileName("file.txt");
msgMultipart.addBodyPart(attch1);
message.setContent(msgMultipart);
4. 添加多个收件人(message.setRecipients())
MimeMessage的setRecipients方法设置邮件的收件人,其中
Message.RecipientType.TO常量表示收件人类型是邮件接收者,
Message.RecipientType.CC常量表示收件人类型是抄送者,
Message.RecipientType.BCC常量表示收件人的类型是密送着。
InternetAddress[] toall;
InternetAddress to1 = new InternetAddress("***@163.com","张三","UTF-8");
InternetAddress to2 = new InternetAddress("***@qq.com","李四","UTF-8");
toall = new InternetAddress[]{to1, to2};
// 3. To: 收件人
message.setRecipients(MimeMessage.RecipientType.TO, toall);
// To: 增加收件人(可选)
// Cc: 抄送(可选)
message.setRecipients(MimeMessage.RecipientType.CC, toall);
// Bcc: 密送(可选)
message.setRecipients(MimeMessage.RecipientType.BCC, toall);
5. 保存本地
OutputStream out = new FileOutputStream("/Users/**/Documents/dev/MyEmail.eml");
message.writeTo(out);
out.flush();
out.close();
6. 基于spring框架发送邮件
maven依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
Bean配置文件:这里把一个第三方库变成一个可以spring依赖注入的Bean!
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="bb.aa.com"></property>
<property name="username" value="aa@qq.com"></property>
<property name="password" value="123654"></property>
</bean>
添加测试类
@ContextConfiguration(locations = {"classpath:testConfig.xml"})先加载配置文件,创建上下文,然后上下文会帮创建我们在其中配置的bean!
@Autowired
private JavaMailSender mailSender;//注入Bean,然后就可以非常方便的使用了!
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:testConfig.xml"})
public class SpringTest {
@Autowired
private TestService testService;
@Autowired
private JavaMailSender mailSender;
@Test
public void test(){
SimpleMailMessage mail = new SimpleMailMessage();
mail.setTo("aa@qq");//收件人邮箱地址
mail.setFrom("bb@qq");//收件人
mail.setSubject("使用spring Email");//主题
mail.setText("这是spring Email的正文!");//正文
mailSender.send(mail);
}
}