qq登陆修改smtp为可用,并配置文件中的password为ssl的授权码进行ssl登陆验证
package sendemail.util;
import java.security.GeneralSecurityException;
import java.security.Security;
import java.util.List;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import com.sun.mail.util.MailSSLSocketFactory;
/**
* 邮件发送器,可单发,群发
* 群发邮件时可能会被认为是垃圾邮件,尽量避免使用
* 需要群发邮件时,可以采用多次单发的方式进行
* @author
*
*/
public class MailSender {
/**
* 邮箱session
*/
private transient Session session;
/**
* 邮件服务器登录验证
*/
private transient MailAuthenticator authenticator;
/**
* 发送邮件的props
*/
private final transient Properties props = System.getProperties();
/**
* 获取邮件发送工具实例
* 所有的发件操作均通过该实例进行
* @param username 发件人邮箱地址
* @param password 发件人邮箱密码
*
*/
public static MailSender getSender(String username, String password) {
MailSender serviceSms = new MailSender(username, password);
return serviceSms;
}
/**
* 初始化邮件发送器
* @param smtpHostName SMTP邮件服务器地址
* @param username 发送邮件的用户名(邮箱地址)
* @param password 发送邮件的密码
*
*/
public MailSender(final String smtpHostName, final String username, final String password) {
init(username, password, smtpHostName);
}
/**
* 初始化邮件发送器
* @param username 发送邮件的用户名(邮箱地址),并以此解析SMTP服务器地址
* @param password 发送邮件的密码
*
*/
public MailSender(String username, final String password) {
//通过邮箱地址解析出smtp服务器,对大多数邮箱都管用
String smtpHostName = "smtp." + username.split("@")[1];
System.out.println("SMTP: " + smtpHostName);
System.out.println("Username: " + username);
System.out.println("Password: " + password);
init(username, password, smtpHostName);
}
/**
* 初始化
* @param username 发送邮件的用户名(邮箱地址)
* @param password 密码
* @param smtpHostName SMTP主机地址
*/
private void init(String username, String password, String smtpHostName) {
//开启ssl加密 如果没有就报530错误
MailSSLSocketFactory sf = null;
try {
sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
} catch (GeneralSecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.ssl.socketFactory", sf);
//初始化props
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.smtp.host", smtpHostName);
props.setProperty("mail.smtp.port", "465");
authenticator = new MailAuthenticator(username, password); //验证
session = Session.getInstance(props, authenticator); //创建session
}
/**
* 发送邮件
* @param recipient 收件人邮箱地址
* @param subject 邮件主题
* @param content 邮件内容
*
*/
public void send(String recipient, String subject, Object content) throws Exception {
final MimeMessage message = new MimeMessage(session); //创建mime类型邮件
message.setFrom(new InternetAddress(authenticator.getUsername())); //设置发信人
message.setRecipient(RecipientType.TO, new InternetAddress(recipient)); //设置收件人
message.setSubject(subject); //设置主题
message.setContent(content.toString(), "text/html;charset=utf-8"); //设置邮件内容
Transport.send(message); //发送
/*String server = "smtp.qq.com";
String username = "997109508@qq.com";
String password = "19890825Wqy,.";
Transport transport = session.getTransport();
transport.connect(server, username, password);
transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
transport.close(); */
}
/**
* 群发邮件
* 群发邮件时可能会被认为是垃圾邮件,尽量避免使用
* @param recipients 收件人地址队列
* @param subject 主题
* @param content 内容
*
*/
public void send(List<String> recipients, String subject, Object content) throws Exception {
final MimeMessage message = new MimeMessage(session); //创建mime类型邮件
message.setFrom(new InternetAddress(authenticator.getUsername())); //设置发信人
final int count = recipients.size(); //设置收件人们
InternetAddress[] addresses = new InternetAddress[count];
for (int i = 0; i < count; i++) {
addresses[i] = new InternetAddress(recipients.get(i));
}
message.setRecipients(RecipientType.TO, addresses);
message.setSubject(subject); //设置主题
message.setContent(content.toString(), "text/html;charset=utf-8"); //设置邮件内容
Transport.send(message); //发送
}
/**
* 发送邮件
* @param recipient 收件人邮箱地址
* @param mail 邮件对象
*
*/
public void send(String recipient, MailInfo mail) throws Exception {
send(recipient, mail.getSubject(), mail.getContent());
}
/**
* 群发邮件
* 群发邮件时可能会被认为是垃圾邮件,尽量避免使用
* @param recipients 收件人地址队列
* @param mail 邮件对象
*
*/
public void send(List<String> recipients, MailInfo mail) throws Exception {
send(recipients, mail.getSubject(), mail.getContent());
}
}