JAVA中如何编写邮件内容_JavaMail邮件发送如何实现简单封
装
⾸先每次发送需要配置的东西很多,包括发件⼈的邮箱和密码、smtp服务器和SMTP端⼝号等信息。其次,没有将发送和邮件内容相分离。按照单⼀职责原则,应该有且仅有⼀个原因引起类的变更[1]。最后⼀个问题是,我们的代码不仅⾃⼰⽤,也很可能让别⼈调⽤。别⼈调⽤的时候不想去了解邮件发送的细节,调⽤的⼈只想传尽量少的参数获得预期的效果。因此让Demo变成可以使⽤的代码需要我们重新设计代码的结构。
从Demo中我们可以抽象出两种类型的POJO,也就是发件⼈和邮件。你可能会问收件⼈怎么办?收件⼈可以跟邮件POJO放在⼀起吗?
仔细思考下我们就知道,邮件和收件⼈应该是分开的。因为如果邮件和收件⼈放在⼀起,那么就意味着我的⼀封邮件只能发送给特定的⼈了,⽽实际上我们会把相同的邮件发送给不同的收件⼈。因此收件⼈只要作为发送时的参数就可以了。
1.发件⼈POJO
/**
* @Title: MailAuthenticator
* @author: ykgao
* @description:
* @date: 2017-10-11 下午04:55:37
*/
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
/**
* 服务器邮箱登录验证
*
* @author MZULE日的时候说的话有哪些
*
*/
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;
}
}
2.邮件POJO
⽤于存储邮件主题和内容。
/**
* @Title: SimpleMail
* @author: ykgao
* @description:
* @date: 2017-10-11 下午04:56:27
*/
public class SimpleMail {
/** 邮件主题 */
public String Subject;
/** 邮件内容 */
public String Content;
/**
* @return the subject
*/
public String getSubject() {
return Subject;
}
/
**
* @param subject无法打开文件
* the subject to set名酒
*/
public void setSubject(String subject) { Subject = subject;
}
/**
* @return the content
*/
public String getContent() {
return Content;
}
/**
* @param content
* the content to set
*/
public void setContent(String content) { Content = content;
}
}
3.邮件发送
设计好了POJO,我们现在需要当然是发送邮件了。在Demo中我们需要配置SMTP服务器,但是我们使⽤邮箱发送邮件的时候并不需要填写SMTP服务器。其实SMTP服务器⼤多数的格式是:ailType。此处emailType 就是你的邮箱类型也就是@后⾯跟的名称。⽐如163邮箱就是1
63。不过这个⽅法也不是万能的,因为outlook邮箱的smtp服务器就不是这个格式,⽽是smtp-mail.outlook ,所以我单独为outlook邮箱写了个例外。
我们还需要分邮件的功能。这个设计起来很容易,只需要⼀个单⼈发送的重载⽅法,其收件⼈的参数可以是⼀个List。
为了减少接⼝的参数个数,我们把SMTP端⼝默认为587。
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.List;
import java.util.Properties;
import javaMailDevelopment.SimpleMail;
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.MimeMessage.RecipientType;
import com.sun.mail.util.MailSSLSocketFactory;
/**
* @Title: SimpleMailSender
* @author: ykgao
* @description: 邮件发送器
* @date: 2017-10-11 下午04:54:50
*/
public class SimpleMailSender {
/**
* 发送邮件的props⽂件
*/
private final transient Properties props = Properties();
/**
* 邮件服务器登录验证
*/
private transient MailAuthenticator authenticator;
/**
* 邮箱session
*/
private transient Session session;
/**
* 初始化邮件发送器
*
* @param smtpHostName
* SMTP邮件服务器地址
* @param username
* 发送邮件的⽤户名(地址)
* @param password
* 发送邮件的密码
*/
public SimpleMailSender(final String smtpHostName, final String username, final String password) { init(username, password, smtpHostName);
}
/**
* 初始化邮件发送器
*
* @param username
* 发送邮件的⽤户名(地址),并以此解析SMTP服务器地址
* @param password
* 发送邮件的密码
*/
public SimpleMailSender(final String username, final String password) {
// 通过邮箱地址解析出smtp服务器,对⼤多数邮箱都管⽤
String smtpHostName = "smtp." + username.split("@")[1];
if (username.split("@")[1].equals("outlook")) {
smtpHostName = "smtp-mail.outlook";
}
init(username, password, smtpHostName);
}
/**
* 初始化
>福建旅游
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论