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());
	}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值