瀏覽代碼

修改邮箱端口为465实现

郭超 4 年之前
父節點
當前提交
4b941e7563

+ 1 - 1
mooctest-user-server/Dockerfile

@@ -1,7 +1,7 @@
 FROM openjdk:alpine
 RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main/" > /etc/apk/repositories
 EXPOSE 8081
-EXPOSE 25
+EXPOSE 465
 ADD target/mooctest-user-server.jar /root
 WORKDIR /root
 ENTRYPOINT ["java", "-jar", "-Djava.security.egd=file:/dev/./urandom", "mooctest-user-server.jar"]

+ 3 - 2
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/MailService.java

@@ -1,6 +1,7 @@
 package cn.iselab.mooctest.user.service;
 
 import javax.mail.MessagingException;
+import java.io.UnsupportedEncodingException;
 
 /**
  * @Description: 发送邮件服务接口
@@ -13,9 +14,9 @@ public interface MailService {
                          String subject, String content);
 
     void sendHtmlEmail(String sender, String receiver,
-                         String subject, String content) throws MessagingException;
+                         String subject, String content) throws MessagingException, UnsupportedEncodingException;
 
-    void sendVerifyEmail(String sender, String receiver, String code) throws MessagingException;
+    void sendVerifyEmail(String sender, String receiver, String code) throws MessagingException, UnsupportedEncodingException;
 
     void sendArrearsEmail();
 }

+ 23 - 14
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/service/impl/MailServiceImpl.java

@@ -3,6 +3,9 @@ package cn.iselab.mooctest.user.service.impl;
 import cn.iselab.mooctest.user.configure.MailProperties;
 import cn.iselab.mooctest.user.constants.VerifyConstants;
 import cn.iselab.mooctest.user.service.MailService;
+import cn.iselab.mooctest.user.util.mail.MailSender;
+import cn.iselab.mooctest.user.util.mail.MailSenderFactory;
+import cn.iselab.mooctest.user.util.mail.MailSenderType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -62,26 +65,32 @@ public class MailServiceImpl implements MailService {
         mailSender.send(message);
     }
 
-    @Override
-    public void sendHtmlEmail(String sender, String receiver, String subject, String content) throws MessagingException {
-        MimeMessage message = mailSender.createMimeMessage();
-        MimeMessageHelper helper = new MimeMessageHelper(message,true);
-        try {
-            helper.setFrom(sender, VerifyConstants.SENDER_NAME);
-        } catch (UnsupportedEncodingException e) {
-            logger.error("设置发件人名称出错", e);
-        }
-        helper.setTo(receiver);
-        helper.setSubject(subject);
-        helper.setText(content, true);
-        mailSender.send(message);
+//    @Override
+//    public void sendHtmlEmail(String sender, String receiver, String subject, String content) throws MessagingException {
+//        MimeMessage message = mailSender.createMimeMessage();
+//        MimeMessageHelper helper = new MimeMessageHelper(message,true);
+//        try {
+//            helper.setFrom(sender, VerifyConstants.SENDER_NAME);
+//        } catch (UnsupportedEncodingException e) {
+//            logger.error("设置发件人名称出错", e);
+//        }
+//        helper.setTo(receiver);
+//        helper.setSubject(subject);
+//        helper.setText(content, true);
+//        mailSender.send(message);
+//
+//    }
 
+    @Override
+    public void sendHtmlEmail(String sender, String receiver, String subject, String content) throws MessagingException, UnsupportedEncodingException {
+        MailSender sms = MailSenderFactory.getSystemSender(MailSenderType.SERVICE);
+        sms.sendTo(receiver, subject, content);
     }
 
 
 
     @Override
-    public void sendVerifyEmail(String sender, String receiver, String code) throws MessagingException {
+    public void sendVerifyEmail(String sender, String receiver, String code) throws MessagingException, UnsupportedEncodingException {
         Context context = new Context();
         context.setVariable("verifyCode", code);
         String emailContent = templateEngine.process("email/verify_mail", context);

+ 46 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/util/mail/MailAuthenticator.java

@@ -0,0 +1,46 @@
+package cn.iselab.mooctest.user.util.mail;
+
+import javax.mail.Authenticator;
+import javax.mail.PasswordAuthentication;
+
+public class MailAuthenticator extends Authenticator {
+ 
+    /**
+     */
+    private String username;
+    /**
+     */
+    private String password;
+ 
+    /**
+     * 
+     * @param username
+     * @param password
+     */
+    public MailAuthenticator(String username, String password) {
+    this.username = username;
+    this.password = password;
+    }
+ 
+    String getPassword() {
+    return password;
+    }
+ 
+    @Override
+    protected PasswordAuthentication getPasswordAuthentication() {
+    return new PasswordAuthentication(username, password);
+    }
+ 
+    String getUsername() {
+    return username;
+    }
+ 
+    public void setPassword(String password) {
+    this.password = password;
+    }
+ 
+    public void setUsername(String username) {
+    this.username = username;
+    }
+ 
+}

+ 62 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/util/mail/MailConstants.java

@@ -0,0 +1,62 @@
+package cn.iselab.mooctest.user.util.mail;
+
+/**
+ * Created by Liu on 2017/1/4.
+ */
+public class MailConstants {
+    /**
+     * The email accounts for the administrators, emails are sent when someone
+     * or some problems are to be reviewed
+     */
+    public static final String[] ADMIN_EMAILS = { "pyzychen@gmail.com",
+            "zicong.liu.nju@gmail.com" };
+
+    /**
+     * The email for account management
+     */
+    // public static final String SYSTEM_EMAIL = "noreply_witest_net@163.com";
+    // public static final String SYSTEM_EMAIL_PASS = "witest";
+     public static final String SYSTEM_EMAIL = "diors_po@126.com";
+     public static final String SYSTEM_EMAIL_PASS = "xxb19970213";
+    //暂时使用EDM代替企业邮箱
+//    public static final String SYSTEM_EMAIL = "edmc04621115";
+//    public static final String SYSTEM_EMAIL_PASS = "IN1QB4EG";
+
+    /**
+     * The email for notice and invitation
+     */
+    public static final String[] NOTICE_EMAILS = new String[]{
+//		"mooctest@sina.com",
+//		"mooctest@sina.cn",
+//		"mooctestnet@sina.com",
+//		"mooctestnet@sina.cn",
+//		"mooctestnet@163.com",
+//		"mooctestnet@126.com",
+            "edmc04621115"  //EDM账户
+    };
+    public static final String[] NOTICE_EMAILS_PASS = new String[]{
+//		"NJU83621360",
+//		"NJU83621360",
+//		"NJU83621360",
+//		"NJU83621360",
+//		"fvhcfobhridqasdz",
+//		"oqjiimxokcceukmr",
+            "IN1QB4EG"
+    };
+
+    public static final String DEFAULT_SENDER_NAME = "众测服务平台";
+    //使用EDM账户时需要指定sender
+    public static final String EDM_SENDER_ADDRESS = "service@edm.mooctest.net";
+    public static final String EDM_SENDER_NAME = DEFAULT_SENDER_NAME;
+
+    /**
+     * The Maximum buffer size in file system when handling files
+     */
+    public static final int BUFFER_SIZE = 2 * 1024;
+
+    /**
+     * The maximum timeout of link for "forget password" function
+     */
+
+    public static final long BIND_EMAIL_TIMEOUT = 1000 * 60 * 60 * 12;
+}

+ 158 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/util/mail/MailSender.java

@@ -0,0 +1,158 @@
+package cn.iselab.mooctest.user.util.mail;
+
+
+import cn.iselab.mooctest.user.constants.VerifyConstants;
+
+import javax.activation.DataHandler;
+import javax.activation.FileDataSource;
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.internet.*;
+import javax.mail.internet.MimeMessage.RecipientType;
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+import java.util.Properties;
+
+public class MailSender {
+
+	private static final String SMTP_QQ = "smtp.exmail.qq.com";
+	private static final String SMTP_EDM = "smtp.trigger.edmcn.cn";
+	private static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
+	
+    private final transient Properties props = System.getProperties();
+    private transient MailAuthenticator authenticator;
+    private transient Session session;
+
+    
+    public MailSender(final String smtpHostName, final String username,
+                      final String password) {
+    	init(username, password, smtpHostName);
+    }
+ 
+    public MailSender(final String username, final String password) {
+    	String smtpHost;
+    	// QQ企业邮箱
+    	if(username.endsWith("@mooctest.net")){
+    		smtpHost = SMTP_QQ;
+    	}
+    	// EDM帐号
+    	else if(isEDM(username)){
+    		smtpHost = SMTP_EDM;
+    	}
+    	else{
+    		smtpHost = "smtp." + username.split("@")[1];
+    	}
+    	
+    	init(username, password, smtpHost);
+    }
+
+    private void init(String username, String password, String smtpHostName) {
+	    props.put("mail.smtp.auth", "true");
+	    props.put("mail.smtp.host", smtpHostName);
+	    // patch for QQ企业邮箱
+	    if (smtpHostName.equals(SMTP_QQ)){
+	    	props.put("mail.smtp.port", "465");
+			props.put("mail.smtp.socketFactory.class", SSL_FACTORY);
+			props.put("mail.smtp.socketFactory.fallback", "false");
+			props.put("mail.smtp.socketFactory.port", "465");
+	    }
+	    authenticator = new MailAuthenticator(username, password);
+	    session = Session.getInstance(props, authenticator);
+    }
+    
+    
+    private boolean isEDM(String account){
+    	if(account.startsWith("edmc") && !account.contains("@")){
+    		return true;
+    	}
+    	return false;
+    }
+    
+    private InternetAddress getSenderAddress() throws AddressException, UnsupportedEncodingException {
+    	if(isEDM(authenticator.getUsername())){
+    		return new InternetAddress(MailConstants.EDM_SENDER_ADDRESS, MailConstants.EDM_SENDER_NAME);
+    	}
+    	return new InternetAddress(authenticator.getUsername(), MailConstants.DEFAULT_SENDER_NAME);
+    }
+	public void sendTo(String recipient, String subject, Object content)
+			throws AddressException, MessagingException, UnsupportedEncodingException {
+		final MimeMessage message = new MimeMessage(session);
+		message.setHeader("X-Priority", "3");
+		message.setFrom(getSenderAddress());
+		message.setRecipient(RecipientType.TO, new InternetAddress(recipient));
+		message.setSubject(subject);
+		message.setContent(content.toString(), "text/html;charset=utf-8");
+		Transport.send(message);
+	}
+    
+    public void send(String recipient, String subject, Object content)
+        throws AddressException, MessagingException, UnsupportedEncodingException {
+	    final MimeMessage message = new MimeMessage(session);
+
+	    message.setHeader("X-Priority", "3");
+	    message.setFrom(getSenderAddress());
+	    message.setRecipient(RecipientType.TO, new InternetAddress(recipient));
+	    message.setSubject(subject);
+	    message.setContent(content.toString(), "text/html;charset=utf-8");
+	    Transport.send(message);
+    }
+    
+    public void send(String recipient, String subject, String content, String attachmentPath)
+            throws MessagingException, UnsupportedEncodingException {
+    	    final MimeMessage message = new MimeMessage(session);
+    	    
+    	    // set priority to normal - 1 for high, 3 for normal, 5 for low
+    	    message.setHeader("X-Priority", "3");
+    	    message.setFrom(getSenderAddress());
+    	    message.setRecipient(RecipientType.TO, new InternetAddress(recipient));
+    	    message.setSubject(subject);
+    	    
+    	    // Create and combine email parts
+    	    MimeBodyPart attachment = createAttachment(attachmentPath);
+    	    MimeBodyPart contentPart = createContent(content);
+    	    	
+    	    MimeMultipart allPart = new MimeMultipart("mixed");
+            allPart.addBodyPart(attachment);  
+            allPart.addBodyPart(contentPart);  
+            
+    	    message.setContent(allPart, "text/html;charset=utf-8");
+    	    Transport.send(message);
+        }
+
+ 
+    public void send(List<String> recipients, String subject, Object content)
+        throws AddressException, MessagingException, UnsupportedEncodingException {
+	    final MimeMessage message = new MimeMessage(session);
+	    
+	    message.setFrom(getSenderAddress());
+	    
+	    final int num = recipients.size();
+	    InternetAddress[] addresses = new InternetAddress[num];
+	    for (int i = 0; i < num; i++) {
+	        addresses[i] = new InternetAddress(recipients.get(i));
+	    }
+	    message.setHeader("X-Priority", "3");
+	    message.setRecipients(RecipientType.TO, addresses);
+	    
+	    message.setSubject(subject);
+	    message.setContent(content.toString(), "text/html;charset=utf-8");
+	    Transport.send(message);
+    }
+    
+    private MimeBodyPart createAttachment(String fileName) throws MessagingException {
+        MimeBodyPart attachmentPart = new MimeBodyPart();
+        FileDataSource fds = new FileDataSource(fileName);
+        attachmentPart.setDataHandler(new DataHandler(fds));
+        attachmentPart.setFileName(fds.getName());  
+        return attachmentPart;  
+    } 
+    private MimeBodyPart createContent(String body)
+            throws MessagingException {
+        MimeBodyPart contentBody = new MimeBodyPart();
+        contentBody.setContent(body, "text/html;charset=utf-8"); 
+        
+        return contentBody;  
+    }
+
+}

+ 39 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/util/mail/MailSenderFactory.java

@@ -0,0 +1,39 @@
+package cn.iselab.mooctest.user.util.mail;
+
+public class MailSenderFactory {
+
+    private static MailSender systemSender = null;
+    private static MailSender[] noticeSenders = null;
+
+    /**
+     * 帐号管理类的邮件、同步的邮件,用SYSTEM_EMAIL发
+     */
+    public static MailSender getSystemSender(MailSenderType type) {
+        if (type == MailSenderType.SERVICE) {
+            if (systemSender == null) {
+                systemSender = new MailSender(MailConstants.SYSTEM_EMAIL, MailConstants.SYSTEM_EMAIL_PASS);
+            }
+            return systemSender;
+        }
+        return null;
+    }
+
+    /**
+     * 通知类的邮件、异步的邮件,用NOTICE_EMAILS发
+     */
+    public static MailSender[] getNoticeSenders(MailSenderType type) {
+        if (type == MailSenderType.NOTICE) {
+            if (noticeSenders == null) {
+                int nums = MailConstants.NOTICE_EMAILS.length;
+                noticeSenders = new MailSender[nums];
+
+                for (int i = 0; i < nums; i++) {
+                    noticeSenders[i] = new MailSender(MailConstants.NOTICE_EMAILS[i], MailConstants.NOTICE_EMAILS_PASS[i]);
+                }
+            }
+            return noticeSenders;
+        }
+        return null;
+    }
+
+}

+ 6 - 0
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/util/mail/MailSenderType.java

@@ -0,0 +1,6 @@
+package cn.iselab.mooctest.user.util.mail;
+
+public enum MailSenderType {
+	SERVICE,
+	NOTICE
+}

+ 2 - 1
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/ctrl/TestController.java

@@ -19,6 +19,7 @@ import org.springframework.web.servlet.ModelAndView;
 
 import javax.mail.MessagingException;
 import javax.servlet.http.HttpServletRequest;
+import java.io.UnsupportedEncodingException;
 import java.sql.Timestamp;
 import java.util.HashMap;
 import java.util.Map;
@@ -68,7 +69,7 @@ public class TestController extends BaseController{
         try {
             mailService.sendVerifyEmail("diors_po@126.com", "171256175@qq.com", "1234");
             result.init(ResponseStatus.SUCCESS, "发送成功", null);
-        } catch (MessagingException e) {
+        } catch (MessagingException | UnsupportedEncodingException e) {
             result.init(ResponseStatus.FAILED, "发送失败", null);
             LOG.error("发送邮件出错",e);
         }

+ 1 - 1
mooctest-user-server/src/main/java/cn/iselab/mooctest/user/web/logic/impl/UserLogicImpl.java

@@ -347,7 +347,7 @@ public class UserLogicImpl extends BaseLogic implements UserLogic {
             mailService.sendVerifyEmail(mailProperties.getUsername(),
                     verifyCode.getReceiver(),
                     verifyCode.getCode());
-        } catch (MessagingException e) {
+        } catch (MessagingException | UnsupportedEncodingException e) {
             result.init(ResponseStatus.FAILED, "邮件发送出错,请检查邮箱是否正确", receiver);
             LOG.error(result.getMsg(),e);
             return result;