Хорошо, ребята, я нашел ответы, я не знаю, правильно ли я работаю.
Здесь мой код:
private static final Pattern imgRegExp = Pattern.compile( "<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>" );
public send(email) throws Exception{
Map<String, String> inlineImage = new HashMap<String, String>();
String body = email.getBody();
final Matcher matcher = imgRegExp.matcher( body );
int i = 0;
while ( matcher.find() ) {
String src = matcher.group();
if ( body.indexOf( src ) != -1 ) {
String srcToken = "src=\"";
int x = src.indexOf( srcToken );
int y = src.indexOf( "\"", x + srcToken.length() );
String srcText = src.substring( x + srcToken.length(), y );
String cid = "image" + i;
String newSrc = src.replace( srcText, "cid:" + cid );
inlineImage.put( cid, srcText.split( "," )[1] );
body = body.replace( src, newSrc );
i++;
}
}
Transport transport = mailSession.getTransport();
MimeMessage message = new MimeMessage( mailSession );
message.setSubject( email.getObjet() );
message.setSender( new InternetAddress( email.getSender() ) );
message.setFrom( new InternetAddress( email.getFrom()) );
BodyPart bp = new MimeBodyPart();
bp.setContent( body, "text/html" );
MimeMultipart mmp = new MimeMultipart();
mmp.addBodyPart( bp );
Iterator<Entry<String, String>> it = inlineImage.entrySet().iterator();
while ( it.hasNext() ) {
Entry<String, String> pairs = it.next();
PreencodedMimeBodyPart pmp = new PreencodedMimeBodyPart( "base64" );
pmp.setHeader( "Content-ID", "<" + pairs.getKey() + ">" );
pmp.setDisposition( MimeBodyPart.INLINE );
pmp.setText( pairs.getValue() );
mmp.addBodyPart( pmp );
}
message.setContent( mmp );
message.addRecipient( Message.RecipientType.TO, new InternetAddress( email.getTo() ) );
transport.connect();
transport.sendMessage( message, message.getAllRecipients() );
transport.close();
}
Спасибо за помощь меня улучшить, если нужно улучшить:)
Private Sub IsFileOpen(ByVal file As FileInfo)
Dim stream As FileStream = Nothing
Try
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None)
stream.Close()
Catch ex As Exception
If TypeOf ex Is IOException AndAlso IsFileLocked(ex) Then
' do something here, either close the file if you have a handle, show a msgbox, retry or as a last resort terminate the process - which could cause corruption and lose data
End If
End Try
End Sub
Private Shared Function IsFileLocked(exception As Exception) As Boolean
Dim errorCode As Integer = Marshal.GetHRForException(exception) And ((1 << 16) - 1)
Return errorCode = 32 OrElse errorCode = 33
End Function
Нет смысла использовать функцию «использовать файл для проверки», так как вам все равно нужно попытаться поймать, чтобы обработать случай, когда файл не открывается. Открытие файла может завершиться неудачей по многим причинам, кроме того, что он уже открыт.
Также использование функции для проверки не является гарантией успеха. «Проверка использования файла» может возвращать false только для того, чтобы файл был открыт с ошибкой с уже открывшейся ошибкой файла, потому что время между проверкой и попыткой открыть файл было открыто кем-то другим.
Похоже, что два предложения из этого форума MSDN, посвященного публикации , связаны с попыткой открыть файл.
Первый похож на то, что вы делаете сейчас, и второй включает использование функции Windows API (CreateFile) и проверка недопустимого дескриптора, означающего, что файл используется. В обоих случаях они полагаются на условие ошибки, чтобы определить, открыт ли файл или нет. Короче говоря, на мой взгляд, метод, который вы используете, верен, поскольку нет свойства System.IO.File.IsOpen.
Imports System.Runtime.InteropServices;
для исправления маркера не объявляется i>. Совет:Marshal
будет иметь синюю подсветку, наведите указатель мыши на это, и он даст вам подсказку о том, что не так! – Jeremy Thompson 3 July 2015 в 01:23Value of type 'String' cannot be converted to 'System.IO.FileInfo'.
– Cary Bondoc 3 July 2015 в 02:11Call IsFileOpen(new FileInfo(filePath))
– Jeremy Thompson 3 July 2015 в 02:38