commit
38d3257df9
@ -0,0 +1,36 @@ |
||||
package com.dxhy.core.service.openservice.model.ocr; |
||||
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty; |
||||
import lombok.Data; |
||||
|
||||
import java.util.List; |
||||
|
||||
@Data |
||||
public class OcrDataListEntity { |
||||
|
||||
@JsonProperty("image_angle") |
||||
private int imageAngle; |
||||
@JsonProperty("rotated_image_width") |
||||
private int rotatedImageWidth; |
||||
@JsonProperty("rotated_image_height") |
||||
private int rotatedImageHeight; |
||||
private String type; |
||||
@JsonProperty("type_description") |
||||
private String typeDescription; |
||||
//头信息
|
||||
@JsonProperty("item_list") |
||||
private List<OcrItemListEntity> itemList; |
||||
//发票明细数据
|
||||
@JsonProperty("product_list") |
||||
private List<List<OcrProductListEntity>> productList; |
||||
|
||||
//特殊字符无法作为常量key
|
||||
private String CLASS; |
||||
private String kind; |
||||
@JsonProperty("kind_description") |
||||
private String kindDescription; |
||||
private List<Integer> position; |
||||
|
||||
private String image; |
||||
} |
@ -0,0 +1,197 @@ |
||||
package com.dxhy.core.service.openservice.model.ocr; |
||||
|
||||
import lombok.AllArgsConstructor; |
||||
|
||||
@AllArgsConstructor |
||||
public enum OcrDataTypeEnum { |
||||
|
||||
//➢type 为 vat_special_invoice(增值税专用发票)、vat_electronic_invoice(增
|
||||
//值税电子普通发票)、vat_common_invoice(增值税普通发票)、
|
||||
//vat_electronic_toll_invoice(增值税电子普通发票(通行费))
|
||||
VAT_INVOICE_CORRECT_CODE("vat_invoice_correct_code","校验码"), |
||||
VAT_INVOICE_DAIMA ("vat_invoice_daima","发票代码"), |
||||
VAT_INVOICE_HAOMA("vat_invoice_haoma","发票号码"), |
||||
VAT_INVOICE_HAOMA_LARGE_SIZE("vat_invoice_haoma_large_size","字体较大的发票号码"), |
||||
VAT_INVOICE_ISSUE_DATE("vat_invoice_issue_date","开票日期"), |
||||
VAT_INVOICE_RATE_PAYER_ID("vat_invoice_rate_payer_id","购买方纳税人识别号"), |
||||
VAT_INVOICE_TOTAL("vat_invoice_total","合计"), |
||||
VAT_INVOICE_TAX_RATE("vat_invoice_tax_rate","税率"), |
||||
VAT_INVOICE_JIDA_HAOMA("vat_invoice_jida_haoma","机打号码"), |
||||
VAT_INVOICE_SELLER_NAME("vat_invoice_seller_name","销售方名称"), |
||||
VAT_INVOICE_SELLER_BANK_ACCOUNT("vat_invoice_seller_bank_account","销售方开户行及帐号"), |
||||
VAT_INVOICE_SELLER_ID ("vat_invoice_seller_id","销售方纳税人识别号"), |
||||
VAT_INVOICE_SELLER_ADDR_TELL ("vat_invoice_seller_addr_tell","销售方地址、电话"), |
||||
VAT_INVOICE_PAYER_NAME ("vat_invoice_payer_name","购买方名称"), |
||||
VAT_INVOICE_PAYER_BANK_ACCOUNT ("vat_invoice_payer_bank_account","购买方开户行及帐号"), |
||||
VAT_INVOICE_PAYER_ADDR_TELL ("vat_invoice_payer_addr_tell","购买方地址、电话"), |
||||
VAT_INVOICE_TOTAL_COVER_TAX ("vat_invoice_total_cover_tax","价税合计大写"), |
||||
VAT_INVOICE_TOTAL_COVER_TAX_DIGITS ("vat_invoice_total_cover_tax_digits","价税合计小写"), |
||||
VAT_INVOICE_HEADLINE_PAGE_NUMBER ("vat_invoice_headline_page_number","标题发票联(普票,电子发票,专票增加字段)"), |
||||
VAT_INVOICE_TOTAL_PRINT ("vat_invoice_total_print","打印合计(普票,电子发票,专票增加字段)"), |
||||
VAT_INVOICE_CORRENT_CODE_PRINT ("vat_invoice_corrent_code_print","打印校验码(普票,电子发票,专票增加字段)"), |
||||
VAT_INVOICE_TAX_TOTAL("vat_invoice_tax_total","税额合计"), |
||||
VAT_INVOICE_GOODS_LIST ("vat_invoice_goods_list","货物或服务名称"), |
||||
VAT_INVOICE_GOODS("vat_invoice_goods","货物或服务名称"), |
||||
VAT_INVOICE_PRICE_LIST ("vat_invoice_price_list","金额明细"), |
||||
VAT_INVOICE_PRICE ("vat_invoice_price","金额明细"), |
||||
VAT_INVOICE_TAX_RATE_LIST ("vat_invoice_tax_rate_list","税率明细"), |
||||
VAT_INVOICE_TAX_LIST ("vat_invoice_tax_list","税额明细"), |
||||
VAT_INVOICE_TAX ("vat_invoice_tax","税额明细"), |
||||
VAT_INVOICE_ZHUAN_YONG_FLAG ("vat_invoice_zhuan_yong_flag","专票/普票/区块链发票"), |
||||
VAT_INVOICE_DAI_KAI_FLAG ("vat_invoice_dai_kai_flag","代开(非代开条目为空)"), |
||||
VAT_INVOICE_PLATE_SPECIFIC("vat_invoice_plate_specific","规格型号明细"), |
||||
VAT_INVOICE_ELECTRANS_UNIT ("vat_invoice_electrans_unit","单位明细"), |
||||
VAT_INVOICE_ELECTRANS_QUANTITY("vat_invoice_electrans_quantity","数量明细"), |
||||
VAT_INVOICE_ELECTRANS_UNIT_PRICE ("vat_invoice_electrans_unit_price","单价明细"), |
||||
VAT_INVOICE_DAIMA_RIGHT_SIDE ("vat_invoice_daima_right_side","右侧打印发票代码"), |
||||
VAT_INVOICE_HAOMA_RIGHT_SIDE ("vat_invoice_haoma_right_side","右侧打印发票号码"), |
||||
VAT_INVOICE_PAGE_NUMBER ("vat_invoice_page_number","抵扣联/发票联"), |
||||
VAT_INVOICE_TYPE ("vat_invoice_type","发票类型"), |
||||
VAT_INVOICE_TOTAL_NOTE ("vat_invoice_total_note","备注"), |
||||
VAT_INVOICE_CIPHER_FIELD ("vat_invoice_cipher_field","密码区"), |
||||
VAT_INVOICE_DRAWER ("vat_invoice_drawer","开票人"), |
||||
VAT_INVOICE_REVIEW ("vat_invoice_review","复核人"), |
||||
VAT_INVOICE_PAYEE ("vat_invoice_payee","收款人"), |
||||
EXIST_STAMPLE("exist_stample","盖章存在性判断"), |
||||
|
||||
VEHICLE_INVOICE_BUYER("vehicle_invoice_buyer","购买方名称"), |
||||
VEHICLE_INVOICE_BUYER_ID ("vehicle_invoice_buyer_id","购买方名称的身份证号码或组织机构代码"), |
||||
VEHICLE_INVOICE_CAR_MODEL ("vehicle_invoice_car_model","厂牌型号"), |
||||
VEHICLE_INVOICE_CAR_MADE_PLACE("vehicle_invoice_car_made_place","产地"), |
||||
VEHICLE_INVOICE_CERT_ID ("vehicle_invoice_cert_id","合格证号"), |
||||
VEHICLE_INVOICE_ENGINE_ID ("vehicle_invoice_engine_id","发动机号码"), |
||||
VEHICLE_INVOICE_CAR_VIN("vehicle_invoice_car_vin","车辆识别代号/车架号"), |
||||
VEHICLE_INVOICE_TOTAL_PRICE("vehicle_invoice_total_price","价税合计"), |
||||
VEHICLE_INVOICE_TOTAL_PRICE_DIGITS("vehicle_invoice_total_price_digits","价税合计小写"), |
||||
VEHICLE_INVOICE_PRICE_WITHOUT_TAX("VEHICLE_INVOICE_PRICE_WITHOUT_TAX","不含税价"), |
||||
VEHICLE_INVOICE_TAX_RATE("vehicle_invoice_tax_rate","税率"), |
||||
VEHICLE_INVOICE_TAX_AMOUNT ("vehicle_invoice_tax_amount","税额"), |
||||
VEHICLE_INVOICE_TELEPHONE ("vehicle_invoice_telephone","电话"), |
||||
VEHICLE_INVOICE_ISSUE_DATE("vehicle_invoice_issue_date","开票日期"), |
||||
VEHICLE_INVOICE_DAIMA("vehicle_invoice_daima","发票代码"), |
||||
VEHICLE_INVOICE_HAOMA("vehicle_invoice_haoma","发票号码"), |
||||
VEHICLE_INVOICE_DEALER("vehicle_invoice_dealer","销货单位"), |
||||
VEHICLE_INVOICE_JIDA_DAIMA ("vehicle_invoice_jida_daima","机打代码"), |
||||
VEHICLE_INVOICE_JIDA_HAOMA ("vehicle_invoice_jida_haoma","机打号码"), |
||||
VEHICLE_INVOICE_MACHINE_ID ("vehicle_invoice_machine_id","机器编码"), |
||||
VEHICLE_INVOICE_TAX_AUTHORITH_ID("vehicle_invoice_tax_authorith_id","主管税务代码"), |
||||
VEHICLE_INVOICE_TAX_AUTHORITH ("vehicle_invoice_tax_authorith","主管税务机关"), |
||||
VEHICLE_INVOICE_SELLER_BANK_NAME ("vehicle_invoice_seller_bank_name","开户银行"), |
||||
VEHICLE_INVOICE_SELLER_BANK_ACCOUNT("vehicle_invoice_seller_bank_account","账号"), |
||||
VEHICLE_INVOICE_SELLER_TAX_ID ("vehicle_invoice_seller_tax_id","纳税人识别号"), |
||||
VEHICLE_INVOICE_COMMODITY_INSPECTION_ID ("vehicle_invoice_commodity_inspection_id","商检单号"), |
||||
VEHICLE_INVOICE_IMPORT_CERTIFICATE_ID ("vehicle_invoice_import_certificate_id","进口证明书号"), |
||||
VEHICLE_INVOICE_SELLER_ADDRESS ("vehicle_invoice_seller_address","地址"), |
||||
|
||||
// vehicle_invoice_daima("vehicle_invoice_daima","购车发票代码"),
|
||||
// vehicle_invoice_haoma ("vehicle_invoice_haoma","购车发票号码"),
|
||||
// vehicle_invoice_buyer ("vehicle_invoice_buyer","购货单位(人)"),
|
||||
// vehicle_invoice_buyer_id ("vehicle_invoice_buyer_id","购买身份证号码/组织机构代码"),
|
||||
VEHICLE_INVOICE_BUYER_ADDR("vehicle_invoice_buyer_addr","购买方地址"), |
||||
VEHICLE_INVOICE_BUYER_PHONE ("vehicle_invoice_buyer_phone","购买方电话号码"), |
||||
VEHICLE_INVOICE_SELLER ("vehicle_invoice_seller","卖方单位(人)"), |
||||
VEHICLE_INVOICE_SELLER_ID ("vehicle_invoice_seller_id","买方身份证号码/组织机构代码"), |
||||
VEHICLE_INVOICE_SELLER_ADDR ("vehicle_invoice_seller_addr","卖方地址"), |
||||
VEHICLE_INVOICE_SELLER_PHONE ("vehicle_invoice_seller_phone","卖方电话号码"), |
||||
VEHICLE_INVOICE_PLATE_NUM ("vehicle_invoice_plate_num","车牌照号"), |
||||
VEHICLE_INVOICE_REGISTER_NUM("vehicle_invoice_register_num","登记证号"), |
||||
VEHICLE_INVOICE_VEHICLE_TYPE ("vehicle_invoice_vehicle_type","车辆类型"), |
||||
VEHICLE_INVOICE_VIN ("vehicle_invoice_vin","车架号/车辆识别代码"), |
||||
// vehicle_invoice_car_model("vehicle_invoice_car_model","厂牌型号"),
|
||||
VEHICLE_INVOICE_DMV("vehicle_invoice_dmv","转入地车辆管理所名称"), |
||||
VEHICLE_INVOICE_PRICE_TOTAL_PRICE ("vehicle_invoice_price_total_price","价税合计"), |
||||
// vehicle_invoice_total_price_digits ("vehicle_invoice_total_price_digits","价税合计小写"),
|
||||
VEHICLE_INVOICE_AUCTION_HOUSE ("vehicle_invoice_auction_house","经营、拍卖单位"), |
||||
VEHICLE_INVOICE_AUCTION_HOUSE_ADDR("vehicle_invoice_auction_house_addr","经营、拍卖单位地址"), |
||||
VEHICLE_INVOICE_AUCTION_HOUSE_TAX_ID ("vehicle_invoice_auction_house_tax_id","经营、拍卖单位纳税人识别号"), |
||||
VEHICLE_INVOICE_AUCTION_HOUSE_BANK_ACCOUNT ("vehicle_invoice_auction_house_bank_account","经营、拍卖单位开户银行、账号"), |
||||
VEHICLE_INVOICE_AUCTION_HOUSE_PHONE ("vehicle_invoice_auction_house_phone","经营、拍卖单位电话"), |
||||
VEHICLE_INVOICE_MARKET ("vehicle_invoice_market","二手车市场"), |
||||
VEHICLE_INVOICE_MARKET_ADDR ("vehicle_invoice_market_addr","二手车市场地址"), |
||||
VEHICLE_INVOICE_MARKET_TAX_ID ("vehicle_invoice_market_tax_id","二手车市场纳税人识别号"), |
||||
VEHICLE_INVOICE_MARKET_BANK_ACOUNT ("vehicle_invoice_market_bank_acount","二手车市场开户银行、账号"), |
||||
VEHICLE_INVOICE_MARKET_PHONE ("vehicle_invoice_market_phone","二手车市场电话"), |
||||
VEHICLE_INVOICE_NOTE ("vehicle_invoice_note","备注"), |
||||
// vehicle_invoice_issue_date ("vehicle_invoice_issue_date","购车发票开票日期"),
|
||||
|
||||
INVOICE_HEAD("invoice_head","发票票头"), |
||||
INVOICE_NUMBER("invoice_number","发票号码"), |
||||
INVOICE_CODE("invoice_code","发票代码"), |
||||
MACHINE_NUMBER ("machine_number","机器号码"), |
||||
MACHINE_CODE ("machine_code","机器编码"), |
||||
TOTAL_MONEY("total_money","合计金额(小写)"), |
||||
TOTAL_MONEY_BIG ("total_money_big","合计金额(大写)"), |
||||
DATE_OF_INVOICE ("date_of_invoice","开票日期"), |
||||
CHECK_NUMBER ("check_number","校验码"), |
||||
BUY_NAME("buy_name","购方名称"), |
||||
BUY_TAX_NUMBER("buy_tax_number","购方纳税人识别号"), |
||||
SOLD_NAME ("sold_name","销方名称"), |
||||
SOLD_TAX_NUMBER ("sold_tax_number","销方纳税人识别号"), |
||||
CASHIER_NAME ("cashier_name","收款员"), |
||||
|
||||
QUOTA_INVOICE_CODE("quota_invoice_code","发票代码"), |
||||
QUOTA_INVOICE_NUMBER ("quota_invoice_number","发票号码"), |
||||
MONEY_SMALL ("money_small","金额(小写)"), |
||||
MONEY_BIG ("money_big","金额(大写)"), |
||||
LOCATION ("location","发票所在地"), |
||||
|
||||
// invoice_code ("invoice_code","发票代码"),
|
||||
INVOICE_NO ("invoice_no","发票号码"), |
||||
DATE ("date","日期"), |
||||
TAXI_NO ("taxi_no","车号"), |
||||
BOARDING_TIME("boarding_time","上车时间"), |
||||
LANDING_TIME ("landing_time","下车时间"), |
||||
MILEAGE ("mileage","里程"), |
||||
SUM ("sum","金额"), |
||||
// location ("location","发票所在地"),
|
||||
|
||||
PASSENGER_NAME ("passenger_name","旅客姓名"), |
||||
ID_NO ("id_no","身份证件号码"), |
||||
SERIAL_NUMBER ("serial_number","印刷序号"), |
||||
TOTAL("total","合计金额"), |
||||
FARE ("fare","票价"), |
||||
CIVIL_AVIATION_FUND ("civil_aviation_fund","民航发展基金"), |
||||
FUEL_SURCHARGE ("fuel_surcharge","燃油附加费"), |
||||
OTHER_TAXES("other_taxes","其他税费"), |
||||
ISSUED_DATE ("issued_date","填开日期"), |
||||
ISSUED_BY ("issued_by","填开单位"), |
||||
E_TICKET_NO ("e_ticket_no","电子客票号码"), |
||||
INSURANCE ("insurance","保险费"), |
||||
|
||||
// passenger_name("passenger_name","乘客名称"),
|
||||
PASSENGER_ID("passenger_id","乘客身份证"), |
||||
TRAIN_NUMBER ("train_number","车次号"), |
||||
DEPARTURE_STATION ("departure_station","出发地"), |
||||
DEPARTURE_DATE ("departure_date","乘车时间"), |
||||
//TODO
|
||||
CLASS ("class","座位类别"), |
||||
TICKET_NUMBER ("ticket_number","火车票红色编码"), |
||||
ARRIVAL_STATION ("arrival_station","目的地"), |
||||
SEAT_NUMBER ("seat_number","座位号"), |
||||
PRICE ("price","价格"), |
||||
CHECK ("check","检票口"), |
||||
TICKET_ID ("ticket_id","火车票ID"), |
||||
|
||||
|
||||
|
||||
// invoice_code ("invoice_code","发票代码"),
|
||||
// invoice_number ("invoice_number","发票号码"),
|
||||
MONEY ("money","金额"), |
||||
// date ("date","日期"),
|
||||
TIME ("time","时间"), |
||||
TOLL_CODE ("toll_code","车辆通行费代码"), |
||||
TOLL_NUMBER ("toll_number","车辆通行费号码"), |
||||
|
||||
|
||||
// invoice_number ("invoice_number","发票号码"),
|
||||
// money ("money","金额"),
|
||||
|
||||
; |
||||
private String key; |
||||
|
||||
private String value; |
||||
|
||||
public String getKey() { |
||||
return key; |
||||
} |
||||
} |
@ -0,0 +1,13 @@ |
||||
package com.dxhy.core.service.openservice.model.ocr; |
||||
|
||||
import lombok.Data; |
||||
|
||||
import java.util.List; |
||||
|
||||
@Data |
||||
public class OcrItemListEntity { |
||||
private String value; |
||||
private String description; |
||||
private String key; |
||||
private List<Integer> position; |
||||
} |
@ -0,0 +1,12 @@ |
||||
package com.dxhy.core.service.openservice.model.ocr; |
||||
|
||||
import lombok.Data; |
||||
|
||||
import java.util.List; |
||||
|
||||
@Data |
||||
public class OcrProductListEntity { |
||||
private String description; |
||||
private String key; |
||||
private String value; |
||||
} |
@ -0,0 +1,15 @@ |
||||
package com.dxhy.core.service.openservice.model.ocr; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty; |
||||
import lombok.Data; |
||||
|
||||
@Data |
||||
public class OcrResponseVo { |
||||
|
||||
|
||||
private OcrResultEntity result; |
||||
@JsonProperty("cost_time") |
||||
private int costTime; |
||||
private int code; |
||||
private String message; |
||||
} |
@ -0,0 +1,14 @@ |
||||
package com.dxhy.core.service.openservice.model.ocr; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty; |
||||
import lombok.Data; |
||||
|
||||
import java.util.List; |
||||
|
||||
@Data |
||||
public class OcrResultEntity { |
||||
|
||||
@JsonProperty("object_list") |
||||
private List<OcrDataListEntity> objectList; |
||||
|
||||
} |
@ -0,0 +1,120 @@ |
||||
package com.dxhy.core.task; |
||||
|
||||
|
||||
import com.dxhy.core.job.service.ScheduleJobService; |
||||
import com.dxhy.core.util.EmailParseUtils; |
||||
import com.sun.mail.pop3.POP3Folder; |
||||
import lombok.SneakyThrows; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springframework.stereotype.Component; |
||||
|
||||
import javax.annotation.Resource; |
||||
import javax.mail.*; |
||||
import javax.mail.internet.MimeMessage; |
||||
import java.util.Date; |
||||
import java.util.Properties; |
||||
|
||||
|
||||
@Component("snEmailGatherTask") |
||||
@Slf4j |
||||
public class SnEmailGatherTask { |
||||
|
||||
@Resource |
||||
private ScheduleJobService scheduleJobService; |
||||
|
||||
|
||||
public void mailGatherTask(){ |
||||
//进行邮件采集
|
||||
|
||||
|
||||
} |
||||
|
||||
|
||||
|
||||
@SneakyThrows |
||||
public static void main(String[] args) { |
||||
|
||||
//邮件接收协议
|
||||
String mail_protocol = "mail.store.protocol"; |
||||
//邮件接收协议类型
|
||||
String mail_protocol_type2 = "pop3"; |
||||
String mail_protocol_type = "pop"; |
||||
|
||||
//邮件接收服务器端口
|
||||
String mail_port = "mail.pop3.port"; |
||||
//邮件接收服务器端口
|
||||
String port = "110"; |
||||
//邮件接收服务器地址
|
||||
String mail_host = "mail.pop3.host"; |
||||
String emailName = "1149953701@qq.com"; |
||||
String password = "pmdzleyabmlzgdhc"; |
||||
|
||||
String mailSuffix = emailName.split("@")[1]; |
||||
//邮箱类型
|
||||
String mailType = mailSuffix.split("\\.")[0]; |
||||
Properties props = new Properties(); |
||||
if(mailType.equalsIgnoreCase("qq")){ |
||||
//qq邮箱
|
||||
props.setProperty(mail_protocol, mail_protocol_type2); // 协议
|
||||
props.setProperty(mail_host, mail_protocol_type+"."+mailSuffix); // pop3服务器
|
||||
props.setProperty(mail_port, port); // 端口
|
||||
}else { |
||||
props.setProperty(mail_protocol, mail_protocol_type2); // 协议
|
||||
props.setProperty(mail_host, mail_protocol_type2+"."+mailSuffix); // pop3服务器
|
||||
props.setProperty(mail_port, port); // 端口
|
||||
} |
||||
Session session = Session.getInstance(props); |
||||
Store store = session.getStore("pop3"); |
||||
|
||||
//连接邮箱服务器
|
||||
store.connect(emailName, password); |
||||
//获取当前时间
|
||||
Date currentTime = new Date(); |
||||
// 获得收件箱 pop3协议只有一个有效的文件夹就是INBOX
|
||||
Folder folder = store.getFolder("INBOX"); |
||||
//获取邮件列表
|
||||
folder.open(Folder.READ_WRITE); |
||||
|
||||
// 由于POP3协议无法获知邮件的状态,所以getUnreadMessageCount得到的是收件箱的邮件总数
|
||||
System.out.println("未读邮件数: " + folder.getUnreadMessageCount()); |
||||
|
||||
// 由于POP3协议无法获知邮件的状态,所以下面得到的结果始终都是为0
|
||||
System.out.println("删除邮件数: " + folder.getDeletedMessageCount()); |
||||
System.out.println("新邮件: " + folder.getNewMessageCount()); |
||||
|
||||
// 获得收件箱中的邮件总数
|
||||
System.out.println("邮件总数: " + folder.getMessageCount()); |
||||
|
||||
Message[] messages = folder.getMessages(); |
||||
for (int i = 0, count = messages.length; i < count; i++) { |
||||
MimeMessage msg = (MimeMessage) messages[i]; |
||||
System.out.println("------------------解析第" + msg.getMessageNumber() + "封邮件-------------------- "); |
||||
System.out.println("主题: " + EmailParseUtils.getSubject(msg)); |
||||
System.out.println("发件人: " + EmailParseUtils.getFrom(msg)); |
||||
System.out.println("收件人:" + EmailParseUtils.getReceiveAddress(msg, null)); |
||||
System.out.println("发送时间:" + EmailParseUtils.getSentDate(msg, null)); |
||||
System.out.println("是否已读:" + EmailParseUtils.isSeen(msg)); |
||||
System.out.println("邮件优先级:" + EmailParseUtils.getPriority(msg)); |
||||
System.out.println("是否需要回执:" + EmailParseUtils.isReplySign(msg)); |
||||
System.out.println("邮件大小:" + msg.getSize() * 1024 + "kb"); |
||||
boolean isContainerAttachment = EmailParseUtils.isContainAttachment(msg); |
||||
POP3Folder inbox = (POP3Folder) folder; |
||||
String uid = inbox.getUID(msg); |
||||
System.out.println("uid: ------------------" + uid); |
||||
Flags flags = msg.getFlags(); |
||||
if (!flags.contains(Flags.Flag.SEEN)) { |
||||
//设置为已读
|
||||
msg.setFlag(Flags.Flag.SEEN, true); |
||||
} |
||||
System.out.println(""); |
||||
} |
||||
System.out.println(""); |
||||
|
||||
Date endTime = new Date(); |
||||
//计算耗时时间
|
||||
// double elapsedTime = CalendarUtil.arithDateTime(endTime, currentTime);
|
||||
// 释放资源
|
||||
folder.close(false); // false为不更新邮件,true为更新,一般在删除邮件后使用
|
||||
store.close(); |
||||
} |
||||
} |
@ -0,0 +1,313 @@ |
||||
package com.dxhy.core.util; |
||||
|
||||
import javax.mail.*; |
||||
import javax.mail.internet.InternetAddress; |
||||
import javax.mail.internet.MimeMessage; |
||||
import javax.mail.internet.MimeMultipart; |
||||
import javax.mail.internet.MimeUtility; |
||||
import java.io.*; |
||||
import java.text.SimpleDateFormat; |
||||
import java.util.Date; |
||||
|
||||
public class EmailParseUtils { |
||||
|
||||
/** |
||||
* 解析邮件 |
||||
* |
||||
* @param messages 要解析的邮件列表 |
||||
*/ |
||||
public static void deleteMessage(Message... messages) throws MessagingException, IOException { |
||||
if (messages == null || messages.length < 1) |
||||
throw new MessagingException("未找到要解析的邮件!"); |
||||
|
||||
// 解析所有邮件
|
||||
for (int i = 0, count = messages.length; i < count; i++) { |
||||
|
||||
/** |
||||
* 邮件删除 |
||||
*/ |
||||
Message message = messages[i]; |
||||
String subject = message.getSubject(); |
||||
// set the DELETE flag to true
|
||||
message.setFlag(Flags.Flag.DELETED, true); |
||||
System.out.println("Marked DELETE for message: " + subject); |
||||
|
||||
|
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 获得邮件主题 |
||||
* |
||||
* @param msg 邮件内容 |
||||
* @return 解码后的邮件主题 |
||||
*/ |
||||
public static String getSubject(MimeMessage msg) throws UnsupportedEncodingException, MessagingException { |
||||
return MimeUtility.decodeText(msg.getSubject()); |
||||
} |
||||
|
||||
/** |
||||
* 获得邮件发件人 |
||||
* |
||||
* @param msg 邮件内容 |
||||
* @return 姓名 <Email地址> |
||||
* @throws MessagingException |
||||
* @throws UnsupportedEncodingException |
||||
*/ |
||||
public static String getFrom(MimeMessage msg) throws MessagingException, UnsupportedEncodingException { |
||||
String from = ""; |
||||
Address[] froms = msg.getFrom(); |
||||
if (froms.length < 1) |
||||
throw new MessagingException("没有发件人!"); |
||||
|
||||
InternetAddress address = (InternetAddress) froms[0]; |
||||
String person = address.getPersonal(); |
||||
if (person != null) { |
||||
person = MimeUtility.decodeText(person) + " "; |
||||
} else { |
||||
person = ""; |
||||
} |
||||
from = person + "<" + address.getAddress() + ">"; |
||||
|
||||
return from; |
||||
} |
||||
|
||||
/** |
||||
* 根据收件人类型,获取邮件收件人、抄送和密送地址。如果收件人类型为空,则获得所有的收件人 |
||||
* <p>Message.RecipientType.TO 收件人</p> |
||||
* <p>Message.RecipientType.CC 抄送</p> |
||||
* <p>Message.RecipientType.BCC 密送</p> |
||||
* |
||||
* @param msg 邮件内容 |
||||
* @param type 收件人类型 |
||||
* @return 收件人1 <邮件地址1>, 收件人2 <邮件地址2>, ... |
||||
* @throws MessagingException |
||||
*/ |
||||
public static String getReceiveAddress(MimeMessage msg, Message.RecipientType type) throws MessagingException { |
||||
StringBuffer receiveAddress = new StringBuffer(); |
||||
Address[] addresss = null; |
||||
if (type == null) { |
||||
addresss = msg.getAllRecipients(); |
||||
} else { |
||||
addresss = msg.getRecipients(type); |
||||
} |
||||
|
||||
if (addresss == null || addresss.length < 1) |
||||
throw new MessagingException("没有收件人!"); |
||||
for (Address address : addresss) { |
||||
InternetAddress internetAddress = (InternetAddress) address; |
||||
receiveAddress.append(internetAddress.toUnicodeString()).append(","); |
||||
} |
||||
|
||||
receiveAddress.deleteCharAt(receiveAddress.length() - 1); //删除最后一个逗号
|
||||
|
||||
return receiveAddress.toString(); |
||||
} |
||||
|
||||
/** |
||||
* 获得邮件发送时间 |
||||
* |
||||
* @param msg 邮件内容 |
||||
* @return yyyy年mm月dd日 星期X HH:mm |
||||
* @throws MessagingException |
||||
*/ |
||||
public static String getSentDate(MimeMessage msg, String pattern) throws MessagingException { |
||||
Date receivedDate = msg.getSentDate(); |
||||
if (receivedDate == null) |
||||
return ""; |
||||
|
||||
if (pattern == null || "".equals(pattern)) |
||||
pattern = "yyyy年MM月dd日 E HH:mm "; |
||||
|
||||
return new SimpleDateFormat(pattern).format(receivedDate); |
||||
} |
||||
|
||||
/** |
||||
* 判断邮件中是否包含附件 |
||||
* <p> |
||||
* //* @param msg 邮件内容
|
||||
* |
||||
* @return 邮件中存在附件返回true,不存在返回false |
||||
* @throws MessagingException |
||||
* @throws IOException |
||||
*/ |
||||
public static boolean isContainAttachment(Part part) throws MessagingException, IOException { |
||||
boolean flag = false; |
||||
if (part.isMimeType("multipart/*")) { |
||||
MimeMultipart multipart = (MimeMultipart) part.getContent(); |
||||
int partCount = multipart.getCount(); |
||||
for (int i = 0; i < partCount; i++) { |
||||
BodyPart bodyPart = multipart.getBodyPart(i); |
||||
String disp = bodyPart.getDisposition(); |
||||
if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) { |
||||
flag = true; |
||||
} else if (bodyPart.isMimeType("multipart/*")) { |
||||
flag = isContainAttachment(bodyPart); |
||||
} else { |
||||
String contentType = bodyPart.getContentType(); |
||||
if (contentType.indexOf("application") != -1) { |
||||
flag = true; |
||||
} |
||||
|
||||
if (contentType.indexOf("name") != -1) { |
||||
flag = true; |
||||
} |
||||
} |
||||
|
||||
if (flag) break; |
||||
} |
||||
} else if (part.isMimeType("message/rfc822")) { |
||||
flag = isContainAttachment((Part) part.getContent()); |
||||
} |
||||
return flag; |
||||
} |
||||
|
||||
/** |
||||
* 判断邮件是否已读 |
||||
* |
||||
* @param msg 邮件内容 |
||||
* @return 如果邮件已读返回true, 否则返回false |
||||
* @throws MessagingException |
||||
*/ |
||||
public static boolean isSeen(MimeMessage msg) throws MessagingException { |
||||
return msg.getFlags().contains(Flags.Flag.SEEN); |
||||
} |
||||
|
||||
/** |
||||
* 判断邮件是否需要阅读回执 |
||||
* |
||||
* @param msg 邮件内容 |
||||
* @return 需要回执返回true, 否则返回false |
||||
* @throws MessagingException |
||||
*/ |
||||
public static boolean isReplySign(MimeMessage msg) throws MessagingException { |
||||
boolean replySign = false; |
||||
String[] headers = msg.getHeader("Disposition-Notification-To"); |
||||
if (headers != null) |
||||
replySign = true; |
||||
return replySign; |
||||
} |
||||
|
||||
/** |
||||
* 获得邮件的优先级 |
||||
* |
||||
* @param msg 邮件内容 |
||||
* @return 1(High):紧急 3:普通(Normal) 5:低(Low) |
||||
* @throws MessagingException |
||||
*/ |
||||
public static String getPriority(MimeMessage msg) throws MessagingException { |
||||
String priority = "普通"; |
||||
String[] headers = msg.getHeader("X-Priority"); |
||||
if (headers != null) { |
||||
String headerPriority = headers[0]; |
||||
if (headerPriority.indexOf("1") != -1 || headerPriority.indexOf("High") != -1) |
||||
priority = "紧急"; |
||||
else if (headerPriority.indexOf("5") != -1 || headerPriority.indexOf("Low") != -1) |
||||
priority = "低"; |
||||
else |
||||
priority = "普通"; |
||||
} |
||||
return priority; |
||||
} |
||||
|
||||
/** |
||||
* 获得邮件文本内容 |
||||
* |
||||
* @param part 邮件体 |
||||
* @param content 存储邮件文本内容的字符串 |
||||
* @throws MessagingException |
||||
* @throws IOException |
||||
*/ |
||||
public static void getMailTextContent(Part part, StringBuffer content) throws MessagingException, IOException { |
||||
//如果是文本类型的附件,通过getContent方法可以取到文本内容,但这不是我们需要的结果,所以在这里要做判断
|
||||
boolean isContainTextAttach = part.getContentType().indexOf("name") > 0; |
||||
if (part.isMimeType("text/*") && !isContainTextAttach) { |
||||
content.append(part.getContent().toString()); |
||||
} else if (part.isMimeType("message/rfc822")) { |
||||
getMailTextContent((Part) part.getContent(), content); |
||||
} else if (part.isMimeType("multipart/*")) { |
||||
Multipart multipart = (Multipart) part.getContent(); |
||||
int partCount = multipart.getCount(); |
||||
for (int i = 0; i < partCount; i++) { |
||||
BodyPart bodyPart = multipart.getBodyPart(i); |
||||
getMailTextContent(bodyPart, content); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 保存附件 |
||||
* |
||||
* @param part 邮件中多个组合体中的其中一个组合体 |
||||
* @param destDir 附件保存目录 |
||||
* @throws UnsupportedEncodingException |
||||
* @throws MessagingException |
||||
* @throws FileNotFoundException |
||||
* @throws IOException |
||||
*/ |
||||
public static void saveAttachment(Part part, String destDir) throws UnsupportedEncodingException, MessagingException, |
||||
FileNotFoundException, IOException { |
||||
if (part.isMimeType("multipart/*")) { |
||||
Multipart multipart = (Multipart) part.getContent(); //复杂体邮件
|
||||
//复杂体邮件包含多个邮件体
|
||||
int partCount = multipart.getCount(); |
||||
for (int i = 0; i < partCount; i++) { |
||||
//获得复杂体邮件中其中一个邮件体
|
||||
BodyPart bodyPart = multipart.getBodyPart(i); |
||||
//某一个邮件体也有可能是由多个邮件体组成的复杂体
|
||||
String disp = bodyPart.getDisposition(); |
||||
if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) { |
||||
InputStream is = bodyPart.getInputStream(); |
||||
saveFile(is, destDir, decodeText(bodyPart.getFileName())); |
||||
} else if (bodyPart.isMimeType("multipart/*")) { |
||||
saveAttachment(bodyPart, destDir); |
||||
} else { |
||||
String contentType = bodyPart.getContentType(); |
||||
if (contentType.indexOf("name") != -1 || contentType.indexOf("application") != -1) { |
||||
saveFile(bodyPart.getInputStream(), destDir, decodeText(bodyPart.getFileName())); |
||||
} |
||||
} |
||||
} |
||||
} else if (part.isMimeType("message/rfc822")) { |
||||
saveAttachment((Part) part.getContent(), destDir); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 读取输入流中的数据保存至指定目录 |
||||
* |
||||
* @param is 输入流 |
||||
* @param fileName 文件名 |
||||
* @param destDir 文件存储目录 |
||||
* @throws FileNotFoundException |
||||
* @throws IOException |
||||
*/ |
||||
private static void saveFile(InputStream is, String destDir, String fileName) |
||||
throws FileNotFoundException, IOException { |
||||
BufferedInputStream bis = new BufferedInputStream(is); |
||||
BufferedOutputStream bos = new BufferedOutputStream( |
||||
new FileOutputStream(new File(destDir + fileName))); |
||||
int len = -1; |
||||
while ((len = bis.read()) != -1) { |
||||
bos.write(len); |
||||
bos.flush(); |
||||
} |
||||
bos.close(); |
||||
bis.close(); |
||||
} |
||||
|
||||
/** |
||||
* 文本解码 |
||||
* |
||||
* @param encodeText 解码MimeUtility.encodeText(String text)方法编码后的文本 |
||||
* @return 解码后的文本 |
||||
* @throws UnsupportedEncodingException |
||||
*/ |
||||
public static String decodeText(String encodeText) throws UnsupportedEncodingException { |
||||
if (encodeText == null || "".equals(encodeText)) { |
||||
return ""; |
||||
} else { |
||||
return MimeUtility.decodeText(encodeText); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,43 @@ |
||||
package com.dxhy.sign.config; |
||||
|
||||
|
||||
import lombok.Data; |
||||
import org.springframework.beans.factory.annotation.Value; |
||||
import org.springframework.context.annotation.Configuration; |
||||
|
||||
@Data |
||||
@Configuration |
||||
public class BaseServiceConfig { |
||||
|
||||
/** |
||||
* 客户自定义邮件配置-发件人邮箱地址 |
||||
*/ |
||||
@Value("${email.customer.sendAddress:}") |
||||
private String sendAddress; |
||||
/** |
||||
* 客户自定义邮件配置-第三方支持授权码(126和163以及qq邮箱都需要授权码登录,没有授权码的直接登录网页版邮箱设置里设置) |
||||
* 如果是其他企业邮箱,直接使用邮箱登录密码 |
||||
*/ |
||||
@Value("${email.customer.authPassword:}") |
||||
private String authPassword; |
||||
/** |
||||
* 客户自定义邮件配置-发件人名称 |
||||
*/ |
||||
@Value("${email.customer.sendName:}") |
||||
private String sendName; |
||||
/** |
||||
* 客户自定义邮件配置-邮件服务器 |
||||
*/ |
||||
@Value("${email.customer.smtpServer:}") |
||||
private String smtpServer; |
||||
|
||||
/** |
||||
* 客户自定义邮件配置-邮件服务器端口 |
||||
*/ |
||||
@Value("${email.customer.sslPort:}") |
||||
private String sslPort; |
||||
|
||||
|
||||
|
||||
|
||||
} |
@ -0,0 +1,153 @@ |
||||
//package com.dxhy.sign.config;
|
||||
//
|
||||
//import com.alibaba.excel.metadata.CellData;
|
||||
//import com.alibaba.excel.metadata.Head;
|
||||
//import com.alibaba.excel.write.handler.CellWriteHandler;
|
||||
//import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
|
||||
//import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
|
||||
//import org.apache.poi.hssf.usermodel.HSSFDataFormat;
|
||||
//import org.apache.poi.ss.usermodel.*;
|
||||
//
|
||||
//import java.util.List;
|
||||
//
|
||||
///**
|
||||
// * Created by IntelliJ IDEA.
|
||||
// *
|
||||
// * @author: zhenghaiyang
|
||||
// * Date: 2021/12/22 0022
|
||||
// * Description:
|
||||
// */
|
||||
//public class ExcelConverter implements CellWriteHandler{
|
||||
//
|
||||
//
|
||||
// @Override
|
||||
// public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {
|
||||
// System.out.println();
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {
|
||||
//
|
||||
// //当前行的第i列
|
||||
// // int i = cell.getColumnIndex();
|
||||
// //不处理第一行
|
||||
// if (0 != cell.getRowIndex()) {
|
||||
// if (2 == cell.getColumnIndex()) {
|
||||
// Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
|
||||
// CellStyle cellStyle = workbook.createCellStyle();
|
||||
// DataFormat dataFormat = workbook.createDataFormat();
|
||||
// cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
|
||||
// cell.setCellStyle(cellStyle);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// //加@Override会报错
|
||||
// public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {
|
||||
//
|
||||
// System.out.println();
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
|
||||
// CellStyle cellStyle = cell.getSheet().getWorkbook().createCellStyle();
|
||||
// final CellType cellType = cell.getCellType();
|
||||
//
|
||||
// if(CellType.NUMERIC.equals(cellType)){
|
||||
// final double cellValue = cell.getNumericCellValue();
|
||||
// final String valueOf = String.valueOf(cellValue);
|
||||
// //判断data是否为数值型
|
||||
// Boolean isNum = valueOf.matches("^(-?\\d+)(\\.\\d+)?$");
|
||||
// //判断data是否为整数(小数部分是否为0)
|
||||
// Boolean isInteger=valueOf.matches("^(\\-)?\\d+(\\.\\d{1,2})$");
|
||||
// //判断data是否为百分数(是否包含“%”)
|
||||
// Boolean isPercent=valueOf.matches("^(\\-)?\\d+(\\.\\d{8})$");
|
||||
// if(isNum){
|
||||
// if(isInteger){
|
||||
// DataFormat dataFormat = cell.getSheet().getWorkbook().createDataFormat();
|
||||
// cellStyle.setDataFormat(dataFormat.getFormat("0.00_ "));
|
||||
// cell.setCellStyle(cellStyle);
|
||||
// }else {
|
||||
// DataFormat dataFormat = cell.getSheet().getWorkbook().createDataFormat();
|
||||
// cellStyle.setDataFormat(dataFormat.getFormat("0.00000000_ "));
|
||||
// cell.setCellStyle(cellStyle);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
////
|
||||
//// @Override
|
||||
//// public Class supportJavaTypeKey(){
|
||||
//// return Double.class;
|
||||
//// }
|
||||
////
|
||||
//// @Override
|
||||
//// public CellDataTypeEnum supportExcelTypeKey(){
|
||||
//// return CellDataTypeEnum.STRING;
|
||||
//// }
|
||||
////
|
||||
//// @Override
|
||||
//// public Object convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception{
|
||||
////
|
||||
//// return null;
|
||||
//// }
|
||||
////
|
||||
//// @Override
|
||||
//// public CellData convertToExcelData(Object o, ExcelContentProperty excelContentProperty,
|
||||
//// GlobalConfiguration globalConfiguration) throws Exception{
|
||||
//// try{
|
||||
//// if(o != null){
|
||||
////
|
||||
//// final CellData cellData = new CellData(CellDataTypeEnum.NUMBER);
|
||||
//// cellData.setDataFormatString("##,##0.00");
|
||||
//// cellData.setNumberValue(new BigDecimal(String.valueOf(o)));
|
||||
//// return cellData;
|
||||
//// }
|
||||
//// }catch(NumberFormatException e){
|
||||
//// e.printStackTrace();
|
||||
//// }
|
||||
//// return null;
|
||||
//// }
|
||||
//
|
||||
////
|
||||
//// @Override
|
||||
//// public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
|
||||
//// Head head, Integer integer, Integer integer1, Boolean aBoolean){
|
||||
////
|
||||
//// }
|
||||
////
|
||||
//// @Override
|
||||
//// public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,
|
||||
//// Head head, Integer integer, Boolean aBoolean){
|
||||
////
|
||||
//// }
|
||||
////
|
||||
//// @Override
|
||||
//// public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean){
|
||||
////
|
||||
//// }
|
||||
//
|
||||
//// @Override
|
||||
//// public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
|
||||
//// CellStyle cellStyle = cell.getSheet().getWorkbook().createCellStyle();
|
||||
//// cellStyle.setFillForegroundColor(IndexedColors.SKY_BLUE.index);
|
||||
//// cellStyle.setFillBackgroundColor(IndexedColors.WHITE.index);
|
||||
//// cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
||||
////
|
||||
//// cellStyle.setBorderLeft(BorderStyle.THIN);
|
||||
//// cellStyle.setBorderTop(BorderStyle.THIN);
|
||||
//// cellStyle.setBorderRight(BorderStyle.THIN);
|
||||
//// cellStyle.setBorderBottom(BorderStyle.THIN);
|
||||
////
|
||||
//// DataFormat dataFormat = cell.getSheet().getWorkbook().createDataFormat();
|
||||
//// cellStyle.setDataFormat(dataFormat.getFormat("##,##0.00"));
|
||||
//// cell.setCellStyle(cellStyle);
|
||||
//// }
|
||||
////
|
||||
//// public CellStyle getStyles(boolean noneStyler, ExcelExportEntity entity) {
|
||||
//// if(entity != null && ){
|
||||
////
|
||||
//// }
|
||||
//// }
|
||||
//}
|
Loading…
Reference in new issue