gpt4 book ai didi

java - 使用 MimeMultipart、Java 8 发送包含多个嵌入图像的邮件

转载 作者:太空宇宙 更新时间:2023-11-04 09:14:03 25 4
gpt4 key购买 nike

我正在尝试发送正文中嵌入多个图像的邮件....我正在红色这个Sending mail along with embedded image using javamail ,但不幸的是我找不到作品

创建消息

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");

现在我创建多部分

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;
}

现在是向多部分添加图像的方法

  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();
}
}
});

}

所有图像都像附件一样发送,但不插入 HTML

现在,我将使用成功的 Telnet 方法来比较内容消息...

左侧使用 Telnet 直接方法,右侧是我的 Java 代码。

将初始代码段与 HTML 正文内容进行比较 enter image description here比较 HTML 正文内容的最终片段 enter image description here左侧部分图像采用Telnet方式分离 enter image description here最后部分使用Telnet方法! enter image description here

带有附加图像的电子邮件 enter image description here

如何修复我的代码以显示插入到 HTML 代码中的图像并且图像也会显示出来?

最佳答案

我扩展了java邮件类来添加和读取附件, 您必须根据您的目的修改代码,但它会在电子邮件中附加一个文件。我确实认为您不能附加原始二进制图像,必须在发送之前将其转换为 Base64 内联编码。并在收到时进行解码。

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 …..

}

关于java - 使用 MimeMultipart、Java 8 发送包含多个嵌入图像的邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59295561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com