java email 在阿里云服务器发送邮件失败的解决方法
昨天在弄腾讯企业邮发送邮件后台,中间遇到了一个问题,就是在本地服务器可以正常发送邮件,但是布署到阿里云服务器就不行,于是在网上找了大半天解决方法,前后修修改改也花费了几个小时,直到快下班了才弄出来,所以在这里列出写个博客,记录一下自己的问题,顺带也贴上自己写的工具类代码,希望能帮助到更多开发者。
阿里云服务器上不能发送邮件的问题:
1.腾讯企业邮箱不支持25端口,建议使用465端口(其他邮箱支持端口可以登录账号去设置里查看);
2.使用465端口一定要开启ssl协议;
下面是我修改后发送邮件的工具类:
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
/**
* @ClassName: EmailUtil
* @Description: 邮件工具类
* @author ZL
* @date 2018年5月14日 下午3:31:23
*
*/
public class EmailUtil {
private static Logger LOG = Logger.getLogger(EmailUtil.class);
// 邮件服务地址
private static String host = "smtp.exmail.qq.com";
// 发送用户
private static String username = "****";
// 发送用户密码
private static String password = "****";
// 发送昵称
private static String nick = "**商城";
/**
* @Title: sendMail
* @Description: 发送邮件 (激活用户使用)
* @param to 收件人
* @param activeCode 激活码
* @throws AddressException
* @throws MessagingException
* @throws UnsupportedEncodingException 设定文件
* @return boolean 返回类型
*/
public static boolean sendMail(String to,String activeCode) throws AddressException, MessagingException,
UnsupportedEncodingException {
// 激活码判断
if (StringUtils.isEmpty(activeCode)) {
LOG.debug("#href is empty.");
return false;
}
String body = getBodyContent(to,activeCode);
// 创建Properties对象
Properties props = System.getProperties();
// 创建信件服务器
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", "465");
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.auth", "true"); // 通过验证
// MailSSLSocketFactory sf = null;
// try {
// sf = new MailSSLSocketFactory();
// } catch (GeneralSecurityException e) {
// LOG.debug("#create MailSSLSocketFactory has error.",e);
// }
// sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.enable", "true"); // 开启ssl
// props.put("mail.smtp.ssl.socketFactory", sf); // 信任此站点证书
// 得到默认的对话对象
Session session = Session.getDefaultInstance(props, null);
// 创建一个消息,并初始化该消息的各项元素
MimeMessage msg = new MimeMessage(session);
nick = MimeUtility.encodeText(nick);
msg.setFrom(new InternetAddress(nick + "<" + username + ">"));
// 创建收件人列表
if (to != null && to.trim().length() > 0) {
String[] arr = to.split(",");
int receiverCount = arr.length;
if (receiverCount > 0) {
InternetAddress[] address = new InternetAddress[receiverCount];
for (int i = 0; i < receiverCount; i++) {
address[i] = new InternetAddress(arr[i]);
}
msg.addRecipients(Message.RecipientType.TO, address);
// msg.setSubject(subject);
msg.setContent(body,"text/html;charset=utf-8");
// 设置信件头的发送日期
msg.setSentDate(new Date());
msg.saveChanges();
// 发送信件
Transport transport = session.getTransport("smtp");
transport.connect(host, username, password);
transport.sendMessage(msg,
msg.getRecipients(Message.RecipientType.TO));
transport.close();
return true;
} else {
LOG.debug("None receiver!");
return false;
}
} else {
LOG.debug("None receiver!");
return false;
}
}
/**
* @Title: getBodyContent
* @Description: 获取邮件正文内容
* @param to
* @param href
* @return String 返回类型
*/
private static String getBodyContent(String to, String activeCode){
// String addr = SessionUtil.getRequest().getLocalAddr();
String addrName = SessionUtil.getRequest().getServerName();
String url = "";
if(addrName.equals("localhost")){
url = SessionUtil.getRequest().getScheme() +"://" + getIp()+ ":" +SessionUtil.getRequest().getServerPort();
}else{
url = SessionUtil.getRequest().getScheme() +"://" + addrName + ":" +SessionUtil.getRequest().getServerPort();
}
// 激活码链接地址
url = url+"/****/****.action?code="+activeCode;
LOG.debug("active url -> "+url);
StringBuilder body = new StringBuilder();
body.append("<p style='padding-bottom:20px;'>亲爱的 <strong><a href='mailto:"+to+"' target='_blank'>"+to+"</a></strong>:</p>")
.append("<p style='background:#f7f7f7; padding:10px 20px;line-height:36px;'>")
.append("请点击以下链接激活用户:<br><a href='"+url+"' >"+url+"</a><br>")
.append("<span style='font-size:12px; color:#999;'>如果以上链接无法点击,请将它复制到您的浏览器(如IE)地址栏中进入访问。</span></p>")
.append("<p style='border-top:1px solid #ddd;color:#999;font-size:12px;padding-top:10px;'>这是一封系统自动发出的邮件,请勿回复。</p>");
return body.toString();
}
/**
* @Title: getIp
* @Description: 获取电脑IP地址
* @param @return 设定文件
* @return String 返回类型
* @throws
*/
public static String getIp(){
InetAddress addr = null;
try {
addr = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String ip=addr.getHostAddress().toString(); //获取本机ip
return ip;
}
public static void main(String[] args) {
System.out.println(getIp());
}
}