[英]sending mail with multiple embedded images using MimeMultipart, Java 8
I'm trying to send mails with multiple images embedded into the body.... I was reding this Sending mail along with embedded image using javamail , but unfortunately I can't get works我试图发送带有嵌入全身多处图像....我雷丁此邮件一起嵌入图像使用JavaMail发送邮件,但遗憾的是我不能让作品
Creating the Message创建消息
javax.mail.Message message = new javax.mail.internet.MimeMessage(Session.getInstance(mailingSettings.getProperties()));
message.setFrom(new InternetAddress(mailingSettings.getCorreoOrigen(), mailingSettings.getNombreOrigen()));
message.setSentDate(new Date());
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(mailDTO.getCorreoDestino()));
message.addHeader("Content-type", "text/HTML; charset=iso-8859-1");
message.addHeader("Content-Transfer-Encoding", "8bit");
message.setSubject(mailDTO.getAsunto() + mailDTO.getCodigoDocumento() + "-sendOneMail");
Now I create Multipart现在我创建 Multipart
MimeMultipart multipart = new MimeMultipart();
// Ini Add the Body
BodyPart mimeBodyPart = new PreencodedMimeBodyPart("8bit");
mimeBodyPart.setContent(contenidoCorreo /*The HTML with multiple images*/, "text/html");
multipart.addBodyPart(mimeBodyPart);
// End Add the Body
addImages2(mailDTO, multipart, contenidoCorreo);
try {
message.setContent(multipart); //Add the Multipart to the Message
Transport.send(message); //Send the Message
} catch (Exception e) {
e.printStackTrace();
throw e;
}
Now the method to Add Images to the Multipart现在是将图像添加到 Multipart 的方法
private void addImages2(MailDTO mailDTO, final Multipart multipart, String contenidoCorreo) throws Exception {
//Check the 'cid' words and get the image names....
Set<String> setImagenes = Arrays.stream(contenidoCorreo.split("cid:")).collect(Collectors.toSet());
setImagenes.stream().forEach(stringCid -> {
String imagenCid = (stringCid.split("\""))[0];
String pathImage = /path/to/Images/Directory + "/" + imagenCid;
if (new File(pathImage).exists()) {
BodyPart imagenMimeBodyPart = new MimeBodyPart();
try {
DataSource source = new FileDataSource(pathImage);
imagenMimeBodyPart.setDataHandler(new DataHandler(source));
imagenMimeBodyPart.setFileName(imagenCid);
imagenMimeBodyPart.setHeader("Content-ID", imagenCid);
multipart.addBodyPart(imagenMimeBodyPart);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
All images are sent like atachment, but not inserted into HTML .所有图像都像附件一样发送,但不会插入到 HTML 中。
Now, I will compare the Content Message using Successfully Telnet method...现在,我将使用成功的 Telnet 方法比较内容消息...
In the Left Side using Telnet directly method, in the rigth Side my Java code.在左侧使用 Telnet 直接方法,在右侧我的 Java 代码。
Comparing the inital snippet with the HTML Body Content将初始片段与 HTML 正文内容进行比较
Comparing the final snippet of HTML Body Content
比较 HTML 正文内容的最终片段
Some part of the images separation using Telnet Method on left Side
左侧使用Telnet方法分离部分图像
The final part using Telnet Method!
最后一部分使用 Telnet 方法!
The Email with attached images附有图片的电子邮件
How fix my code in order to show the images inserted in my HTML code and that the images are displayed too?如何修复我的代码以显示插入到我的 HTML 代码中的图像并显示图像?
I extended the java mail class to add and read attachments, you will have to modify the code for your purposes, but it will attach a file to the email.我扩展了 java 邮件类来添加和读取附件,您必须根据自己的目的修改代码,但它会将文件附加到电子邮件中。 I do think that you cannot attach a raw binary image, it has to be converted to base64 inline encoding prior to being sent.
我确实认为您不能附加原始二进制图像,它必须在发送之前转换为 base64 内联编码。 and decoded when received.
并在收到时解码。
public class Mail extends javax.mail.Authenticator {
private String _user;
private String _pass;
private String[] _to;
private String _from;
private String _port;
private String _sport;
private String _host;
private String _subject;
private String _body;
private boolean _auth;
private boolean _debuggable;
private Multipart _multipart;
public Mail() {
_host = "smtp.gmail.com"; // default smtp server
_port = "465"; // default smtp port
_sport = "465"; // default socketfactory port
_user = ""; // username
_pass = ""; // password
_from = ""; // email sent from
_subject = ""; // email subject
_body = ""; // email body
_debuggable = false; // debug mode on or off - default off
_auth = true; // smtp authentication - default on
_multipart = new MimeMultipart();
// There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added.
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(mc);
}
public Mail(String user, String pass) {
this();
_user = user;
_pass = pass;
}
public String GetMail(){
try {
Properties props = System.getProperties();
String mailhost = "imap.gmail.com";
Session session;
Store store;
if (props == null){
//Log.e(DEBUG, "Properties are null !!");
}else{
props.setProperty("mail.store.protocol", "imaps");
/*Log.d(TAG, "Transport: "+props.getProperty("mail.transport.protocol"));
Log.d(TAG, "Store: "+props.getProperty("mail.store.protocol"));
Log.d(TAG, "Host: "+props.getProperty("mail.imap.host"));
Log.d(TAG, "Authentication: "+props.getProperty("mail.imap.auth"));
Log.d(TAG, "Port: "+props.getProperty("mail.imap.port"));*/
}
try {
session = Session.getDefaultInstance(props, null);
store = session.getStore("imaps");
store.connect(mailhost, _user, _pass);
//Log.i(TAG, "Store: "+store.toString());
//create the folder object and open it
Folder emailFolder = store.getFolder("INBOX");
emailFolder.open(Folder.READ_ONLY);
// retrieve the messages from the folder in an array and print it
Message[] messages = emailFolder.getMessages();
String contentType = messages[messages.length-1].getContentType();
String messageContent = "";
// store attachment file name, separated by comma
String attachFiles = "";
if (contentType.contains("multipart")) {
// content may contain attachments
Multipart multiPart = (Multipart) messages[messages.length-1].getContent();
int numberOfParts = multiPart.getCount();
for (int partCount = 0; partCount < numberOfParts; partCount++) {
MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(partCount);
if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
InputStream is = part.getInputStream();
byte[] buf = new byte[1024];
Arrays.fill(buf, (byte) 0);
int bytesRead;
bytesRead =is.read(buf);
byte[] nBuf = new byte[bytesRead];
for (int i = 0; i < bytesRead; i++) {
nBuf[i] = buf[i];
}
//byte[bytesRead] bytearr = buf;
//fos.write(buf, 0, bytesRead);
if ( bytesRead > 0 ) {
String sBuf = new String(nBuf,"UTF-8");
int test = 0;
return ( sBuf );
}
// this part is attachment
String fileName = part.getFileName();
attachFiles += fileName + ", ";
//part.saveFile(saveDirectory + File.separator + fileName);
} else {
// this part may be the message content
messageContent = part.getContent().toString();
}
}
if (attachFiles.length() > 1) {
attachFiles = attachFiles.substring(0, attachFiles.length() - 2);
}
} else if (contentType.contains("text/plain")
|| contentType.contains("text/html")) {
Object content = messages[0].getContent();
if (content != null) {
messageContent = content.toString();
}
}
return( messages[0].getSubject());
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
String nullstring ="";
return( nullstring);
}
public boolean send() throws Exception {
Properties props = _setProperties();
if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) {
Session session = Session.getInstance(props, this);
Log.e("MailApp", "session started");
final MimeMessage msg = new MimeMessage(session);
Log.e("MailApp", "mime");
msg.setFrom(new InternetAddress(_from));
Log.e("MailApp", "setfrom");
InternetAddress[] addressTo = new InternetAddress[_to.length];
for (int i = 0; i < _to.length; i++) {
addressTo[i] = new InternetAddress(_to[i]);
}
msg.setRecipients(MimeMessage.RecipientType.TO, addressTo);
msg.setSubject(_subject);
msg.setSentDate(new Date());
// setup message body
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText(_body);
_multipart.addBodyPart(messageBodyPart);
// Put parts in message
msg.setContent(_multipart);
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
try {
Transport.send(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
return true;
} else {
return false;
}
}
public void addAttachment(String filename) throws Exception {
BodyPart messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
_multipart.addBodyPart(messageBodyPart);
}
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(_user, _pass);
}
private Properties _setProperties() {
Properties props = new Properties();
props.put("mail.smtp.host", _host);
if(_debuggable) {
props.put("mail.debug", "true");
}
if(_auth) {
props.put("mail.smtp.auth", "true");
}
props.put("mail.smtp.port", _port);
props.put("mail.smtp.socketFactory.port", _sport);
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
return props;
}
// the getters and setters
public String getBody() {
return _body;
}
public void setBody(String _body) {
this._body = _body;
}
public void setFrom( String _from ){
this._from = _from;
}
public void setSubject( String _subject ){
this._subject = _subject;
}
public void setTo( String[] _to ){
this._to = _to;
}
// more of the getters and setters …..
} }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.