zoukankan      html  css  js  c++  java
  • 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());
    }

    }

  • 相关阅读:
    利用栈实现字符串中三种括号的匹配问题c++语言实现
    十进制数转N进制c++实现
    字符单链表识别数字,字母,其它字符,并分为三个循环链表的算法c++实现
    c++两数组合并算法
    c++顺序表(数组)查找最大最小值
    SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析
    php实现单点登录,顶级域名与子域名间共享Cookie实现单点登录原理
    php实现单点登录实例
    php实现SSO单点登录实例
    玩转音频、视频的利器:FFmpeg
  • 原文地址:https://www.cnblogs.com/grimm/p/12474274.html
Copyright © 2011-2022 走看看