Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions students/2756638003/srp/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.coderising</groupId>
<artifactId>ds-assignment</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>ds-assignment</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>

</dependencies>
<repositories>
<repository>
<id>aliyunmaven</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>
</repositories>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
package com.coderising.ood.srp;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import com.coderising.ood.srp.conf.Configuration;
import com.coderising.ood.srp.conf.ConfigurationKeys;
import com.coderising.ood.srp.conf.EmailStatus;
import com.coderising.ood.srp.domain.Product;
import com.coderising.ood.srp.domain.Subscriber;
import com.coderising.ood.srp.util.ConfigUtil;
import com.coderising.ood.srp.util.Email;
import com.coderising.ood.srp.util.MailUtil;
import com.coderising.ood.srp.util.SubscriberUtil;

public class PromotionMail {

protected String smtpHost = null;
protected String altSmtpHost = null;
protected String fromAddress = null;

private static Configuration config;

public static void main(String[] args) throws Exception {
File file = new File("XX/product_promotion.txt");
boolean emailDebug = false;
new PromotionMail(file, emailDebug);
}

/**
* 从配置文件中读取商品信息
*/
private List<Product> loadFile(File file) throws IOException {
Map<String, String> conf = ConfigUtil.readTextFile(file);
List<Product> productList = new ArrayList<Product>(16);
Set<Entry<String, String>> entrySet = conf.entrySet();
for (Entry<String, String> entry : entrySet) {
productList.add(new Product(entry.getKey(), entry.getValue()));
}
return productList;
}

/**
* 根据商品查询订阅的用户信息
*/
private List<Subscriber> querySubscribersFormFile(List<Product> productList)
throws IOException {
StringBuilder query = new StringBuilder(
"Select name from Subscriber where product_id in( ");
for (int i = 0, len = productList.size(); i < len - 1; i++) {
query.append(productList.get(i).getProductID() + " ,");
}
query.append(productList.get(productList.size() - 1).getProductID());
query.append(") and send_mail = ?");
return SubscriberUtil.loadSubscriberList(query.toString(),
EmailStatus.READY);
}

/**
* 根据订阅者信息生成邮件
*/
private Email generatorEmail(Subscriber subscriber, String host) {
String subject = "您关注的产品降价了";
String message = "尊敬的 " + subscriber.getName() + ", 您关注的产品 "
+ subscriber.getProduct().getProductDesc() + " 降价了,欢迎购买!";
return new Email(subscriber.getEmail(), fromAddress, subject, message,
host);
}

public PromotionMail(File file, boolean mailDebug) throws Exception {
config = new Configuration();
setSMTPHost();
setAltSMTPHost();
setFromAddress();
// 从配置文件中读取商品信息
List<Product> productList = loadFile(file);
// 根据商品查询订阅的用户信息
List<Subscriber> subscriberList = querySubscribersFormFile(productList);
// 发送邮件
sendEMails(mailDebug, subscriberList);
}

/**
* 发送邮件
*/
protected void sendEMails(boolean debug, List<Subscriber> subscriberList)
throws IOException {
System.out.println("开始发送邮件");
if (subscriberList != null && subscriberList.size() > 0) {
Iterator<Subscriber> iter = subscriberList.iterator();
Subscriber subscriber = null;

while (iter.hasNext()) {
subscriber = iter.next();
try {
MailUtil.sendEmail(generatorEmail(subscriber, smtpHost),
debug);
} catch (Exception e) {
try {
MailUtil.sendEmail(
generatorEmail(subscriber, altSmtpHost), debug);
} catch (Exception e2) {
System.out.println("通过备用 SMTP服务器发送邮件失败: "
+ e2.getMessage());
}
}
}
} else {
System.out.println("没有邮件发送");
}
}

protected void setSMTPHost() {
smtpHost = config.getProperty(ConfigurationKeys.SMTP_SERVER);
}

protected void setAltSMTPHost() {
altSmtpHost = config.getProperty(ConfigurationKeys.ALT_SMTP_SERVER);
}

protected void setFromAddress() {
fromAddress = config.getProperty(ConfigurationKeys.EMAIL_ADMIN);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.coderising.ood.srp.conf;

import java.util.HashMap;
import java.util.Map;

/**
* 邮件服务器配置文件
*/
public class Configuration {

static Map<String, String> configurations = new HashMap<>();

static {
configurations.put(ConfigurationKeys.SMTP_SERVER, "smtp.163.com");
configurations.put(ConfigurationKeys.ALT_SMTP_SERVER, "smtp1.163.com");
configurations.put(ConfigurationKeys.EMAIL_ADMIN, "admin@company.com");
}

/**
* 应该从配置文件读, 但是这里简化为直接从一个map 中去读
*
* @param key
* @return
*/
public String getProperty(String key) {
return configurations.get(key);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.coderising.ood.srp.conf;

public class ConfigurationKeys {

public static final String SMTP_SERVER = "smtp.server";
public static final String ALT_SMTP_SERVER = "alt.smtp.server";
public static final String EMAIL_ADMIN = "email.admin";

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.coderising.ood.srp.conf;

/**
* 邮件发送状态常量
*/
public enum EmailStatus {
/**
* 未发送
*/
READY(0),
/**
* 已发送
*/
SEND(1),
/**
* 已查阅
*/
RECEIVED(2),
/**
* 被退回
*/
REJECTED(3);

@SuppressWarnings("unused")
private int value;

private EmailStatus(int value) {
this.value = value;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
P8756 iPhone8
P3946 XiaoMi10
P8904 Oppo R15
P4955 Vivo X20
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.coderising.ood.srp.domain;

/**
* 商品类
*/
public class Product {

private String productID;
private String productDesc;

public Product(String productID, String productDesc) {
super();
this.productID = productID;
this.productDesc = productDesc;
}

public Product() {
super();
}

public String getProductID() {
return productID;
}

public void setProductID(String productID) {
this.productID = productID;
}

public String getProductDesc() {
return productDesc;
}

public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
}

@Override
public String toString() {
return "Product [productID=" + productID + ", productDesc="
+ productDesc + "]";
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package com.coderising.ood.srp.domain;

/**
* 订阅者
*/
public class Subscriber {

private String subscriberId;
private String name;
private String email;
private Product product;
private Integer sendStatus;

public Subscriber(String subscriberId, String name, String email,
Product product) {
super();
this.subscriberId = subscriberId;
this.name = name;
this.email = email;
this.product = product;
}

public Subscriber() {
super();
}

public String getSubscriberId() {
return subscriberId;
}

public void setSubscriberId(String subscriberId) {
this.subscriberId = subscriberId;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public Product getProduct() {
return product;
}

public void setProduct(Product product) {
this.product = product;
}

public Integer getSendStatus() {
return sendStatus;
}

public void setSendStatus(Integer sendStatus) {
this.sendStatus = sendStatus;
}

@Override
public String toString() {
return "Subscriber [subscriberId=" + subscriberId + ", name=" + name
+ ", email=" + email + ", product=" + product + ", sendStatus="
+ sendStatus + "]";
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.coderising.ood.srp.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
* 配置文件读写工具类
*
*/
public class ConfigUtil {

public static Map<String, String> readTextFile(File file)
throws IOException {
Map<String, String> conf = new HashMap<String, String>();
try (BufferedReader br = new BufferedReader(new FileReader(file));) {
String temp = null;
while ((temp = br.readLine()) != null) {
int indexOf = temp.indexOf(' ');
if (indexOf > -1) {
conf.put(temp.substring(0, indexOf),
temp.substring(indexOf));
}
}
} catch (IOException e) {
throw new IOException(e.getMessage());
}
return conf;
}
}
Loading