1.邮件服务器
通过程序对邮件进行操作,首先需要开通邮件的pop3/smtp服务,本文主要使用的是smtp方式 开通方式通常的进入邮件设置功能 ⇒ POP3/IMAP/SMTP服务 ⇒ 开启即可,qq邮箱和网易邮箱开启后会有另外一个登录密码,记得保存(发短信一条要一毛钱啊!!),189邮箱使用的则是账号密码,其余邮箱自行探索
2.java中发送邮件
2.1引包
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
2.2代码
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.sun.mail.util.MailSSLSocketFactory;
public class SendMailUtils {
private Log log = LogFactory.getLog(SendMailUtils.class);
/**
* 使用的邮件服务器 smtp.qq.com
*/
private String host;
/**
* 账号
*/
private String username;
/**
* 密码
*/
private String password;
public void sendMail(String toMail, String,title, String contant) throws Exception {
log.info("开始发送邮件给:"+toMail);
Properties prop = new Properties();
prop.setProperty("mail.smtp.host", host);
//发件端口一般采用25/465/587 可以根据实际进行调整
prop.setProperty("mail.smtp.port", "465");
prop.setProperty("mail.smtp.socketFactory.port","465");
prop.setProperty("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");
// 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", true);
prop.put("mail.smtp.ssl.socketFactory", sf);
//1、创建定义整个应用程序所需的环境信息的 Session 对象
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
public PasswordAuthentication getPasswordAuthentication() {
//发件人邮件用户名、授权码
return new PasswordAuthentication(username, password);
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2、通过session得到transport对象
Transport ts = session.getTransport();
//3、使用邮箱的用户名和授权码连上邮件服务器
ts.connect(host, username, password);
//4、创建邮件
MimeMessage message = new MimeMessage(session);
//设置发件人
message.setFrom(new InternetAddress(username));
//此处可以填写多个邮件地址 本文中不需要所以就只对应1个 如果需要抄送可以将类型改为RecipientType.CC
InternetAddress[] sendTo = new InternetAddress[1];
sendTo[0] = new InternetAddress(toMail, "", "UTF-8");
message.setRecipients(Message.RecipientType.TO, sendTo);
message.setSubject(title);
//文本
MimeBodyPart text = new MimeBodyPart();
text.setContent(contant,"text/html;charset=utf-8");
//拼装邮件正文内容
MimeMultipart multipart1 = new MimeMultipart();
multipart1.addBodyPart(text);
//1.文本和图片内嵌成功!
multipart1.setSubType("related");
//将拼装好的正文内容设置为主体
MimeBodyPart contentText = new MimeBodyPart();
contentText.setContent(multipart1);
message.setContent(multipart1);
//保存修改
message.saveChanges();
log.info("开始发送");
//发送邮件
ts.sendMessage(message, message.getAllRecipients());
ts.close();
log.info("发送成功!!!");
}
}
由于本文不需要设置附件图片(懒)所以就不贴上去了
2.3调试
本人在调试过程中出现较多的无法连接情况,具体原因分为3种: 1)服务器与邮件服务器直接网络不通 2)连接的邮件服务器端口不正确 3)pops参数多了或者少了 针对与第三种情况,会出现javax.mail.MessagingException: Could not connect to SMTP host… 此时建议优先调整pops参数
Properties prop = new Properties();
prop.setProperty("mail.smtp.host", host);
//发件端口一般采用25/465/587 可以根据实际进行调整
prop.setProperty("mail.smtp.port", "465");
prop.setProperty("mail.smtp.socketFactory.port","465");
prop.setProperty("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");
// 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", true);
prop.put("mail.smtp.ssl.socketFactory", sf);